From 3dad8f3f639fca852b8876d43201e9c4d073a4e2 Mon Sep 17 00:00:00 2001 From: Jeffrey Carl Faden Date: Mon, 2 Jun 2014 12:24:29 -0700 Subject: [PATCH] Undoing accidental branch replacement --- .env.example | 5 + Gemfile | 15 +- Gemfile.lock | 28 +- README.md | 4 +- Rakefile | 2 +- app/assets/images/border.png | Bin 9138 -> 0 bytes app/assets/javascripts/addresses.js | 1 - .../javascripts/rails_admin/custom/ui.js | 2 - app/assets/stylesheets/addresses.css.scss | 209 ------- app/assets/stylesheets/application.css | 2 +- app/assets/stylesheets/normalize.css | 527 ------------------ app/assets/stylesheets/welcome.css.scss.erb | 4 - app/controllers/invitations_controller.rb | 31 +- app/controllers/welcome_controller.rb | 7 +- app/views/invitations/new.html.haml | 60 -- app/views/invitations/thanks.html.haml | 1 - app/views/layouts/addresses.html.haml | 18 - .../rails_admin/main/mail_guests.html.haml | 2 +- app/views/welcome/index.html.haml | 527 +++++++++++++++++- config.ru | 2 +- config/application.rb | 8 +- config/database.yml | 13 +- config/deploy.rb | 57 ++ config/environment.rb | 4 +- config/environments/development.rb | 2 +- config/environments/production.rb | 10 +- config/environments/staging.rb | 70 +++ config/environments/test.rb | 2 +- config/initializers/rails_admin.rb | 159 ++++-- config/initializers/secret_token.rb | 2 +- config/initializers/session_store.rb | 4 +- config/routes.rb | 7 +- ...0056_add_no_paper_invite_to_invitations.rb | 5 - db/schema.rb | 233 ++++++-- db/seeds.rb | 4 +- lib/rails_admin_mail_guests.rb | 7 +- .../apple-touch-icon-114x114-precomposed.png | Bin 0 -> 6266 bytes public/apple-touch-icon-57x57-precomposed.png | Bin 0 -> 3078 bytes public/apple-touch-icon-72x72-precomposed.png | Bin 0 -> 3918 bytes public/apple-touch-icon-precomposed.png | Bin 0 -> 3078 bytes public/apple-touch-icon.png | Bin 0 -> 3078 bytes public/favicon.ico | Bin 0 -> 940 bytes public/humans.txt | 12 +- 43 files changed, 1046 insertions(+), 1000 deletions(-) delete mode 100644 app/assets/images/border.png delete mode 100644 app/assets/javascripts/addresses.js delete mode 100644 app/assets/javascripts/rails_admin/custom/ui.js delete mode 100644 app/assets/stylesheets/addresses.css.scss delete mode 100644 app/assets/stylesheets/normalize.css delete mode 100644 app/views/invitations/new.html.haml delete mode 100644 app/views/invitations/thanks.html.haml delete mode 100644 app/views/layouts/addresses.html.haml create mode 100644 config/deploy.rb create mode 100644 config/environments/staging.rb delete mode 100644 db/migrate/20140413050056_add_no_paper_invite_to_invitations.rb create mode 100644 public/apple-touch-icon-114x114-precomposed.png create mode 100644 public/apple-touch-icon-57x57-precomposed.png create mode 100644 public/apple-touch-icon-72x72-precomposed.png create mode 100644 public/apple-touch-icon-precomposed.png create mode 100644 public/apple-touch-icon.png create mode 100644 public/favicon.ico diff --git a/.env.example b/.env.example index efedb72..f70dd6a 100644 --- a/.env.example +++ b/.env.example @@ -1,3 +1,8 @@ SECRET_TOKEN= MANDRILL_USER_NAME= MANDRILL_APIKEY= +DATABASE_NAME= +DATABASE_USERNAME= +DATABASE_PASSWORD= +DEPLOY_SERVER= +DEPLOY_USERNAME= diff --git a/Gemfile b/Gemfile index ce1756d..7856442 100644 --- a/Gemfile +++ b/Gemfile @@ -8,17 +8,15 @@ gem 'rails', '4.1.0' # gem 'rails', :git => 'git://github.com/rails/rails.git' gem 'haml' -#gem 'feedjira' +gem 'feedjira' gem 'rails_admin' gem 'rabl' gem 'dotenv-rails', :groups => [:development, :test, :production] -gem 'ckeditor' # Gems used only for assets and not required # in production environments by default. gem 'sass-rails' gem 'compass-rails' -gem 'autoprefixer-rails' # See https://github.com/sstephenson/execjs#readme for more supported runtimes # gem 'therubyracer', :platforms => :ruby @@ -26,19 +24,26 @@ gem 'autoprefixer-rails' gem 'uglifier', '>= 1.0.3' group :development do - gem 'mysql2' gem 'debugger' end +group :development, :production do + gem 'mysql2' +end + group :test, :development do gem 'sqlite3' end -group :production do +group :staging do gem 'rails_12factor' gem 'pg' end +group :production do + gem 'therubyracer', :platforms => :ruby +end + gem 'jquery-rails' # To use ActiveModel has_secure_password diff --git a/Gemfile.lock b/Gemfile.lock index acd9604..d8a2ccf 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -28,8 +28,6 @@ GEM thread_safe (~> 0.1) tzinfo (~> 1.1) arel (5.0.1.20140414130214) - autoprefixer-rails (1.1.20140410) - execjs bcrypt-ruby (3.1.2) builder (3.2.2) capistrano (2.15.4) @@ -39,9 +37,6 @@ GEM net-ssh (>= 2.0.14) net-ssh-gateway (>= 1.1.0) chunky_png (1.3.0) - ckeditor (4.0.11) - mime-types - orm_adapter (~> 0.5.0) coffee-rails (4.0.1) coffee-script (>= 2.2.0) railties (>= 4.0.0, < 5.0) @@ -50,12 +45,14 @@ GEM execjs coffee-script-source (1.7.0) columnize (0.3.6) - compass (0.12.5) + compass (0.12.6) chunky_png (~> 1.2) fssm (>= 0.2.7) sass (~> 3.2.19) - compass-rails (1.1.6) + compass-rails (1.1.7) compass (>= 0.12.2) + sprockets (<= 2.11.0) + curb (0.8.5) debugger (1.5.0) columnize (>= 0.3.1) debugger-linecache (~> 1.2.0) @@ -74,6 +71,10 @@ GEM erubis (2.7.0) excon (0.16.10) execjs (2.0.2) + feedjira (1.2.0) + curb (~> 0.8.1) + loofah (~> 1.2.1) + sax-machine (~> 0.2.1) font-awesome-rails (4.0.3.1) railties (>= 3.2, < 5.0) fssm (0.2.10) @@ -91,6 +92,9 @@ GEM kaminari (0.15.1) actionpack (>= 3.0.0) activesupport (>= 3.0.0) + libv8 (3.16.14.3) + loofah (1.2.1) + nokogiri (>= 1.4.4) mail (2.5.4) mime-types (~> 1.16) treetop (~> 1.4.8) @@ -158,6 +162,7 @@ GEM rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) rake (10.3.1) + ref (1.0.5) remotipart (1.2.1) safe_yaml (1.0.3) sass (3.2.19) @@ -166,6 +171,8 @@ GEM sass (~> 3.2.0) sprockets (~> 2.8, <= 2.11.0) sprockets-rails (~> 2.0) + sax-machine (0.2.1) + nokogiri (~> 1.6.0) sprockets (2.11.0) hike (~> 1.2) multi_json (~> 1.0) @@ -176,6 +183,9 @@ GEM activesupport (>= 3.0) sprockets (~> 2.8) sqlite3 (1.3.7) + therubyracer (0.12.0) + libv8 (~> 3.16.14.0) + ref thor (0.19.1) thread_safe (0.3.3) tilt (1.4.1) @@ -194,13 +204,12 @@ PLATFORMS ruby DEPENDENCIES - autoprefixer-rails capistrano - ckeditor compass-rails debugger devise dotenv-rails + feedjira haml jquery-rails mandrill-api @@ -212,4 +221,5 @@ DEPENDENCIES rails_admin sass-rails sqlite3 + therubyracer uglifier (>= 1.0.3) diff --git a/README.md b/README.md index 63b59de..a9ec569 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -adalandlily +jeffreyandanna ============== -The wedding website for Adal and Lily! \ No newline at end of file +The joint website for Jeffrey and Anna! \ No newline at end of file diff --git a/Rakefile b/Rakefile index 6d28ab9..bbbd15a 100644 --- a/Rakefile +++ b/Rakefile @@ -4,4 +4,4 @@ require File.expand_path('../config/application', __FILE__) -Adalandlily::Application.load_tasks +Jeffreyandanna::Application.load_tasks diff --git a/app/assets/images/border.png b/app/assets/images/border.png deleted file mode 100644 index 9cb57000aefe4bee2260b1ba5993462c5f1c7536..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9138 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 J@Qdrs{{l0z09gP4 diff --git a/app/assets/javascripts/addresses.js b/app/assets/javascripts/addresses.js deleted file mode 100644 index 42d1d54..0000000 --- a/app/assets/javascripts/addresses.js +++ /dev/null @@ -1 +0,0 @@ -//= require jquery \ No newline at end of file diff --git a/app/assets/javascripts/rails_admin/custom/ui.js b/app/assets/javascripts/rails_admin/custom/ui.js deleted file mode 100644 index 5b5a948..0000000 --- a/app/assets/javascripts/rails_admin/custom/ui.js +++ /dev/null @@ -1,2 +0,0 @@ -//= require ckeditor/override -//= require ckeditor/init \ No newline at end of file diff --git a/app/assets/stylesheets/addresses.css.scss b/app/assets/stylesheets/addresses.css.scss deleted file mode 100644 index 00eb92b..0000000 --- a/app/assets/stylesheets/addresses.css.scss +++ /dev/null @@ -1,209 +0,0 @@ -@import 'normalize'; -@import 'compass/css3/appearance'; - -$text-color: #333; - -* { - box-sizing: border-box; -} - -input, textarea { - font-family: serif; -} - -html, input[type=submit] { - font-family: 'Cinzel', serif; - font-size: 22px; -} - -html { - background: #eee; - background: linear-gradient(to bottom, #fff, #eee); - background-attachment: fixed; - height: 100%; - color: $text-color; -} - -$body-width: 950px; -body { - margin: 50px auto; - max-width: $body-width; - padding: 100px 100px 0; - position: relative; - &:before { - background: image-url('border.png'); - top: 0; - content: ''; - display: block; - height: image-height('border.png'); - left: 50px; - position: absolute; - width: image-width('border.png'); - z-index: -1; - } -} - -h1 { - text-align: center; -} - -p { - text-align: center; -} - -.intro { - font-family: 'Lobster Two', cursive; - font-size: 1.5em; - font-style: italic; - line-height: 1.2; - margin-bottom: 2em; - .name { - font-size: 2.5em; - line-height: 1.1; - .initial { - font-size: 1.333em; - } - } - .date { - font-size: 1.222em; - line-height: 1.3; - .initial { - font-size: 1.181em; - } - } - .instructions { - font-size: .777em; - line-height: 1; - } -} - -.flash { - font-size: .9em; - padding: 0 3em; -} - -.new_invitation { - margin-top: 2em; -} - -.field_with_errors { - display: inline; -} - -.form-row { - display: table; - margin: 1em auto; - padding-right: $body-width / 5.5; - label { - display: inline-block; - margin-right: 1em; - text-align: right; - width: $body-width / 5.5; - } -} -.form-row--checkbox, .form-row--submit { - text-align: center; - padding-right: 0; -} -.form-row--checkbox { - label { - margin: 0 0 0 .5em; - width: auto; - } -} - -.form-notes { - font-size: .75em; - margin: .5em 0 0 220px; - width: 300px; -} - -.form-control { - border: 1px solid $text-color; - width: 300px; -} - -input[type=submit] { - @include appearance(none); - outline: none; -} - -.thanks { - text-align: center; -} - -@media screen and (max-width: 910px) { - html { - font-size: 18px; - } - .form-row { - padding-right: 140px; - label { - width: 140px; - } - } - .form-row--checkbox, .form-row--submit { - padding-right: 0; - } - .form-row--checkbox { - label { - width: auto; - } - } -} - -@media screen and (max-width: 800px) { - .form-row label, form-control { - width: auto; - } - .form-row { - padding-right: 0; - &, label { - text-align: center; - } - label { - display: block; - margin: 0; - } - } - .form-row--checkbox { - label { - display: inline; - margin-left: .5em; - } - } -} - -@media screen and (max-width: 700px) { - html { - font-size: 16px; - } - body { - margin: 0; - padding: 50px; - &:before { - background-size: contain; - height: image-height('border.png') / 2; - left: 10px; - width: image-width('border.png') / 2; - top: 10px; - } - } - p { - padding: 0; - } - .intro { - font-size: 18px; - margin-top: 0; - .name { - font-size: 1.8em; - } - } - .form-control, .form-notes { - width: 200px; - } - .form-notes { - margin-left: auto; - margin-right: auto; - } -} \ No newline at end of file diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index b799adc..dbd3fd8 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -10,4 +10,4 @@ * *= require_self *= require 'welcome' - */ \ No newline at end of file + */ diff --git a/app/assets/stylesheets/normalize.css b/app/assets/stylesheets/normalize.css deleted file mode 100644 index 42e24d6..0000000 --- a/app/assets/stylesheets/normalize.css +++ /dev/null @@ -1,527 +0,0 @@ -/*! normalize.css v1.1.3 | MIT License | git.io/normalize */ - -/* ========================================================================== - HTML5 display definitions - ========================================================================== */ - -/** - * Correct `block` display not defined in IE 6/7/8/9 and Firefox 3. - */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -main, -nav, -section, -summary { - display: block; -} - -/** - * Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3. - */ - -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} - -/** - * Prevent modern browsers from displaying `audio` without controls. - * Remove excess height in iOS 5 devices. - */ - -audio:not([controls]) { - display: none; - height: 0; -} - -/** - * Address styling not present in IE 7/8/9, Firefox 3, and Safari 4. - * Known issue: no IE 6 support. - */ - -[hidden] { - display: none; -} - -/* ========================================================================== - Base - ========================================================================== */ - -/** - * 1. Correct text resizing oddly in IE 6/7 when body `font-size` is set using - * `em` units. - * 2. Prevent iOS text size adjust after orientation change, without disabling - * user zoom. - */ - -html { - font-size: 100%; /* 1 */ - -ms-text-size-adjust: 100%; /* 2 */ - -webkit-text-size-adjust: 100%; /* 2 */ -} - -/** - * Address `font-family` inconsistency between `textarea` and other form - * elements. - */ - -html, -button, -input, -select, -textarea { - font-family: sans-serif; -} - -/** - * Address margins handled incorrectly in IE 6/7. - */ - -body { - margin: 0; -} - -/* ========================================================================== - Links - ========================================================================== */ - -/** - * Address `outline` inconsistency between Chrome and other browsers. - */ - -a:focus { - outline: thin dotted; -} - -/** - * Improve readability when focused and also mouse hovered in all browsers. - */ - -a:active, -a:hover { - outline: 0; -} - -/* ========================================================================== - Typography - ========================================================================== */ - -/** - * Address font sizes and margins set differently in IE 6/7. - * Address font sizes within `section` and `article` in Firefox 4+, Safari 5, - * and Chrome. - */ - -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -h2 { - font-size: 1.5em; - margin: 0.83em 0; -} - -h3 { - font-size: 1.17em; - margin: 1em 0; -} - -h4 { - font-size: 1em; - margin: 1.33em 0; -} - -h5 { - font-size: 0.83em; - margin: 1.67em 0; -} - -h6 { - font-size: 0.67em; - margin: 2.33em 0; -} - -/** - * Address styling not present in IE 7/8/9, Safari 5, and Chrome. - */ - -abbr[title] { - border-bottom: 1px dotted; -} - -/** - * Address style set to `bolder` in Firefox 3+, Safari 4/5, and Chrome. - */ - -b, -strong { - font-weight: bold; -} - -blockquote { - margin: 1em 40px; -} - -/** - * Address styling not present in Safari 5 and Chrome. - */ - -dfn { - font-style: italic; -} - -/** - * Address differences between Firefox and other browsers. - * Known issue: no IE 6/7 normalization. - */ - -hr { - -moz-box-sizing: content-box; - box-sizing: content-box; - height: 0; -} - -/** - * Address styling not present in IE 6/7/8/9. - */ - -mark { - background: #ff0; - color: #000; -} - -/** - * Address margins set differently in IE 6/7. - */ - -p, -pre { - margin: 1em 0; -} - -/** - * Correct font family set oddly in IE 6, Safari 4/5, and Chrome. - */ - -code, -kbd, -pre, -samp { - font-family: monospace, serif; - _font-family: 'courier new', monospace; - font-size: 1em; -} - -/** - * Improve readability of pre-formatted text in all browsers. - */ - -pre { - white-space: pre; - white-space: pre-wrap; - word-wrap: break-word; -} - -/** - * Address CSS quotes not supported in IE 6/7. - */ - -q { - quotes: none; -} - -/** - * Address `quotes` property not supported in Safari 4. - */ - -q:before, -q:after { - content: ''; - content: none; -} - -/** - * Address inconsistent and variable font size in all browsers. - */ - -small { - font-size: 80%; -} - -/** - * Prevent `sub` and `sup` affecting `line-height` in all browsers. - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -/* ========================================================================== - Lists - ========================================================================== */ - -/** - * Address margins set differently in IE 6/7. - */ - -dl, -menu, -ol, -ul { - margin: 1em 0; -} - -dd { - margin: 0 0 0 40px; -} - -/** - * Address paddings set differently in IE 6/7. - */ - -menu, -ol, -ul { - padding: 0 0 0 40px; -} - -/** - * Correct list images handled incorrectly in IE 7. - */ - -nav ul, -nav ol { - list-style: none; - list-style-image: none; -} - -/* ========================================================================== - Embedded content - ========================================================================== */ - -/** - * 1. Remove border when inside `a` element in IE 6/7/8/9 and Firefox 3. - * 2. Improve image quality when scaled in IE 7. - */ - -img { - border: 0; /* 1 */ - -ms-interpolation-mode: bicubic; /* 2 */ -} - -/** - * Correct overflow displayed oddly in IE 9. - */ - -svg:not(:root) { - overflow: hidden; -} - -/* ========================================================================== - Figures - ========================================================================== */ - -/** - * Address margin not present in IE 6/7/8/9, Safari 5, and Opera 11. - */ - -figure { - margin: 0; -} - -/* ========================================================================== - Forms - ========================================================================== */ - -/** - * Correct margin displayed oddly in IE 6/7. - */ - -form { - margin: 0; -} - -/** - * Define consistent border, margin, and padding. - */ - -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} - -/** - * 1. Correct color not being inherited in IE 6/7/8/9. - * 2. Correct text not wrapping in Firefox 3. - * 3. Correct alignment displayed oddly in IE 6/7. - */ - -legend { - border: 0; /* 1 */ - padding: 0; - white-space: normal; /* 2 */ - *margin-left: -7px; /* 3 */ -} - -/** - * 1. Correct font size not being inherited in all browsers. - * 2. Address margins set differently in IE 6/7, Firefox 3+, Safari 5, - * and Chrome. - * 3. Improve appearance and consistency in all browsers. - */ - -button, -input, -select, -textarea { - font-size: 100%; /* 1 */ - margin: 0; /* 2 */ - vertical-align: baseline; /* 3 */ - *vertical-align: middle; /* 3 */ -} - -/** - * Address Firefox 3+ setting `line-height` on `input` using `!important` in - * the UA stylesheet. - */ - -button, -input { - line-height: normal; -} - -/** - * Address inconsistent `text-transform` inheritance for `button` and `select`. - * All other form control elements do not inherit `text-transform` values. - * Correct `button` style inheritance in Chrome, Safari 5+, and IE 6+. - * Correct `select` style inheritance in Firefox 4+ and Opera. - */ - -button, -select { - text-transform: none; -} - -/** - * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` - * and `video` controls. - * 2. Correct inability to style clickable `input` types in iOS. - * 3. Improve usability and consistency of cursor style between image-type - * `input` and others. - * 4. Remove inner spacing in IE 7 without affecting normal text inputs. - * Known issue: inner spacing remains in IE 6. - */ - -button, -html input[type="button"], /* 1 */ -input[type="reset"], -input[type="submit"] { - -webkit-appearance: button; /* 2 */ - cursor: pointer; /* 3 */ - *overflow: visible; /* 4 */ -} - -/** - * Re-set default cursor for disabled elements. - */ - -button[disabled], -html input[disabled] { - cursor: default; -} - -/** - * 1. Address box sizing set to content-box in IE 8/9. - * 2. Remove excess padding in IE 8/9. - * 3. Remove excess padding in IE 7. - * Known issue: excess padding remains in IE 6. - */ - -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ - *height: 13px; /* 3 */ - *width: 13px; /* 3 */ -} - -/** - * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. - * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome - * (include `-moz` to future-proof). - */ - -input[type="search"] { - -webkit-appearance: textfield; /* 1 */ - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; /* 2 */ - box-sizing: content-box; -} - -/** - * Remove inner padding and search cancel button in Safari 5 and Chrome - * on OS X. - */ - -input[type="search"]::-webkit-search-cancel-button, -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * Remove inner padding and border in Firefox 3+. - */ - -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} - -/** - * 1. Remove default vertical scrollbar in IE 6/7/8/9. - * 2. Improve readability and alignment in all browsers. - */ - -textarea { - overflow: auto; /* 1 */ - vertical-align: top; /* 2 */ -} - -/* ========================================================================== - Tables - ========================================================================== */ - -/** - * Remove most spacing between table cells. - */ - -table { - border-collapse: collapse; - border-spacing: 0; -} diff --git a/app/assets/stylesheets/welcome.css.scss.erb b/app/assets/stylesheets/welcome.css.scss.erb index ba1c012..358254f 100644 --- a/app/assets/stylesheets/welcome.css.scss.erb +++ b/app/assets/stylesheets/welcome.css.scss.erb @@ -2,10 +2,6 @@ // They will automatically be included in application.css. // You can use Sass (SCSS) here: http://sass-lang.com/ -//= depend_on_asset "custom-fontawesome-webfont.eot" -//= depend_on_asset "custom-fontawesome-webfont.woff" -//= depend_on_asset "custom-fontawesome-webfont.ttf" - @import "compass/css3/box-sizing"; @import "compass/css3/box-shadow"; @import "compass/css3/border-radius"; diff --git a/app/controllers/invitations_controller.rb b/app/controllers/invitations_controller.rb index 6a180c4..f0a8c90 100644 --- a/app/controllers/invitations_controller.rb +++ b/app/controllers/invitations_controller.rb @@ -1,7 +1,7 @@ class InvitationsController < ApplicationController before_filter :find_rsvp, :only => %w{edit update} before_filter :authenticate_user!, :only => 'index' - layout false, except: %w{new create} + layout false def index @invitations = Invitation.all @@ -49,35 +49,6 @@ def update end end - def new - @invitation = Invitation.new - render layout: 'addresses' - end - - def create - permitted_params = params[:invitation].permit(:address, :email, :notes) - @invitation = - (params[:invitation][:email].present? ? Invitation.where(['lower(email) = ?', params[:invitation][:email].downcase]).first : nil) || - Invitation.new(permitted_params) - unless @invitation.persisted? - guests = params[:name].split(/and|,|&/) - guests.map! do |guest| - Guest.new(:name => guest.strip) - end - @invitation.guests = guests - end - - respond_to do |format| - if (@invitation.persisted? && @invitation.update_attributes(permitted_params)) || (@invitation.new_record? && @invitation.save) - flash[:notice] = 'Your address was submitted. Thank you!' - format.html { render action: 'thanks', layout: 'addresses' } - else - flash[:alert] = 'Something went wrong with your submission. Please check for errors, or contact Adal or Lily!' - format.html { render action: 'new', layout: 'addresses' } - end - end - end - private def find_rsvp if params[:invitation] && params[:invitation][:rsvp] diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb index 37861f7..15377e5 100644 --- a/app/controllers/welcome_controller.rb +++ b/app/controllers/welcome_controller.rb @@ -1,6 +1,7 @@ class WelcomeController < ApplicationController def index - #@remaining = (Date.new(2013,8,17) - Date.today).to_i + @remaining = (Date.new(2013,8,17) - Date.today).to_i + @feed = Feedjira::Feed.fetch_and_parse("http://jeffreyandanna.us/blog/feed/") if session[:rsvp] @invitation = Invitation.find_by_rsvp(session[:rsvp]) @invitation = @invitation.present? ? @invitation : Invitation.new @@ -8,6 +9,6 @@ def index @invitation = Invitation.new end - render :layout => 'addresses' + render :layout => false end -end +end \ No newline at end of file diff --git a/app/views/invitations/new.html.haml b/app/views/invitations/new.html.haml deleted file mode 100644 index cc34733..0000000 --- a/app/views/invitations/new.html.haml +++ /dev/null @@ -1,60 +0,0 @@ -%p.intro - %span.name - %span.initial<> L - ily - = ' ' - %span.initial<> F - aden - and - %br - %span.name - %span.initial<> A - dal - = ' ' - %span.initial<> H - ernandez - %br - Announce Their Commitment to a - %br - %span.name - %span.initial<> M - arital - = ' ' - %span.initial<> U - nion - %br - Ritual, Ceremony and Reception to be held - %br - In New York City on - %br - %span.date - %span.initial<> S - aturday, - = ' ' - %span.initial<> M - ay 23, 2015 - %br - %span.instructions Please submit your address and - %br - %span.instructions you will receive a formal invitation by mail -= form_for @invitation do |f| - .form-row - = label_tag 'Name(s)' - = text_field_tag 'name', params[:name], class: 'form-control', required: true - .form-row - = f.label :address - = f.text_area :address, :rows => 4, class: 'form-control', required: true - .form-row - = f.label :email - = f.email_field :email, class: 'form-control' - .form-row - = f.label :notes, 'Comments' - = f.text_area :notes, :rows => 4, class: 'form-control' - .form-row.form-row--checkbox - = f.check_box :no_paper_invite - = f.label :no_paper_invite, 'Opt out of paper invitation' - .form-row.form-row--submit - = f.submit 'Submit', class: 'form-submit' - %p.flash - = flash[:notice] - = flash[:alert] \ No newline at end of file diff --git a/app/views/invitations/thanks.html.haml b/app/views/invitations/thanks.html.haml deleted file mode 100644 index 0499990..0000000 --- a/app/views/invitations/thanks.html.haml +++ /dev/null @@ -1 +0,0 @@ -.thanks= flash[:notice] \ No newline at end of file diff --git a/app/views/layouts/addresses.html.haml b/app/views/layouts/addresses.html.haml deleted file mode 100644 index c955929..0000000 --- a/app/views/layouts/addresses.html.haml +++ /dev/null @@ -1,18 +0,0 @@ -!!! -/[if lt IE 7] -/[if IE 7] -/[if IE 8] -/ [if gt IE 8]> "X-UA-Compatible"}/ - %title Adal and Lily - %meta{content: "width=device-width, initial-scale=1", name: "viewport"}/ - = stylesheet_link_tag '//fonts.googleapis.com/css?family=Cinzel:400,700|Lobster+Two:400italic' - = stylesheet_link_tag 'addresses' - = javascript_include_tag "libs/modernizr-2.6.2.min" - %body - = yield - = javascript_include_tag 'addresses' \ No newline at end of file diff --git a/app/views/rails_admin/main/mail_guests.html.haml b/app/views/rails_admin/main/mail_guests.html.haml index 80165c1..a25652a 100644 --- a/app/views/rails_admin/main/mail_guests.html.haml +++ b/app/views/rails_admin/main/mail_guests.html.haml @@ -11,7 +11,7 @@ .control-group.text-type = label_tag 'mail[body]', 'Body', class: 'control-label' .controls - = cktext_area 'mail', 'body', :value => params[:mail].nil? ? '' : params[:mail][:body], :cols => 78, :rows => 15 + = text_area_tag 'mail[body]', params[:mail].nil? ? '' : params[:mail][:body], 'data-richtext' => false, :cols => 78, :rows => 15 %p.help-block You can use *|NAME|*, *|ADDRESS|*, *|RSVP|*, and *|EMAIL|*. %input{:type => :hidden, :name => 'return_to', :value => (params[:return_to].presence || request.referer)} .form-actions diff --git a/app/views/welcome/index.html.haml b/app/views/welcome/index.html.haml index 396466f..0dce88f 100755 --- a/app/views/welcome/index.html.haml +++ b/app/views/welcome/index.html.haml @@ -1 +1,526 @@ -%h1 Coming Soon \ No newline at end of file +!!! + + + + +%head + %meta{:charset => "utf-8"} + %meta{:content => "IE=edge,chrome=1", "http-equiv" => "X-UA-Compatible"} + %title Jeffrey and Anna + %meta{:content => "Jeffrey and Anna's Website!", :name => "description"} + %meta{:content => "width=device-width, initial-scale=1, user-scalable=no", :name => "viewport"} + %meta{:content => '/objects/backup/standing-home.png', :property => 'og:image'} + = csrf_meta_tags + %link{:rel => "alternate", :type => "application/rss+xml", :title => "Jeffrey and Anna » Feed", :href => "/blog/feed/"} + = stylesheet_link_tag "http://fonts.googleapis.com/css?family=Imprima|Carter+One" + = stylesheet_link_tag "application" + = javascript_include_tag "libs/modernizr-2.6.2.min" +%body + %header.page_header + .container + %h1 + %a#welcome_link{:href => "#welcome"} + %span.jeffrey + J + %span.not_first_letter> effrey + %span.and and + %span.ampersand & + %span.anna + A + %span.not_first_letter> nna + %nav + %ul + %li + %a#about_us_link{:href => "#about_us"} + %i.icon-user + %span.link_text About Us + %li + %a#updates_link{:href => "#updates"} + %i.icon-rss + %span.link_text Updates + %li + %a#events_link{:href => "#events"} + %i.icon-calendar + %span.link_text Events + %li + %a#rsvp_link{:href => "#rsvp"} + %i.icon-envelope-alt + %span.link_text RSVP + .main{:role => "main"} + .character_container + .anna.object.standing + .jeffrey.object.standing + .backup.object.standing + %section#welcome.main_section + %header + %h1 + %span.jeffrey Jeffrey + %span.and and + %span.anna Anna + .object_container + .window.object + .projectorscreen.object + .couch.object + .roomba.object + .xbox.object + .wii.object + .macbookpro.object + .macbookair.object + .projector.object + .ddrpads.object + %section#about_us.main_section.regular_section + %header.clearfix + .container + %h1 About Us + %nav + %ul + %li + %a.active{:href => "#our_story"} Our Story + %li + %a{:href => "#about_anna"} Anna + %li + %a{:href => "#about_jeffrey"} Jeffrey + .carousel.slide + .carousel-inner + %section#our_story.active.item + .container + %h1 Our Story + = image_tag "ziplining.jpg", :alt => "Ziplining in Vancouver", :class => "image_right", :width => 300, :height => 412 + %p It all started over sausages and beers (as all wonderful things should). Jeffrey and Anna met at Gestalt Haus while out with a mutual friend in the Mission. Initial conversation included UC Santa Cruz, where they both went to school (they never met during that time, however), as well as music — Anna had seen Jeffrey's sister's band play when they were performing around SF circa 2006. + %p Nothing after that was particularly deliberate. In an effort to go see more live shows and see more friends in the process, Anna started creating Facebook events for different shows, inviting people to come along. Jeffrey, in an effort to meet more people upon moving to SF, accepted every invite he could attend. From there, something slowly but surely clicked. Their first date was at Fly Bar in Divisidero, followed by the Tallest Man on Earth at the Independent (he's actually not that tall in real life, but he makes excellent music). + %p Jeffrey had recently moved into the city with new job prospects. He had come from his dad's place in San Rafael, where he was staying after realizing grad school in Seattle wasn't for him. In early 2009, he found a pleasant space in a not-so-pleasant neighborhood, and spent his free time exploring the city with his new Internet friends. + %p Anna moved to SF in late 2008, after living in Berkeley and Oakland the previous three years. She originally moved to the East Bay after graduating from UC Santa Cruz in 2005 and securing a job at UC Berkeley. While her first apartment in SF was in a less desirable location (with an evil landlord, to boot), her housemates were fantastic. + %p Shortly after they started dating, Anna's upstairs neighbors left the toilet running and her aforementioned crummy apartment was soon deluged; she and her housemates were left temporarily homeless and Anna was scheduled to stay with her parents for the time being. One evening, Anna was about to head to her parents' house, but her car was stuck behind another in her shared garage. She had the keys, but she had no idea how to drive a manual transmission Saab. Taking a page out of the Matrix, Jeffrey looked up instructions on how to drive a stick on his iPhone and downloaded them into his brain. After a stall or two, the car was moved and Anna could go along her way. + %p + Jeffrey helped Anna move into a nice new place with her housemates on the other side of the Mission, right next to SF General Hospital. This came in handy when Jeffrey smashed his shoulder into Market Street after getting hit by a car on his bike. Anna rushed to his rescue and brought him to bed (across the street). Anna's apartment was great for other, less + painful reasons — there was a gorgeous cat, awesome landlords, and plenty of bright space to hold a series of puzzle parties, which are just what they sound like — parties where friends came over and solved #{link_to "one ridiculously challenging puzzle", "https://www.facebook.com/photo.php?v=727747356368", :target => "_blank"}. + = image_tag "versailles.jpg", :alt => "Visiting Versailles", :class => "image_left", :width => 300, :height => 435 + %p They traveled Europe in late 2010 — London, Paris, the Cinque Terre, Florence, Rome, Berlin, Amsterdam — all within two-and-a-half weeks. Needless to say, it was spectacular. You can read all about it in the #{link_to "Updates section", "#updates"}! + %p + Jeffrey moved in with Anna in 2011. The rest of the year was filled with travels — to Austin for SxSW, New Jersey to see Anna's family, and New York to see Jeffrey's. After a year of new sights and sounds, they finished the year off on Treasure Island, surrounded by friends and a beautiful panorama of the city where they had started their life. As the New Year's fireworks shot into the sky, Jeffrey took out the engagement ring, promptly dropped it, fumbled around in the dark, and + presented it to Anna. + %p In early 2012, they moved into an apartment in Hayes Valley with a beautiful overlook of their city. They adopted Backup, an orange, noisy, lovable menace. Since 2013 they've been settling into their newly married life after having been married in their city among family and friends! + %section#about_anna.item + .container + %h1 Anna + = image_tag "anna.jpg", :alt => "Anna in the Cinque Terre", :class => "image_left", :width => 400, :height => 277 + %p + Anna was born in New Jersey, but her family moved to Northern California before she could truly call herself a "Jersey girl." The subsequent coming-of-age years in Sebastopol revolved around volleyball, Gravenstein apples and a high school located next to a dairy farm. + %p + Thus far, her adult life has been a love letter to the University of California: she spent four awesome years in the majestic redwood forest of UC Santa Cruz, and she has worked at UC Berkeley ever since she graduated. She started working in student affairs before transitioning into web editing and communications for a less student-centric department; currently, she gets to work on high-profile university websites, plus she gets to use the word "Specialist" in her payroll title! + %p + After entering the post-college world, Anna discovered a love for independent music, which later developed into a specific focus on Bay Area-based bands and artists. Her involvement with several local music blogs outside of work led to a part-time gig with #{link_to "the Bay Bridged", "http://www.thebaybridged.com/", :target => "_blank"}, a local music website and non-profit, where she assists with blog and event production. + %p + In her spare time, Anna also enjoys cooking/baking, reading, spending time with friends and family, swimming, running, and simply walking around San Francisco. + %section#about_jeffrey.item + .container + %h1 Jeffrey + = image_tag "jeffrey.jpg", :alt => "Jeffrey in Santa Cruz", :class => "image_left", :width => 400, :height => 285 + %p + Jeffrey grew up in the Bay Area. Born in Fremont and growing up in San + Rafael, he spent his youth drawing comics. In fact, he drew everything + on this site! + %p + He became enamored with the web early on — he made his first website + in 1994. He's been constantly making them ever since, and lucky for + him, it's an important tool of the trade in San Francisco. + %p + He also loves video games, especially platformers and music games. He + kept in shape throughout high school and college by playing Dance + Dance Revolution. He's now more focused on long-distance running, but + he's always got time for a trip to the arcade. + %p + From his apartment in Hayes Valley, Jeffrey bikes down Market Street + to work on the Embarcadero every day. He also bikes to #{link_to "Noisebridge", "https://noisebridge.net", :target => "_blank"}, a + local hackerspace, where he teaches a free class on frontend web + development. + .object_container + .track.object + .tree1.object + .tree2.object + .weights.object + .goggles.object + %section#updates.main_section.regular_section + %header + .container + %h1 Updates + %nav + %ul + %li + %a.active{:href => "#latest_entry"} Latest Entry + %li + %a{:href => "#archive"} Archive + .carousel.slide + .carousel-inner + %section#latest_entry.active.item + %article.container + - unless @feed.class == Fixnum + - first = @feed.entries.first + %h1= link_to first.title, first.url, :target => "_blank" + %span.blog_metadata + posted by + = first.author + on + %time.blog_date{:datetime => first.published.strftime("%Y-%m-%d")}= link_to first.published.strftime("%B %-d, %Y"), first.url, :target => "_blank" + = first.content.html_safe + %p.blog_link= link_to "Comments", first.url, :target => "_blank" + %section#archive.item + .container + %h1 Archive + %table + %tbody + - unless @feed.class == Fixnum + - @feed.entries[1..-1].each do |entry| + %tr + %td= link_to entry.title, entry.url, :target => "_blank" + %td.author= entry.author + %td= entry.published.strftime("%B %-d, %Y") + %p.blog_link= link_to "All updates on the full blog...", "/blog", :target => "_blank" + .object_container + .plane.object + .eiffel.object + .wtc.object + .colosseum.object + .zipline.object + .bike1.object + .bike2.object + .helmet1.object + .helmet2.object + .binoculars.object + %section#events.main_section.regular_section + %header + .container + %h1 Events + %nav + %ul + %li + %a.active{:href => "#festivities"} Festivities + %li + %a{:href => "#visitors_guide"} Visitor's Guide + .carousel.slide + .carousel-inner + %section#festivities.active.item + .container + %h1 Festivities + %p + All wedding-related festivities took place at + %b + = link_to "the Winery", "http://winery-sf.com/", :target => "_blank" + on Treasure Island in San Francisco, on Saturday, August 17, + 2013. + Here's the deets of what happened, in glorious future tense: + = link_to (image_tag 'winery.jpg', width: 760), 'http://winery-sf.com/', target: '_blank' + %p + Shuttles will leave from both the Kensington and Marriott (details about the hotels are on the + = link_to "Accommodations", "#accommodations" + page) around 4:30. Make sure the email in your + = link_to "RSVP", "#rsvp" + is correct so we can email you with further details as we get + them. + %p + The ceremony will start at 5:30. The reception begins + immediately afterward. + = link_to (image_tag 'sift.jpg', width: 760), 'http://www.siftcupcakes.com/', target: '_blank' + %p + Dinner will be served, buffet-style, by the Winery around 7:00. + Dessert will be provided by Sift Cupcakes. + Dietary options are available — please note on your + = link_to "RSVP", "#rsvp" + if you have any special requests! + %p + After dinner, be ready to dance and to sing! We will have + karaoke sensation DJ Purple taking requests for the rest of + the night. + = link_to (image_tag 'djpurple.jpg', width: 760), 'http://www.djpurple.com/', target: '_blank' + %p + Attire will be dressy, but not formal. Full gowns and + three-piece suits not required. + %section#visitors_guide.item + %a#our_home + .container + %h1 Visitor's Guide + %p + We've lived in San Francisco for as long as we've known each other. We + love the city and its many neighborhoods — the Tenderloin, Mission, + Potrero Hill and Hayes Valley being the sites of our many homes — and + enjoy making the most of it from the bay to the breakers. + %h2 Destinations + %p + If you're visiting San Francisco, there are the obvious sights and + sounds. + %p + Your first vacation shouldn't be complete without a walk along + the Embarcadero from the + = link_to 'Ferry Building', 'https://maps.google.com/maps?cid=7851923780944608967&q=Ferry+Building+Marketplace', :target => '_blank' + to + Fisherman's Wharf. + Along the walk, you'll come across the + Exploratorium, + a unique science museum that recently made Pier 15 its home, + Pier 39, + a maritime shopping center, and + Musée Mécanique, + Pier 45's arcade game museum. + %p + A hike up the nearby Telegraph Hill to + Coit Tower + will give you a great view of downtown. + %p + A walk along the + = link_to 'Golden Gate Bridge', 'https://maps.google.com/maps?cid=14838537888721818889&q=Golden+Gate+Bridge', :target => '_blank' + can provide spectacular views of the north + bay when it's not fogged over. Dress warmly just in case! + %p + Golden Gate Park + has a handful of beautiful sights. Walk along John F Kennedy + Drive and you'll come across the + Conservatory of Flowers + botanical garden, the + Academy of Sciences, + the + de Young Museum + and the + Japanese Tea Garden. + Further along, you can rent boats at + Stow Lake, + or spectate at the + Bison Paddock. + At the end of the road, + Ocean Beach + awaits you. + %p + Of course, there are many attractions that are off the beaten path. + Our neighborhood, + Hayes Valley, + and the adjoining + = link_to 'Mission District', 'https://maps.google.com/maps?q=mission+district&ie=UTF-8&hq=&hnear=0x808f7e3c5f803323:0x35800073de45189,Mission+District,+San+Francisco,+CA', :target => '_blank' + are full of cute shops, delicious food, and parks with a view. + Dolores Park, + in particular, is a major attraction for + the age 20-30 crowd. For a great day in the park, get food and + drinks at nearby + Rhea's Deli + or + Bi-Rite Market. + Move higher up for the best views. Just be discreet with + alcoholic beverages. There's a fantastic playground for children + as well. + %p + If you're looking to hike the many hills of our city, + Bernal Hill + and + Twin Peaks + provide short expeditions with great visual payoffs. + Mount Sutro + provides a lovely hike through a lush forest with ocean views. + %h2 Restaurants + %p + Some might think that the official food of San Francisco is + clam chowder in a bread bowl, but they'd be wrong — it's + definitely the super burrito, invented right in the Mission. + Head to + Taqueria Cancún + or + El Farolito for what + most (not all) consider to be the best of the bunch. + %p + The sandwiches at + Ike's Place + and the aforementioned + Rhea's + are so popular that it's often best to check out + their menus online and call ahead. + %p + Food trucks are essentially haute fast food, and San Francisco's + got them in spades. In addition to the + Off the Grid + pop-ups throughout the city, there's + SOMA StrEAT Food Park, + a snazzy setup which has a constantly rotating cast of + trucks, plus wine and beer. + %p + For a great dinner date, there's + Starbelly, + a new American restaurant with some fancy pizzas, among other + things. + Foreign Cinema + has exquisite dishes and an outdoor courtyard. + Lolinda + and + Destino + have delicious South American small plates — their meat + options are not to be missed. + %p + If you're really looking to splurge, there's + Gary Danko + and + Michael Mina, + two treasures with creative menus and + drinks, and + Aziza + with a Moroccan-inspired menu. Consider reserving far ahead of + time for these fancier options. + %p + Trust us: while we might not be on the east coast, our pizza is + definitely worth a try. Go to + Pauline's, + which also serves their own wine, + Little Star + for deep dish with a cornmeal crust, or + Patxi's + if the former is too crowded. + %p + Lahore Karahi + is our favorite Indian/Pakistani place, and + Mandalay + serves great Burmese food. If you've never tried Burmese food, + we think it combines the best of Chinese, Thai, and Vietnamese + cooking. + %h2 Drinks + %p + Magnolia Pub + and + Monk's Kettle + are the go-to places for great beer selections along with some + delectable pub food. + Toronado + also has a wide variety of beers, and + sausages next door at + Rosamunde + make the night complete. + %p + 83 Proof + hosts some amazing mixologists, + Hôtel Biron + is a dark, cozy wine bar, + Dr. Teeth & the Electric Mayhem + is a lively spot with an awesome fried food menu, and + Two Sisters Bar and Books' + cocktails are outstanding. + %h2 Desserts + %p + Looking for ice cream? Head to + Humphry Slocombe + for some + strange but surprisingly tasty flavors. + Bi-Rite Creamery + also has some of the best scoops around, if you can bear the + line. + Smitten's + ice cream is churned using dry ice, making it exceptionally + smooth. + %p + Cupcakes are especially hip. Try + Kara's Cupcakes, + in truck or storefront form. And if you're jonesing for the ones from our + wedding, visit + Sift Cupcakes + for some of the moistest ones we've ever had. + %p + Finally, try to catch the + Crème Brûlée Cart + if you can. And if you're looking for an upscale twist on a + traditional candy shop, don't miss + Miette. + %h2 A Day in Hayes Valley + %p + Want to explore our neighborhood? Try this itinerary out for + size. + %p + Start the day with some breakfast. Head to + Ritual + for + great coffee, or have a large cup of joe at + La Boulange + along with some pastries. You can go for a full breakfast + at + Stacks, + or head up Haight for + Kate's Kitchen. + %p + Samovar + is a unique tea house which is great for + breakfast or lunch. Other excellent lunch options include + Flipper's Gourmet Burgers + and + Patxi's + pizza. + %p + From Hayes Valley, you can rent bikes and ride to Golden Gate + Park along + the Wiggle, + a popular route that avoids most + of the hills. Or if you're looking to indulge in the arts, see + a show at the + SFJAZZ Center. + %p + There are numerous great restaurants along Hayes or Gough + Street, but especially worth mention are + Suppenküche, + a German joint, + Lers Ros + for fancy Thai cuisine, and + Sauce, + whose menu has some interesting twists on the classics. + %p + Finally, go for some drinks. Try + Two Sisters, + Place Pigalle, + or head to the + Biergarten, + an outdoor venue with large pours and warm pretzels. + %h2 Accommodations + %p + If you haven't booked at + Hotel Kensington, + or the + Courtyard Marriott + in Emeryville, we might also suggest the + Columbus Motor Inn + in North Beach, the + Hilton Garden Inn + in Emeryville, or the + Inn at Jack London Square + in Oakland. + %h2 Finally... + %p + When all else fails, try searching + #{link_to "Yelp", "http://www.yelp.com/", :target => "_blank"} + or reading + #{link_to "WikiTravel", "http://wikitravel.org/en/San_Francisco", :target => "_blank"} + for finding food, activities, or accommodations in the area. If + you have any questions, please don't hesitate to + #{mail_to "us@jeffreyandanna.us", "email"} or call us! + .object_container + .mirrorball.object + .djbooth.object + .chuppah.object + .cake.object + %section#rsvp.main_section.regular_section + %header + .container + %h1 RSVP + .carousel.slide + .carousel-inner + %section.active.item + .container + .centerer + Thank you so much to all of our guests! RSVPs are closed, y'know, because of the whole "past" thing. + .object_container + .backcounter.object + .sodastream.object + .mitts.object + .knives.object + .microwave.object + .scale.object + .refrigerator.object + .counter.object + .mixer.object + .grill.object + %input{:type => "range", :id => "container_opacity", :class => "container_opacity", :value => 100} + = javascript_include_tag "application", :async => (%w(staging production).include? Rails.env) + :javascript + var _gaq=[['_setAccount','UA-32988072-1'],['_trackPageview'],['_setDomain','#{request.host}']]; + (function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0]; + g.src=('https:'==location.protocol?'//ssl':'//www')+'.google-analytics.com/ga.js'; + s.parentNode.insertBefore(g,s)}(document,'script')); \ No newline at end of file diff --git a/config.ru b/config.ru index 63a512d..f2652dc 100644 --- a/config.ru +++ b/config.ru @@ -1,4 +1,4 @@ # This file is used by Rack-based servers to start the application. require ::File.expand_path('../config/environment', __FILE__) -run Adalandlily::Application +run Jeffreyandanna::Application diff --git a/config/application.rb b/config/application.rb index 55d54bd..239231a 100644 --- a/config/application.rb +++ b/config/application.rb @@ -6,7 +6,7 @@ Bundler.require(:default, Rails.env) end -module Adalandlily +module Jeffreyandanna class Application < Rails::Application # Settings in config/environments/* take precedence over those specified here. # Application configuration should go into files in config/initializers @@ -48,8 +48,10 @@ class Application < Rails::Application config.assets.enabled = true # Version of your assets, change this if you want to expire all your assets - config.assets.version = '3.0' + config.assets.version = '1.0' - config.assets.precompile += %w(tables.js tables.css addresses.js addresses.css rails_admin/rails_admin.css rails_admin/rails_admin.js) + config.assets.initialize_on_precompile = false + + config.assets.precompile += %w(tables.js tables.css) end end diff --git a/config/database.yml b/config/database.yml index 7547cf0..b739aa9 100644 --- a/config/database.yml +++ b/config/database.yml @@ -2,7 +2,7 @@ development: adapter: mysql2 encoding: utf8 reconnect: false - database: adalandlily + database: jeffreyandanna pool: 5 host: localhost @@ -19,4 +19,13 @@ test: adapter: sqlite3 database: db/test.sqlite3 pool: 5 - timeout: 5000 \ No newline at end of file + timeout: 5000 + +production: + adapter: mysql2 + encoding: utf8 + reconnect: false + database: <%= ENV["DATABASE_NAME"] %> + pool: 5 + username: <%= ENV["DATABASE_USERNAME"] %> + password: <%= ENV["DATABASE_PASSWORD"] %> \ No newline at end of file diff --git a/config/deploy.rb b/config/deploy.rb new file mode 100644 index 0000000..9111ca3 --- /dev/null +++ b/config/deploy.rb @@ -0,0 +1,57 @@ +require "bundler/capistrano" +require "dotenv/capistrano" +# require "delayed/recipes" + +# set :rails_env, 'production' #added for delayed job +set :application, "jeffreyandanna" +set :repository, "git@jeffreyandanna.github.com:JeffreyATW/jeffreyandanna.git" + +set :scm, :git +# Or: `accurev`, `bzr`, `cvs`, `darcs`, `git`, `mercurial`, `perforce`, `subversion` or `none` + +set :deploy_to, "/home/jeffreyatw/webapps/jeffreyandannawelcome" + +role :web, "web308.webfaction.com" # Your HTTP server, Apache/etc +role :app, "web308.webfaction.com" # This may be the same as your `Web` server +role :db, "web308.webfaction.com", :primary => true # This is where Rails migrations will run + +set :user, "jeffreyatw" +set :use_sudo, false +default_run_options[:pty] = true + +default_environment['PATH'] = "/home/jeffreyatw/webapps/jeffreyandannawelcome/gems/bin:$PATH" +default_environment['GEM_PATH'] = "/home/jeffreyatw/webapps/jeffreyandannawelcome/gems" +default_environment['GEM_HOME'] = "/home/jeffreyatw/webapps/jeffreyandannawelcome/gems" + +# after "deploy:stop", "delayed_job:stop" +# after "deploy:start", "delayed_job:start" +# after "deploy:restart", "delayed_job:restart" + +# if you're still using the script/reaper helper you will need +# these http://github.com/rails/irs_process_scripts + +# If you are using Passenger mod_rails uncomment this: +# namespace :deploy do +# task :start do ; end +# task :stop do ; end +# task :restart, :roles => :app, :except => { :no_release => true } do +# run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}" +# end +# end + +namespace :deploy do + desc "Restart nginx" + task :restart do + run "#{deploy_to}/bin/restart" + end +end + +namespace :db do + + desc "Populates the Production Database" + task :seed do + puts "\n\n=== Populating the Production Database! ===\n\n" + run "cd #{current_path}; rake db:seed RAILS_ENV=production" + end + +end \ No newline at end of file diff --git a/config/environment.rb b/config/environment.rb index 43f955a..a7f5700 100644 --- a/config/environment.rb +++ b/config/environment.rb @@ -2,11 +2,11 @@ require File.expand_path('../application', __FILE__) # Initialize the rails application -Adalandlily::Application.initialize! +Jeffreyandanna::Application.initialize! ActionMailer::Base.smtp_settings = { :address => 'smtp.mandrillapp.com', - :domain => 'adalandlily.com', + :domain => 'jeffreyandanna.us', :authentication => :plain, :user_name => ENV['MANDRILL_USER_NAME'], :password => ENV['MANDRILL_APIKEY'], diff --git a/config/environments/development.rb b/config/environments/development.rb index 9a53396..67540c1 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -1,4 +1,4 @@ -Adalandlily::Application.configure do +Jeffreyandanna::Application.configure do # Settings specified here will take precedence over those in config/application.rb config.eager_load = false diff --git a/config/environments/production.rb b/config/environments/production.rb index d7475da..5bbe51a 100644 --- a/config/environments/production.rb +++ b/config/environments/production.rb @@ -1,4 +1,4 @@ -Adalandlily::Application.configure do +Jeffreyandanna::Application.configure do # Settings specified here will take precedence over those in config/application.rb config.eager_load = true @@ -45,7 +45,7 @@ # config.cache_store = :mem_cache_store # Enable serving of images, stylesheets, and JavaScripts from an asset server - # config.action_controller.asset_host = "http://adalandlily.com" + config.action_controller.asset_host = "http://assets.jeffreyandanna.us" # Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added) config.assets.precompile += %w( libs/modernizr-2.6.2.min.js ) @@ -64,9 +64,7 @@ config.active_support.deprecation = :notify config.action_mailer.delivery_method = :sendmail - config.action_mailer.default_url_options = { :host => 'adalandlily.herokuapp.com' } + config.action_mailer.default_url_options = { :host => 'jeffreyandanna.us' } config.assets.prefix = '' - - config.logger = Logger.new(STDOUT) -end \ No newline at end of file +end diff --git a/config/environments/staging.rb b/config/environments/staging.rb new file mode 100644 index 0000000..6a5dfad --- /dev/null +++ b/config/environments/staging.rb @@ -0,0 +1,70 @@ +Jeffreyandanna::Application.configure do + # Settings specified here will take precedence over those in config/application.rb + + config.eager_load = true + + # Code is not reloaded between requests + config.cache_classes = true + + # Full error reports are disabled and caching is turned on + config.consider_all_requests_local = false + config.action_controller.perform_caching = true + + # Disable Rails's static asset server (Apache or nginx will already do this) + config.serve_static_assets = false + + # Compress JavaScripts and CSS + config.assets.compress = true + + # Don't fallback to assets pipeline if a precompiled asset is missed + config.assets.compile = false + + # Generate digests for assets URLs + config.assets.digest = true + + # Defaults to nil and saved in location specified by config.assets.prefix + # config.assets.manifest = YOUR_PATH + + # 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 + + # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. + # config.force_ssl = true + + # See everything in the log (default is :info) + # config.log_level = :debug + + # Prepend all log lines with the following tags + # config.log_tags = [ :subdomain, :uuid ] + + # Use a different logger for distributed setups + # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) + + # Use a different cache store in production + # config.cache_store = :mem_cache_store + + # Enable serving of images, stylesheets, and JavaScripts from an asset server + # config.action_controller.asset_host = "http://assets.jeffreyandanna.us" + + # Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added) + config.assets.precompile += %w( libs/modernizr-2.6.2.min.js ) + + # Disable delivery errors, bad email addresses will be ignored + # config.action_mailer.raise_delivery_errors = false + + # Enable threaded mode + # config.threadsafe! + + # Enable locale fallbacks for I18n (makes lookups for any locale fall back to + # the I18n.default_locale when a translation can not be found) + config.i18n.fallbacks = true + + # Send deprecation notices to registered listeners + config.active_support.deprecation = :notify + + config.action_mailer.delivery_method = :sendmail + config.action_mailer.default_url_options = { :host => 'jeffreyandanna.herokuapp.com' } + + config.assets.prefix = '' +end diff --git a/config/environments/test.rb b/config/environments/test.rb index 263a701..56ce977 100644 --- a/config/environments/test.rb +++ b/config/environments/test.rb @@ -1,4 +1,4 @@ -Adalandlily::Application.configure do +Jeffreyandanna::Application.configure do # Settings specified here will take precedence over those in config/application.rb config.eager_load = false diff --git a/config/initializers/rails_admin.rb b/config/initializers/rails_admin.rb index 398b3bb..b146e7d 100644 --- a/config/initializers/rails_admin.rb +++ b/config/initializers/rails_admin.rb @@ -1,54 +1,116 @@ +# RailsAdmin config file. Generated on August 22, 2012 22:17 +# See github.com/sferik/rails_admin for more informations + require "#{Rails.root}/lib/rails_admin_mail_guests" RailsAdmin.config do |config| - ### Popular gems integration + # If your default_local is different from :en, uncomment the following 2 lines and set your default locale here: + # require 'i18n' + # I18n.default_locale = :de + + config.actions do + dashboard + index + history_index + new + + mail_guests + + show + edit + delete + history_show + export + end - ## == Devise == config.authenticate_with do warden.authenticate! scope: :user end config.current_user_method(&:current_user) - ## == Cancan == - # config.authorize_with :cancan + # If you want to track changes on your models: + # config.audit_with :history, User - ## == PaperTrail == - # config.audit_with :paper_trail, 'User', 'PaperTrail::Version' # PaperTrail >= 3.0.0 + # Or with a PaperTrail: (you need to install it first) + # config.audit_with :paper_trail, User - ### More at https://github.com/sferik/rails_admin/wiki/Base-configuration + # Set the admin name here (optional second array element will appear in a beautiful RailsAdmin red ©) + config.main_app_name = ['Jeffrey and Anna', 'Admin'] + # or for a dynamic name: + # config.main_app_name = Proc.new { |controller| [Rails.application.engine_name.titleize, controller.params['action'].titleize] } - config.actions do - dashboard # mandatory - index # mandatory - #history_index - #history_show - new - mail_guests + # ==> Global show view settings + # Display empty fields in show views + # config.compact_show_view = false - export - bulk_delete - show - edit - delete - show_in_app - end + # ==> Global list view settings + # Number of default rows per-page: + # config.default_items_per_page = 20 + + # ==> Included models + # Add all excluded models here: + # config.excluded_models = [Guest] + + # Add models here if you want to go 'whitelist mode': + # config.included_models = [Guest] + + # Application wide tried label methods for models' instances + # config.label_methods << :description # Default is [:name, :title] - config.main_app_name = ['Adal and Lily', 'Admin'] + # ==> Global models configuration + # config.models do + # # Configuration here will affect all included models in all scopes, handle with care! + # + # list do + # # Configuration here will affect all included models in list sections (same for show, export, edit, update, create) + # + # fields_of_type :date do + # # Configuration here will affect all date fields, in the list section, for all included models. See README for a comprehensive type list. + # end + # end + # end + # + # ==> Model specific configuration + # Keep in mind that *all* configuration blocks are optional. + # RailsAdmin will try his best to provide the best defaults for each section, for each field. + # Try to override as few things as possible, in the most generic way. Try to avoid setting labels for models and attributes, use ActiveRecord I18n API instead. + # Less code is better code! + # config.model MyModel do + # # Cross-section field configuration + # object_label_method :name # Name of the method called for pretty printing an *instance* of ModelName + # label 'My model' # Name of ModelName (smartly defaults to ActiveRecord's I18n API) + # label_plural 'My models' # Same, plural + # weight -1 # Navigation priority. Bigger is higher. + # parent OtherModel # Set parent model for navigation. MyModel will be nested below. OtherModel will be on first position of the dropdown + # navigation_label # Sets dropdown entry's name in navigation. Only for parents! + # # Section specific configuration: + # list do + # filters [:id, :name] # Array of field names which filters should be shown by default in the table header + # items_per_page 100 # Override default_items_per_page + # sort_by :id # Sort column (default is primary key) + # sort_reverse true # Sort direction (default is true for primary key, last created first) + # # Here goes the fields configuration for the list view + # end + # end + + # Your model's configuration, to help you get started: + + # All fields marked as 'hidden' won't be shown anywhere in the rails_admin unless you mark them as visible. (visible(true)) config.model Guest do - # # Found associations: - # # Found columns: - # configure :id, :integer - # configure :name, :string - # configure :address, :text - # configure :responded, :boolean - # configure :going, :boolean - # configure :plus_one, :boolean - # configure :rsvp, :string - # configure :created_at, :datetime - # configure :updated_at, :datetime # # Sections: + # # Found associations: + # # Found columns: + # configure :id, :integer + # configure :name, :string + # configure :address, :text + # configure :responded, :boolean + # configure :going, :boolean + # configure :plus_one, :boolean + # configure :rsvp, :string + # configure :created_at, :datetime + # configure :updated_at, :datetime # # Sections: list do field :name field :responded, :boolean do @@ -62,7 +124,7 @@ field :invitation field :table end - # export do; end + # export do; end show do field :name field :save_the_date_sent, :boolean @@ -83,8 +145,8 @@ end field :table end - # create do; end - # update do; end + # create do; end + # update do; end end config.model Invitation do @@ -117,7 +179,6 @@ field :responded field :going field :save_the_date_sent - field :no_paper_invite field :rsvp end show do @@ -132,7 +193,6 @@ field :invited field :responded field :going - field :no_paper_invite field :rsvp field :notes end @@ -144,14 +204,13 @@ field :invited field :responded field :going - field :no_paper_invite field :notes end - # export do; end - # show do; end - # edit do; end - # create do; end - # update do; end + # export do; end + # show do; end + # edit do; end + # create do; end + # update do; end end config.model Table do @@ -174,11 +233,11 @@ end end end - # export do; end - # show do; end - # edit do; end - # create do; end - # update do; end + # export do; end + # show do; end + # edit do; end + # create do; end + # update do; end end config.model Task do @@ -249,4 +308,4 @@ def get_collection(model_config, scope, pagination) model_config.abstract_model.all(options, scope) end end -end +end \ No newline at end of file diff --git a/config/initializers/secret_token.rb b/config/initializers/secret_token.rb index b9ba04a..c5305b7 100644 --- a/config/initializers/secret_token.rb +++ b/config/initializers/secret_token.rb @@ -5,4 +5,4 @@ # Make sure the secret is at least 30 characters and all random, # no regular words or you'll be exposed to dictionary attacks. -Adalandlily::Application.config.secret_token = ENV['SECRET_TOKEN'] \ No newline at end of file +Jeffreyandanna::Application.config.secret_token = ENV['SECRET_TOKEN'] \ No newline at end of file diff --git a/config/initializers/session_store.rb b/config/initializers/session_store.rb index 3064252..b7bd633 100644 --- a/config/initializers/session_store.rb +++ b/config/initializers/session_store.rb @@ -1,8 +1,8 @@ # Be sure to restart your server when you modify this file. -Adalandlily::Application.config.session_store :cookie_store, key: '_adalandlily_session' +Jeffreyandanna::Application.config.session_store :cookie_store, key: '_jeffreyandanna_session' # Use the database for sessions instead of the cookie-based default, # which shouldn't be used to store highly confidential information # (create the session table with "rails generate session_migration") -# Adalandlily::Application.config.session_store :active_record_store +# Jeffreyandanna::Application.config.session_store :active_record_store diff --git a/config/routes.rb b/config/routes.rb index d7776aa..703e153 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,5 +1,5 @@ -Adalandlily::Application.routes.draw do - mount RailsAdmin::Engine => '/admin', as: 'rails_admin' +Jeffreyandanna::Application.routes.draw do + mount RailsAdmin::Engine => '/admin', :as => 'rails_admin' devise_for :users @@ -8,9 +8,6 @@ get 'rsvp/export' => "invitations#index" - get 'addresses' => 'invitations#new' - post 'addresses' => 'invitations#create', :as => 'invitations' - resources :tables # The priority is based upon order of creation: diff --git a/db/migrate/20140413050056_add_no_paper_invite_to_invitations.rb b/db/migrate/20140413050056_add_no_paper_invite_to_invitations.rb deleted file mode 100644 index 04d7f21..0000000 --- a/db/migrate/20140413050056_add_no_paper_invite_to_invitations.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddNoPaperInviteToInvitations < ActiveRecord::Migration - def change - add_column :invitations, :no_paper_invite, :boolean - end -end diff --git a/db/schema.rb b/db/schema.rb index b38414b..8e845a7 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -9,13 +9,13 @@ # 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. +# It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(version: 20140413050056) do +ActiveRecord::Schema.define(:version => 20130608235502) do - create_table "delayed_jobs", force: true do |t| - t.integer "priority", default: 0 - t.integer "attempts", default: 0 + create_table "delayed_jobs", :force => true do |t| + t.integer "priority", :default => 0 + t.integer "attempts", :default => 0 t.text "handler" t.text "last_error" t.datetime "run_at" @@ -23,94 +23,251 @@ t.datetime "failed_at" t.string "locked_by" t.string "queue" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false end - add_index "delayed_jobs", ["priority", "run_at"], name: "delayed_jobs_priority", using: :btree + add_index "delayed_jobs", ["priority", "run_at"], :name => "delayed_jobs_priority" - create_table "guest_mails", force: true do |t| + create_table "guest_mails", :force => true do |t| t.string "subject" t.text "body" t.string "group" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false end - create_table "guests", force: true do |t| + create_table "guests", :force => true do |t| t.string "name" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.integer "invitation_id" t.text "special_needs" t.boolean "under_4" t.integer "table_id" end - create_table "invitations", force: true do |t| + create_table "invitations", :force => true do |t| t.text "address" t.boolean "responded" t.boolean "going" t.string "rsvp" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.string "email" t.text "notes" t.boolean "save_the_date_sent" t.boolean "invited" - t.boolean "no_paper_invite" end - create_table "rails_admin_histories", force: true do |t| + create_table "rails_admin_histories", :force => true do |t| t.text "message" t.string "username" t.integer "item" t.string "table" - t.integer "month", limit: 2 - t.integer "year", limit: 8 - t.datetime "created_at" - t.datetime "updated_at" + t.integer "month", :limit => 2 + t.integer "year", :limit => 8 + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false end - add_index "rails_admin_histories", ["item", "table", "month", "year"], name: "index_rails_admin_histories", using: :btree + add_index "rails_admin_histories", ["item", "table", "month", "year"], :name => "index_rails_admin_histories" - create_table "tables", force: true do |t| + create_table "tables", :force => true do |t| t.string "name" t.text "notes" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.integer "x" t.integer "y" t.string "table_type" end - create_table "tasks", force: true do |t| + create_table "tasks", :force => true do |t| t.string "title" t.text "description" t.integer "creator_id" t.boolean "done" t.integer "parent_task_id" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.datetime "due_date" end - create_table "users", force: true do |t| - t.string "email", default: "", null: false - t.string "encrypted_password", default: "", null: false + create_table "users", :force => true do |t| + t.string "email", :default => "", :null => false + t.string "encrypted_password", :default => "", :null => false t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" - t.integer "sign_in_count", default: 0 + t.integer "sign_in_count", :default => 0 t.datetime "current_sign_in_at" t.datetime "last_sign_in_at" t.string "current_sign_in_ip" t.string "last_sign_in_ip" - t.datetime "created_at" - t.datetime "updated_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false end - add_index "users", ["email"], name: "index_users_on_email", unique: true, using: :btree - add_index "users", ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true, using: :btree + add_index "users", ["email"], :name => "index_users_on_email", :unique => true + add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true + + create_table "wp_commentmeta", :primary_key => "meta_id", :force => true do |t| + t.integer "comment_id", :limit => 8, :default => 0, :null => false + t.string "meta_key" + t.text "meta_value", :limit => 2147483647 + end + + add_index "wp_commentmeta", ["comment_id"], :name => "comment_id" + add_index "wp_commentmeta", ["meta_key"], :name => "meta_key" + + create_table "wp_comments", :primary_key => "comment_ID", :force => true do |t| + t.integer "comment_post_ID", :limit => 8, :default => 0, :null => false + t.text "comment_author", :limit => 255, :null => false + t.string "comment_author_email", :limit => 100, :default => "", :null => false + t.string "comment_author_url", :limit => 200, :default => "", :null => false + t.string "comment_author_IP", :limit => 100, :default => "", :null => false + t.datetime "comment_date", :null => false + t.datetime "comment_date_gmt", :null => false + t.text "comment_content", :null => false + t.integer "comment_karma", :default => 0, :null => false + t.string "comment_approved", :limit => 20, :default => "1", :null => false + t.string "comment_agent", :default => "", :null => false + t.string "comment_type", :limit => 20, :default => "", :null => false + t.integer "comment_parent", :limit => 8, :default => 0, :null => false + t.integer "user_id", :limit => 8, :default => 0, :null => false + end + + add_index "wp_comments", ["comment_approved", "comment_date_gmt"], :name => "comment_approved_date_gmt" + add_index "wp_comments", ["comment_date_gmt"], :name => "comment_date_gmt" + add_index "wp_comments", ["comment_parent"], :name => "comment_parent" + add_index "wp_comments", ["comment_post_ID"], :name => "comment_post_ID" + + create_table "wp_links", :primary_key => "link_id", :force => true do |t| + t.string "link_url", :default => "", :null => false + t.string "link_name", :default => "", :null => false + t.string "link_image", :default => "", :null => false + t.string "link_target", :limit => 25, :default => "", :null => false + t.string "link_description", :default => "", :null => false + t.string "link_visible", :limit => 20, :default => "Y", :null => false + t.integer "link_owner", :limit => 8, :default => 1, :null => false + t.integer "link_rating", :default => 0, :null => false + t.datetime "link_updated", :null => false + t.string "link_rel", :default => "", :null => false + t.text "link_notes", :limit => 16777215, :null => false + t.string "link_rss", :default => "", :null => false + end + + add_index "wp_links", ["link_visible"], :name => "link_visible" + + create_table "wp_login_security_solution_fail", :primary_key => "fail_id", :force => true do |t| + t.string "ip", :limit => 39, :default => "", :null => false + t.string "user_login", :limit => 60, :default => "", :null => false + t.string "pass_md5", :limit => 64, :default => "", :null => false + t.timestamp "date_failed", :null => false + end + + add_index "wp_login_security_solution_fail", ["ip"], :name => "ip", :length => {"ip"=>9} + add_index "wp_login_security_solution_fail", ["pass_md5"], :name => "pass_md5", :length => {"pass_md5"=>10} + add_index "wp_login_security_solution_fail", ["user_login"], :name => "user_login", :length => {"user_login"=>5} + + create_table "wp_options", :primary_key => "option_id", :force => true do |t| + t.string "option_name", :limit => 64, :default => "", :null => false + t.text "option_value", :limit => 2147483647, :null => false + t.string "autoload", :limit => 20, :default => "yes", :null => false + end + + add_index "wp_options", ["option_name"], :name => "option_name", :unique => true + + create_table "wp_postmeta", :primary_key => "meta_id", :force => true do |t| + t.integer "post_id", :limit => 8, :default => 0, :null => false + t.string "meta_key" + t.text "meta_value", :limit => 2147483647 + end + + add_index "wp_postmeta", ["meta_key"], :name => "meta_key" + add_index "wp_postmeta", ["post_id"], :name => "post_id" + + create_table "wp_posts", :primary_key => "ID", :force => true do |t| + t.integer "post_author", :limit => 8, :default => 0, :null => false + t.datetime "post_date", :null => false + t.datetime "post_date_gmt", :null => false + t.text "post_content", :limit => 2147483647, :null => false + t.text "post_title", :null => false + t.text "post_excerpt", :null => false + t.string "post_status", :limit => 20, :default => "publish", :null => false + t.string "comment_status", :limit => 20, :default => "open", :null => false + t.string "ping_status", :limit => 20, :default => "open", :null => false + t.string "post_password", :limit => 20, :default => "", :null => false + t.string "post_name", :limit => 200, :default => "", :null => false + t.text "to_ping", :null => false + t.text "pinged", :null => false + t.datetime "post_modified", :null => false + t.datetime "post_modified_gmt", :null => false + t.text "post_content_filtered", :limit => 2147483647, :null => false + t.integer "post_parent", :limit => 8, :default => 0, :null => false + t.string "guid", :default => "", :null => false + t.integer "menu_order", :default => 0, :null => false + t.string "post_type", :limit => 20, :default => "post", :null => false + t.string "post_mime_type", :limit => 100, :default => "", :null => false + t.integer "comment_count", :limit => 8, :default => 0, :null => false + end + + add_index "wp_posts", ["post_author"], :name => "post_author" + add_index "wp_posts", ["post_name"], :name => "post_name" + add_index "wp_posts", ["post_parent"], :name => "post_parent" + add_index "wp_posts", ["post_type", "post_status", "post_date", "ID"], :name => "type_status_date" + + create_table "wp_term_relationships", :id => false, :force => true do |t| + t.integer "object_id", :limit => 8, :default => 0, :null => false + t.integer "term_taxonomy_id", :limit => 8, :default => 0, :null => false + t.integer "term_order", :default => 0, :null => false + end + + add_index "wp_term_relationships", ["term_taxonomy_id"], :name => "term_taxonomy_id" + + create_table "wp_term_taxonomy", :primary_key => "term_taxonomy_id", :force => true do |t| + t.integer "term_id", :limit => 8, :default => 0, :null => false + t.string "taxonomy", :limit => 32, :default => "", :null => false + t.text "description", :limit => 2147483647, :null => false + t.integer "parent", :limit => 8, :default => 0, :null => false + t.integer "count", :limit => 8, :default => 0, :null => false + end + + add_index "wp_term_taxonomy", ["taxonomy"], :name => "taxonomy" + add_index "wp_term_taxonomy", ["term_id", "taxonomy"], :name => "term_id_taxonomy", :unique => true + + create_table "wp_terms", :primary_key => "term_id", :force => true do |t| + t.string "name", :limit => 200, :default => "", :null => false + t.string "slug", :limit => 200, :default => "", :null => false + t.integer "term_group", :limit => 8, :default => 0, :null => false + end + + add_index "wp_terms", ["name"], :name => "name" + add_index "wp_terms", ["slug"], :name => "slug", :unique => true + + create_table "wp_usermeta", :primary_key => "umeta_id", :force => true do |t| + t.integer "user_id", :limit => 8, :default => 0, :null => false + t.string "meta_key" + t.text "meta_value", :limit => 2147483647 + end + + add_index "wp_usermeta", ["meta_key"], :name => "meta_key" + add_index "wp_usermeta", ["user_id"], :name => "user_id" + + create_table "wp_users", :primary_key => "ID", :force => true do |t| + t.string "user_login", :limit => 60, :default => "", :null => false + t.string "user_pass", :limit => 64, :default => "", :null => false + t.string "user_nicename", :limit => 50, :default => "", :null => false + t.string "user_email", :limit => 100, :default => "", :null => false + t.string "user_url", :limit => 100, :default => "", :null => false + t.datetime "user_registered", :null => false + t.string "user_activation_key", :limit => 60, :default => "", :null => false + t.integer "user_status", :default => 0, :null => false + t.string "display_name", :limit => 250, :default => "", :null => false + end + + add_index "wp_users", ["user_login"], :name => "user_login_key" + add_index "wp_users", ["user_nicename"], :name => "user_nicename" end diff --git a/db/seeds.rb b/db/seeds.rb index cbdf5ae..b7d015c 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -5,5 +5,5 @@ # # cities = City.create([{ name: 'Chicago' }, { name: 'Copenhagen' }]) # Mayor.create(name: 'Emanuel', city: cities.first) -User.create(:email => "jeffreyatw@gmail.com", :password => "changeme") -User.create(:email => "lilyfaden@gmail.com", :password => "changeme") \ No newline at end of file +User.create(:email => "jeffrey@jeffreyandanna.us", :password => "changeme") +User.create(:email => "anna@jeffreyandanna.us", :password => "changeme") \ No newline at end of file diff --git a/lib/rails_admin_mail_guests.rb b/lib/rails_admin_mail_guests.rb index 01aa5e4..10eb443 100644 --- a/lib/rails_admin_mail_guests.rb +++ b/lib/rails_admin_mail_guests.rb @@ -44,10 +44,9 @@ class MailGuests < Base end Mandrill::API.new.messages.send({ subject: params[:mail][:subject], - from_name: 'Adal and Lily', - from_email: 'adalandlily@gmail.com', - html: params[:mail][:body], - auto_text: true, + from_name: 'Jeffrey and Anna', + from_email: 'wedding@jeffreyandanna.us', + text: params[:mail][:body], to: invitations.map{|invitation| {email: invitation.email}}, merge_vars: invitations.map{|invitation| {rcpt: invitation.email, vars: [ diff --git a/public/apple-touch-icon-114x114-precomposed.png b/public/apple-touch-icon-114x114-precomposed.png new file mode 100644 index 0000000000000000000000000000000000000000..0fb1793374337f9480844d75b7ffff677bccd42b GIT binary patch literal 6266 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%0D~_Q@d(U6K9{SH8`?*{`FQ^j((8EBZBuN)N`14Qd zUwT&h4a~n*G(gOK-jBWp!+E3$kLv z3n3~EjuKbJ#nFA1zy2)t#ICgFck5z$TqR2d)Vbl1wUD%4o&i$nY%mmo!@b+(buHg~AX}Ze2&7U;M#~)8 zt8=*WvjMpj3*QYZsFa&tYb=>C>V(?BN)o8M1-q>QrNUPYn#+#;;A{BkH2&_O>4wh? z=4o%zTXdO6dSlyqvA*`yve}agX(yza3~u0rnXBGEdA4@510PcBbfHcc_RIlJl=AB6hmaJPX$r0Sf+@~4GHt~1 zQVc+3vRQQ!mtoem6Lw=Fkj}7_BuG?6nFSX#ni^*UCN9rctkheA9A4-t@4*Dk1u+_mO0lDdp1{ znqF84Kzzv121zD) zky%W(O@{h#f~|55uOvy%=B9xmCd*fq*k1GdsVy!Ub6lBeD;&aNhNc|t?YsK>$D&QA z$6_FF<6Ltx&Ey5S%K0upU!!3~rD@QeIJ`AfIi6h8pO=;9&HwzX&nzWM=KI0nsOuRq z9HM*p4p9?OFc_#TtNF7PEglCxiALicmQ#QKasql4=aZ8)qZylBx2A ztBO{u1w;y|$YR}GA%I+YSvOqDWHNfgO`)Zv(Q0t?5{&W@4d zM9Igv`3sPVPR9z8Y0h6kn5`Mz+GGmZEb2y^weB!{MfESmlIF7`P0Nb`3#QV z`3_=>FSJ}Pm&s&t0(ZGwEW=b-A9X7~pwQ5C-Pfl4JNx(tLAN@M(|dajZw~D*;H8we z$3lq)S(q1)Wl2`IIN-QsG8tb|rz4Z;R5FpsX0n1P!a0WyJ=Wj9ljr#AI!kV7uuliu zmr|JqllUNn16$fWXRdc}va`7DW|>!yM517f*=#nI$s`kiX95f}pU>yi4Z6fajQ|cZ zjUY)ROMd^t&K=u|WiJ&#Er?&M#k8=vA)T9gKwx!P6VLQt|LJ9C*=!RvIW;vfa6!xq zyjtO)t_-?E2*si&AXADWfm9nzh`1nxdeet_%*1kKfp2C%^O} zzU&&=H3ln~D8V?27?omJ0CDo>WGohAXa*~MMiRIvOkJFT1H@({+0ka)y*}%*OU+K} zksUFcnat%g7iN=#Qw__O6BdfkNcelO{cDp`V`JmdXbgz>hp%f-9AbN0`85w~DsLN^ z@0BF*8_Rqpu-+^2V8dp3Rg>|Qtqjlv5B!@ zFjU|WQby`>@iv$4se|-OpWxR#w@Qea4LUPfk!6<8C4&+1`TX3h2Mn&!O6}f^s^9lX z$K*D&g=a%9kWdUwQ#74UgN06yjEpU+W%wAwGJ+scG~uwZFC5c7cUXFCdq%^g);z4D zOkH(%l_{$M`|<}CLg5HNv%lZyXw0mrWTemKKf`R!%Lb0i%}(4HpSa=k`9Pgf6a%s$ zpO;)t^NYvnyjegF*MX z zwP9glAs7r|GPY}bLx(F19&UBF&@l49{w>HRL9eOx3hm$9W;0_ie~M^xn$Hbp=lr?p zrRiz+G?1dvXoS#SltfC){KfNJv-Q3{N=mO$%Ix4(6-}?j32ks!m&Win-`8FkVST>1 zFN}ktgwRV703o$+tFmuvZZ;q%Q`pr>oyX4)PmwbV`WH`_ z>{j2${)B70s-?9_a6mk-NG**D!{8F3-P|SDWZSj-?f5la)$;o*2kQ{jVXebjhqd17 ku-0L%!&+~(ZT~O805yq8CRb2DC;$Ke07*qoM6N<$f;8JFMgRZ+ literal 0 HcmV?d00001 diff --git a/public/apple-touch-icon-57x57-precomposed.png b/public/apple-touch-icon-57x57-precomposed.png new file mode 100644 index 0000000000000000000000000000000000000000..978b00b9c47e34d7c08791ed3bb53f44293312de GIT binary patch literal 3078 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 literal 0 HcmV?d00001 diff --git a/public/apple-touch-icon-precomposed.png b/public/apple-touch-icon-precomposed.png new file mode 100644 index 0000000000000000000000000000000000000000..978b00b9c47e34d7c08791ed3bb53f44293312de GIT binary patch literal 3078 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 O0000