├── .bundle └── config ├── .gitignore ├── .rspec ├── Gemfile ├── Gemfile.lock ├── README.md ├── Rakefile ├── app ├── controllers │ ├── application_controller.rb │ ├── apps_controller.rb │ ├── authentications_controller.rb │ ├── comments_controller.rb │ ├── deploy_task_resources_controller.rb │ ├── details_controller.rb │ ├── goals_controller.rb │ ├── languages_controller.rb │ ├── members_controller.rb │ ├── milestones_controller.rb │ ├── pages_controller.rb │ ├── people_controller.rb │ ├── regions_controller.rb │ ├── roles_controller.rb │ ├── skills_controller.rb │ ├── steps_controller.rb │ ├── team_members_controller.rb │ ├── teams_controller.rb │ ├── users │ │ └── sessions_controller.rb │ └── users_controller.rb ├── helpers │ ├── application_helper.rb │ ├── authentications_helper.rb │ └── people_helper.rb ├── models │ ├── activity_feed.rb │ ├── app.rb │ ├── authentication.rb │ ├── batchbook_contact.rb │ ├── comment.rb │ ├── contact_source.rb │ ├── cron_process.rb │ ├── deploy_task.rb │ ├── deploy_task_resource.rb │ ├── description.rb │ ├── detail.rb │ ├── github_contact.rb │ ├── heading.rb │ ├── milestone.rb │ ├── person.rb │ ├── region.rb │ ├── sign_in_data.rb │ ├── step.rb │ ├── team.rb │ ├── team_deploy_task.rb │ ├── team_member.rb │ └── user.rb └── views │ ├── apps │ ├── _activity_stream.html.erb │ ├── _form.html.erb │ ├── _header.html.erb │ ├── _metric.html.erb │ ├── admin.html.erb │ ├── edit.html.erb │ ├── index.html.erb │ ├── new.html.erb │ ├── people.html.erb │ ├── show.html.erb │ └── steps.html.erb │ ├── authentications │ ├── _add_auth_form.html.erb │ ├── _list.html.erb │ ├── _login_form.html.erb │ ├── _provider_list.html.erb │ ├── auth_failure.html.erb │ ├── auto.html.erb │ └── index.html.erb │ ├── comments │ └── create.html.erb │ ├── details │ ├── _form.html.erb │ ├── edit.html.erb │ ├── index.html.erb │ ├── new.html.erb │ └── show.html.erb │ ├── layouts │ ├── _google_analytics.html.erb │ ├── application.html.erb │ └── old-application.html.haml │ ├── milestones │ ├── edit.html.erb │ ├── index.html.erb │ ├── new.html.erb │ └── show.html.erb │ ├── pages │ ├── about.html.erb │ ├── api.html.erb │ ├── blog.html.erb │ ├── contact.html.erb │ ├── privacy.html.erb │ └── terms.html.erb │ ├── people │ ├── _common_skills.html.erb │ ├── _form.html.erb │ ├── _list.html.erb │ ├── _new_form.html.erb │ ├── _person_comments.html.erb │ ├── _person_edit_image.html.erb │ ├── _person_header.html.erb │ ├── _person_teams.html.erb │ ├── _team_list.html.erb │ ├── claim.html.erb │ ├── index.html.erb │ ├── new.html.erb │ ├── photo.html.erb │ └── show.html.erb │ ├── regions │ ├── _form.html.erb │ ├── edit.html.erb │ ├── index.html.erb │ ├── new.html.erb │ └── show.html.erb │ ├── resources │ ├── _resource_list.html.erb │ ├── edit.html.erb │ └── new.html.erb │ ├── shared │ ├── _app_header.html.erb │ ├── _comment.html.erb │ ├── _comment_list.html.erb │ ├── _deploy_task_resource.html.erb │ ├── _footer.html.erb │ ├── _guide_sidebar.html.erb │ ├── _header.html.erb │ ├── _list.html.erb │ ├── _list_item.html.erb │ ├── _list_pagination.html.erb │ ├── _search.html.erb │ └── _tag_list.html.erb │ ├── steps │ ├── edit.html.erb │ ├── new.html.erb │ └── show.html.erb │ ├── tags │ └── _list.html.erb │ ├── teams │ ├── _activity_stream.html.erb │ ├── _core_metric.html.erb │ ├── _core_team.html.erb │ ├── _form.html.erb │ ├── _implementations.html.erb │ ├── _list.html.erb │ ├── _list_item.html.erb │ ├── _metric.html.erb │ ├── _organizers.html.erb │ ├── _supporters.html.erb │ ├── edit.html.erb │ ├── index.html.erb │ ├── new.html.erb │ ├── people.html.erb │ └── show.html.erb │ └── users │ ├── home.html.erb │ ├── index.html.erb │ ├── sessions │ └── new.html.erb │ └── welcome.html.erb ├── config.ru ├── config ├── application.rb ├── boot.rb ├── database.yml ├── environment.rb ├── environments │ ├── development.rb │ ├── jenkins.rb │ ├── production.rb │ └── test.rb ├── initializers │ ├── _load_settings.rb │ ├── backtrace_silencers.rb │ ├── delayed_job.rb │ ├── devise.rb │ ├── inflections.rb │ ├── mime_types.rb │ ├── omniauth.rb │ ├── paperclip.rb │ ├── secret_token.rb │ └── session_store.rb ├── locales │ └── en.yml ├── routes.rb ├── settings-local-sample.yml └── twitter_auth.yml ├── db ├── migrate │ ├── 20110601194123_create_github_contacts.rb │ ├── 20110601235912_create_delayed_jobs.rb │ ├── 20110602162632_create_batchbook_contacts.rb │ ├── 20110602163032_acts_as_taggable_on_migration.rb │ ├── 20110627233220_create_people.rb │ ├── 20110705171644_devise_create_users.rb │ ├── 20110705172005_update_person.rb │ ├── 20110705172312_authentications.rb │ ├── 20110706162252_create_apps.rb │ ├── 20110707213317_create_regions.rb │ ├── 20110707213640_create_teams.rb │ ├── 20110707213749_create_team_members.rb │ ├── 20110707214056_create_details.rb │ ├── 20110707222526_add_nick_name_to_regions.rb │ ├── 20110707230536_add_region_id_to_users.rb │ ├── 20110707232700_add_admin_to_team_members.rb │ ├── 20110708173625_add_app_id_to_team_members.rb │ ├── 20110726163650_create_roles.rb │ ├── 20110726163903_create_skills.rb │ ├── 20110726171207_create_languages.rb │ ├── 20110726194202_add_photos_to_apps.rb │ ├── 20110801021736_use_paper_clip_for_apps_videos.rb │ ├── 20110801124607_add_repo_url_to_teams_table.rb │ ├── 20110801150627_create_deploy_tasks.rb │ ├── 20110801150927_create_deploy_task_resources.rb │ ├── 20110801151358_create_team_deploy_tasks.rb │ ├── 20110801152005_create_comments.rb │ ├── 20110804182313_create_activity_feeds.rb │ ├── 20110804192425_add_commentable_to_comment.rb │ ├── 20110805000044_add_photos_to_regions.rb │ ├── 20110805185055_upate_deploy_tasks_table.rb │ ├── 20110809170919_drop_langs_skills_roles_tables.rb │ ├── 20110812194931_change_activity_in_activity_feeds.rb │ └── 20110812221737_changing_people_bio_to_text.rb ├── schema.rb └── seeds.rb ├── lib ├── api_client.rb ├── api_client │ ├── base.rb │ ├── facebook.rb │ ├── linked_in.rb │ ├── o_auth.rb │ ├── o_auth2.rb │ └── twitter.rb ├── application_responder.rb ├── auth_probe.rb ├── localness.rb └── tasks │ └── .gitkeep ├── public ├── 404.html ├── 422.html ├── 500.html ├── favicon.ico ├── fonts │ ├── League_Gothic-webfont.eot │ ├── League_Gothic-webfont.svg │ ├── League_Gothic-webfont.ttf │ └── League_Gothic-webfont.woff ├── images │ ├── add.png │ ├── arrow-left.png │ ├── arrow-right.png │ ├── arrows.png │ ├── authbuttons │ │ ├── aol_128.png │ │ ├── aol_256.png │ │ ├── aol_32.png │ │ ├── aol_64.png │ │ ├── auth-add.png │ │ ├── auth-delete.png │ │ ├── basecamp_128.png │ │ ├── basecamp_256.png │ │ ├── basecamp_32.png │ │ ├── basecamp_64.png │ │ ├── campfire_128.png │ │ ├── campfire_256.png │ │ ├── campfire_32.png │ │ ├── campfire_64.png │ │ ├── facebook_128.png │ │ ├── facebook_256.png │ │ ├── facebook_32.png │ │ ├── facebook_64.png │ │ ├── github_128.png │ │ ├── github_256.png │ │ ├── github_32.png │ │ ├── github_64.png │ │ ├── google_128.png │ │ ├── google_256.png │ │ ├── google_32.png │ │ ├── google_64.png │ │ ├── linked_in_128.png │ │ ├── linked_in_256.png │ │ ├── linked_in_32.png │ │ ├── linked_in_64.png │ │ ├── myspace_128.png │ │ ├── myspace_256.png │ │ ├── myspace_32.png │ │ ├── myspace_64.png │ │ ├── open_id_128.png │ │ ├── open_id_256.png │ │ ├── open_id_32.png │ │ ├── open_id_64.png │ │ ├── presently_128.png │ │ ├── presently_256.png │ │ ├── presently_32.png │ │ ├── presently_64.png │ │ ├── twitter_128.png │ │ ├── twitter_256.png │ │ ├── twitter_32.png │ │ ├── twitter_64.png │ │ ├── yahoo_128.png │ │ ├── yahoo_256.png │ │ ├── yahoo_32.png │ │ └── yahoo_64.png │ ├── avatar-1.png │ ├── avatar-2.png │ ├── background.png │ ├── binocular.png │ ├── bos-icon.png │ ├── cfa-full-logo.png │ ├── check-white-icon.png │ ├── cityhero_logo.png │ ├── civicopia-widget-bottom-dropshadow.png │ ├── content-border.png │ ├── creepy-baby-sloth.jpg │ ├── default_app_1.png │ ├── default_app_2.png │ ├── default_app_3.png │ ├── delete.png │ ├── example.jpg │ ├── fork.png │ ├── geekcorpsavatar1.png │ ├── geekcorpsavatar1_medium.png │ ├── geekcorpsavatar1_small.png │ ├── geekcorpsavatar1_thumb.png │ ├── geekcorpsavatar2.png │ ├── geekcorpsavatar2_medium.png │ ├── geekcorpsavatar2_small.png │ ├── geekcorpsavatar2_thumb.png │ ├── geekcorpsavatar3.png │ ├── geekcorpsavatar3_medium.png │ ├── geekcorpsavatar3_small.png │ ├── geekcorpsavatar3_thumb.png │ ├── home_12x12.png │ ├── join-ribbon-shadow.png │ ├── join-sash.png │ ├── list-item-check.png │ ├── logo-sash.png │ ├── map-icon-white.png │ ├── map-icon.png │ ├── map-shadow-icon.png │ ├── no-image.gif │ ├── notify_icon_green.png │ ├── notify_icon_orange.png │ ├── notify_icon_purple.png │ ├── notify_icon_red.png │ ├── notify_icon_rust.png │ ├── org-sash.png │ ├── org-sash.psd │ ├── person_photo_upload_img.png │ ├── person_photo_upload_img_sm.png │ ├── phl-icon.png │ ├── progress-background.png │ ├── project-overview-dropshadow.png │ ├── rails.png │ ├── rainbow.png │ ├── sanscons_16 │ │ ├── add.png │ │ ├── addressbook.png │ │ ├── alert.png │ │ ├── apple.png │ │ ├── arrow1_e.png │ │ ├── arrow1_n.png │ │ ├── arrow1_ne.png │ │ ├── arrow1_nw.png │ │ ├── arrow1_s.png │ │ ├── arrow1_se.png │ │ ├── arrow1_sw.png │ │ ├── arrow1_w.png │ │ ├── arrow2_e.png │ │ ├── arrow2_n.png │ │ ├── arrow2_ne.png │ │ ├── arrow2_nw.png │ │ ├── arrow2_s.png │ │ ├── arrow2_se.png │ │ ├── arrow2_sw.png │ │ ├── arrow2_w.png │ │ ├── arrow3_e.png │ │ ├── arrow3_n.png │ │ ├── arrow3_ne.png │ │ ├── arrow3_nw.png │ │ ├── arrow3_s.png │ │ ├── arrow3_se.png │ │ ├── arrow3_sw.png │ │ ├── arrow3_w.png │ │ ├── ascii.png │ │ ├── back.png │ │ ├── bigsmile.png │ │ ├── binary.png │ │ ├── blah.png │ │ ├── bstop.png │ │ ├── buy.png │ │ ├── calday.png │ │ ├── calendar.png │ │ ├── camera.png │ │ ├── cart.png │ │ ├── cd.png │ │ ├── cellphone.png │ │ ├── chat.png │ │ ├── check.png │ │ ├── close.png │ │ ├── comment.png │ │ ├── cube.png │ │ ├── day.png │ │ ├── denied.png │ │ ├── document.png │ │ ├── download.png │ │ ├── edit.png │ │ ├── eject.png │ │ ├── equalizer.png │ │ ├── first.png │ │ ├── flag.png │ │ ├── flash.png │ │ ├── folder.png │ │ ├── forward.png │ │ ├── frown.png │ │ ├── ftp.png │ │ ├── graph.png │ │ ├── heart.png │ │ ├── home.png │ │ ├── html.png │ │ ├── ipod.png │ │ ├── last.png │ │ ├── lock.png │ │ ├── loop.png │ │ ├── mail.png │ │ ├── man.png │ │ ├── manman.png │ │ ├── music.png │ │ ├── mute.png │ │ ├── mute_centered.png │ │ ├── newwindow.png │ │ ├── next.png │ │ ├── night.png │ │ ├── open.png │ │ ├── pause.png │ │ ├── phone.png │ │ ├── play.png │ │ ├── previous.png │ │ ├── quicktime.png │ │ ├── redo.png │ │ ├── reload.png │ │ ├── sad.png │ │ ├── save.png │ │ ├── scream.png │ │ ├── search.png │ │ ├── seconds.png │ │ ├── smile.png │ │ ├── smirk.png │ │ ├── star.png │ │ ├── stop.png │ │ ├── subtract.png │ │ ├── switch.png │ │ ├── target.png │ │ ├── tcp.png │ │ ├── time.png │ │ ├── toggle.png │ │ ├── tongue.png │ │ ├── tools.png │ │ ├── trackback.png │ │ ├── trash.png │ │ ├── tv.png │ │ ├── type.png │ │ ├── undo.png │ │ ├── unlock.png │ │ ├── upload.png │ │ ├── user.png │ │ ├── video.png │ │ ├── volume_high.png │ │ ├── volume_low.png │ │ ├── wifi.png │ │ ├── window.png │ │ ├── woman.png │ │ ├── womanman.png │ │ ├── work.png │ │ ├── zoomin.png │ │ └── zoomout.png │ ├── sea-icon.png │ ├── search_icon-15.png │ ├── search_icon-50.png │ ├── sf-icon.png │ ├── stats-border.png │ ├── step-indicate.png │ ├── target-icon.png │ ├── tmp-geekcorps-logo.png │ ├── twitter-24x24.png │ ├── wayfinder-check.png │ ├── wayfinder-item-background1.png │ ├── wayfinder-item-background2.png │ ├── wayfinder-plus.png │ ├── widget-border.png │ ├── wizard-field-tip-border.png │ └── wizard-general-tip-border.png ├── javascripts │ ├── geekcorps.js │ └── lib │ │ ├── backbone.js │ │ ├── jquery-ujs.js │ │ ├── jquery.cookie.js │ │ ├── jquery.hoverexpand.js │ │ ├── jquery.isotope.min.js │ │ ├── jquery.js │ │ ├── jquery.min.js │ │ ├── jquery.sortElements.js │ │ └── underscore.js ├── robots.txt └── stylesheets │ ├── .gitkeep │ ├── geekcorps.css │ └── reset.css ├── script ├── delayed_job └── rails ├── spec ├── controllers │ ├── comments_controller_spec.rb │ ├── deploy_task_resources_controller_spec.rb │ ├── details_controller_spec.rb │ ├── milestones_controller_spec.rb │ ├── people_controller_spec.rb │ ├── regions_controller_spec.rb │ ├── steps_controller_spec.rb │ ├── team_members_controller_spec.rb │ └── teams_controller_spec.rb ├── factories │ ├── batchbook_people.xml │ ├── factories.rb │ ├── github_contacts.json │ ├── github_contacts_update.json │ └── github_contacts_update_coder.json ├── models │ ├── activity_feed_spec.rb │ ├── app_spec.rb │ ├── batchbook_contact_spec.rb │ ├── comment_spec.rb │ ├── detail_spec.rb │ ├── github_contact_spec.rb │ ├── milestone_spec.rb │ ├── person_spec.rb │ ├── region_spec.rb │ ├── team_member_spec.rb │ ├── team_spec.rb │ └── user_spec.rb ├── spec_helper.rb └── views │ └── comments │ └── create.html.erb_spec.rb └── vendor └── plugins └── .gitkeep /.bundle/config: -------------------------------------------------------------------------------- 1 | --- 2 | BUNDLE_WITHOUT: development:test 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | *.sqlite3 3 | *.dat 4 | config/settings.yml 5 | .config 6 | .directory 7 | .elc 8 | .redcar 9 | .yardoc 10 | /.emacs.desktop 11 | /.emacs.desktop.lock 12 | Desktop.ini 13 | Gemfile.lock 14 | Icon? 15 | InstalledFiles 16 | Session.vim 17 | Thumbs.db 18 | \#*\# 19 | _yardoc 20 | auto-save-list 21 | coverage 22 | doc/ 23 | lib/bundler/man 24 | pkg 25 | pkg/* 26 | rdoc 27 | spec/reports 28 | test/tmp 29 | test/version_tmp 30 | tmp/* 31 | tmtags 32 | tramp 33 | *.log 34 | .DS_Store 35 | public/system/* 36 | -------------------------------------------------------------------------------- /.rspec: -------------------------------------------------------------------------------- 1 | --colour --drb 2 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'http://rubygems.org' 2 | source 'http://gems.rubyforge.org' 3 | 4 | gem 'rails', '3.0.7' 5 | gem 'delayed_job' 6 | gem 'jquery-rails' 7 | gem 'json' 8 | gem 'sqlite3' 9 | gem 'hominid' 10 | gem 'will_paginate' 11 | #gem 'meta_search' 12 | gem 'acts-as-taggable-on' 13 | gem 'multi_xml' 14 | gem "aws-s3" 15 | gem 'paperclip' 16 | gem 'omniauth', '>= 0.2.6' 17 | gem 'devise' 18 | 19 | 20 | gem 'twitter' 21 | gem 'linkedin' 22 | gem 'mogli' 23 | 24 | gem "inherited_resources" 25 | 26 | gem "haml", "~> 3.0.18" 27 | gem "formtastic" 28 | gem 'uuid' 29 | 30 | group :test, :jenkins do 31 | gem 'spork' 32 | gem 'factory_girl_rails' 33 | gem 'mocha' 34 | gem 'rspec-rails' 35 | gem 'ZenTest' 36 | gem 'simplecov' 37 | gem 'webmock' 38 | gem 'yard' 39 | gem 'faker' 40 | end 41 | -------------------------------------------------------------------------------- /app/controllers/apps_controller.rb: -------------------------------------------------------------------------------- 1 | class AppsController < InheritedResources::Base 2 | before_filter :require_admin!, :except => :index 3 | 4 | def index 5 | @apps = App.all 6 | end 7 | end 8 | -------------------------------------------------------------------------------- /app/controllers/comments_controller.rb: -------------------------------------------------------------------------------- 1 | class CommentsController < ApplicationController 2 | before_filter :authenticate_user! 3 | 4 | def create 5 | @comment = Comment.new(params[:comment]) 6 | @comment.user = current_user 7 | if @comment.save 8 | flash[:success] = 'Comment added!' 9 | redirect_to :back 10 | else 11 | flash[:error] = 'We had a problem adding that comment' 12 | redirect_to :back 13 | end 14 | end 15 | 16 | end 17 | -------------------------------------------------------------------------------- /app/controllers/details_controller.rb: -------------------------------------------------------------------------------- 1 | class DetailsController < InheritedResources::Base 2 | end 3 | -------------------------------------------------------------------------------- /app/controllers/goals_controller.rb: -------------------------------------------------------------------------------- 1 | class GoalsController < InheritedResources::Base 2 | 3 | end 4 | -------------------------------------------------------------------------------- /app/controllers/languages_controller.rb: -------------------------------------------------------------------------------- 1 | class LanguagesController < InheritedResources::Base 2 | end 3 | -------------------------------------------------------------------------------- /app/controllers/members_controller.rb: -------------------------------------------------------------------------------- 1 | class MembersController < InheritedResources::Base 2 | before_filter :authenticate_user!, :except => [:show, :index] 3 | layout "apps" 4 | 5 | def create 6 | team = Team.where(:id => params[:team_id]).first 7 | @member = TeamMember.new(:user => current_user, :team_role => "supporter", :team => team) 8 | create! do |format| 9 | format.html { redirect_to team.to_url } 10 | end 11 | end 12 | 13 | end 14 | -------------------------------------------------------------------------------- /app/controllers/pages_controller.rb: -------------------------------------------------------------------------------- 1 | class PagesController < ApplicationController 2 | def privacy 3 | end 4 | 5 | def about 6 | end 7 | 8 | def api 9 | end 10 | 11 | def blog 12 | end 13 | 14 | def contact 15 | end 16 | 17 | def terms 18 | end 19 | 20 | end 21 | -------------------------------------------------------------------------------- /app/controllers/regions_controller.rb: -------------------------------------------------------------------------------- 1 | class RegionsController < InheritedResources::Base 2 | before_filter :require_admin! 3 | end 4 | -------------------------------------------------------------------------------- /app/controllers/roles_controller.rb: -------------------------------------------------------------------------------- 1 | class RolesController < InheritedResources::Base 2 | end 3 | -------------------------------------------------------------------------------- /app/controllers/skills_controller.rb: -------------------------------------------------------------------------------- 1 | class SkillsController < InheritedResources::Base 2 | end 3 | -------------------------------------------------------------------------------- /app/controllers/team_members_controller.rb: -------------------------------------------------------------------------------- 1 | class TeamMembersController < InheritedResources::Base 2 | before_filter :authenticate_user! 3 | 4 | def update 5 | @team_member = TeamMember.find params[:id] 6 | if @team_member.team.admin? current_user 7 | toggle_admin_status @team_member 8 | redirect_to :back 9 | else 10 | flash[:error] = 'You gotta have power to promote folks around here' 11 | redirect_to :back 12 | end 13 | end 14 | 15 | private 16 | 17 | def toggle_admin_status(team_member) 18 | if team_member.admin == false 19 | promote team_member 20 | else team_member.admin == true 21 | demote team_member 22 | end 23 | end 24 | 25 | def promote(team_member) 26 | team_member.admin = true 27 | if team_member.save 28 | flash[:success] = "#{team_member.user.person.name} has been promoted to admin for #{team_member.team.name}" 29 | else 30 | flash[:error] = "Oh noes! There was an error promoting this person" 31 | end 32 | end 33 | 34 | def demote(team_member) 35 | team_member.admin = false 36 | if team_member.save 37 | flash[:success] = "#{team_member.user.person.name} has been demoted from admin of #{team_member.team.name}" 38 | else 39 | flash[:error] = "Oh noes! There was an error promoting this person" 40 | end 41 | end 42 | end 43 | -------------------------------------------------------------------------------- /app/controllers/teams_controller.rb: -------------------------------------------------------------------------------- 1 | class TeamsController < InheritedResources::Base 2 | before_filter :authenticate_user!, :except => [:show, :index, :people] 3 | 4 | def create 5 | app = App.where(:id => params[:app_id]).first 6 | @team = Team.new(:region => current_user.region, :app => app, :team_type => "application") 7 | @team.team_members.build(:user => current_user, :team_role => "organizer", :admin => true, :app => app) 8 | create! 9 | end 10 | 11 | def show 12 | find_team 13 | end 14 | 15 | def people 16 | find_team 17 | users = User.joins(:team_members).where(:team_members => {:team_id => @team.id}) 18 | @people = users.map(&:person) 19 | end 20 | 21 | 22 | end 23 | -------------------------------------------------------------------------------- /app/controllers/users/sessions_controller.rb: -------------------------------------------------------------------------------- 1 | class Users::SessionsController < ApplicationController 2 | def new 3 | @signin_data = SignInData.new 4 | end 5 | 6 | def create 7 | @signin_data = SignInData.new(params[:sign_in_data]) 8 | render(:action => :new) and return unless @signin_data.valid? 9 | 10 | session[:login_email] = @signin_data.email 11 | 12 | if @signin_data.provider == 'auto' 13 | redirect_to :controller => '/authentications', :action => :auto, :email => @signin_data.email 14 | else 15 | redirect_to "/auth/#{@signin_data.provider}" 16 | end 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /app/controllers/users_controller.rb: -------------------------------------------------------------------------------- 1 | class UsersController < InheritedResources::Base 2 | 3 | before_filter :authenticate_user!, :only => [:welcome, :home] 4 | before_filter :require_admin!, :except => [:show, :home, :welcome] 5 | 6 | def show 7 | if resource.person 8 | redirect_to person_path(resource.person) 9 | else 10 | if current_user && current_user.admin? 11 | redirect_to users_path(:anchor => "user_#{resource.id}") 12 | else 13 | raise ActiveRecord::RecordNotFound 14 | end 15 | end 16 | end 17 | 18 | def home 19 | redirect_to :action => :welcome and return unless current_user.person.try(:reviewed) 20 | end 21 | 22 | def welcome 23 | redirect_to :action => :home and return if current_user.person.try(:reviewed) 24 | 25 | @name = current_user.name || params[:name] 26 | @person = current_user.person || current_user.authentications.first.to_person || Person.new 27 | 28 | if @person.new_record? 29 | if @name.present? 30 | @possible_duplicates = Person.unclaimed.where(:name => @name).all 31 | 32 | name_parts = @name.split(' ') 33 | name_part_query = (["name LIKE ?"] * name_parts.size).join(' or ') 34 | @possible_duplicates += Person.unclaimed.where(name_part_query, *name_parts.map{|p| "%#{p}%"}).take(10) 35 | 36 | @possible_duplicates.uniq! 37 | end 38 | end 39 | end 40 | 41 | def index 42 | @users = User.includes(:authentications, :person).all 43 | end 44 | 45 | # def destroy 46 | 47 | def adminify 48 | @user.admin = !(@user.admin) 49 | @user.save 50 | 51 | redirect_to users_path 52 | end 53 | end 54 | 55 | -------------------------------------------------------------------------------- /app/helpers/authentications_helper.rb: -------------------------------------------------------------------------------- 1 | module AuthenticationsHelper 2 | def provider_icon(provider, size=32) 3 | path = File.join('authbuttons',"#{provider}_#{size}.png") 4 | provider_name = OmniAuth::Utils.camelize(provider) 5 | 6 | if File.exists?(Rails.root.join('public', 'images', path)) 7 | image_tag(path, :alt => provider_name) 8 | else 9 | provider_name 10 | end 11 | end 12 | 13 | def auth_label(authentication) 14 | if authentication.info[:nickname].present? 15 | name = authentication.info[:nickname] 16 | else 17 | name = authentication.info[:name] 18 | end 19 | "#{name} on #{provider_name(authentication.provider)}" 20 | end 21 | end 22 | -------------------------------------------------------------------------------- /app/helpers/people_helper.rb: -------------------------------------------------------------------------------- 1 | module PeopleHelper 2 | end 3 | -------------------------------------------------------------------------------- /app/models/activity_feed.rb: -------------------------------------------------------------------------------- 1 | class ActivityFeed < ActiveRecord::Base 2 | belongs_to :team 3 | belongs_to :feedable, :polymorphic => true 4 | 5 | validates_presence_of :team_id 6 | validates_presence_of :feedable 7 | 8 | end 9 | -------------------------------------------------------------------------------- /app/models/batchbook_contact.rb: -------------------------------------------------------------------------------- 1 | class BatchbookContact < ActiveRecord::Base 2 | acts_as_taggable 3 | validates_uniqueness_of :location_id, :on => :create, :message => "must be unique" 4 | 5 | # grabs batchbook contacts 6 | # 7 | # @return GithubContacts array 8 | # @example GithubContact.new.get_contacts 9 | 10 | def get_contacts(page=1, number=50) 11 | before_count = BatchbookContact.count 12 | contacts = batchbook_request("/people.xml?offset=#{page}&limit=#{number}") 13 | contacts[0][1].each do |contact| 14 | create_contact(contact) 15 | end 16 | 17 | # after_count = BatchbookContact.count 18 | # BatchbookContact.new.delayed.get_contacts(page+1) unless before_count == after_count 19 | end 20 | 21 | def batchbook_request(endpoint) 22 | MultiXml.parser = :rexml 23 | Net::HTTP.start("codeforamerica.batchbook.com", :use_ssl => true) {|http| 24 | req = Net::HTTP::Get.new("/service" + endpoint) 25 | req.basic_auth ENV['batchbook_key'], 'x' 26 | response = http.request(req) 27 | MultiXml.parse(response.body) 28 | } 29 | end 30 | 31 | def create_contact(contact) 32 | # prep the hash 33 | contact["batchbook_id"] = contact["id"] 34 | tags = contact["tags"] 35 | locations = contact["locations"] 36 | %w(id tags contacts locations large_image small_image title mega_comments notes company_id company).each { |x| contact.delete(x) } 37 | contact["locations"].each do |location| 38 | location["location_id"] = location["id"] 39 | %w(id).each { |x| location.delete(x) } 40 | end 41 | end 42 | 43 | end 44 | -------------------------------------------------------------------------------- /app/models/comment.rb: -------------------------------------------------------------------------------- 1 | class Comment < ActiveRecord::Base 2 | belongs_to :commentable, :polymorphic => true 3 | belongs_to :user 4 | belongs_to :team 5 | has_one :activity_feed, :as => :feedable 6 | after_create :add_comment_to_activity_feed 7 | 8 | validates_presence_of :user, :on => :create, :message => "can't be blank" 9 | validates_presence_of :team, :on => :create, :message => "can't be blank" 10 | validates_presence_of :text, :on => :create, :message => "can't be blank" 11 | validates_presence_of :commentable, :on => :create, :message => "can't be blank" 12 | 13 | def add_comment_to_activity_feed 14 | activity = self.text[0..100] 15 | ActivityFeed.create(:team => self.team, :activity => figure_out_comment_text, :feedable => self ) 16 | end 17 | 18 | def figure_out_comment_text 19 | case self.commentable_type 20 | when "DeployTask" 21 | self.text 22 | when "Team" 23 | self.text 24 | when "Resource" 25 | else 26 | end 27 | end 28 | 29 | def commentable_type=(sType) 30 | super(sType.to_s.classify.constantize.base_class.to_s) 31 | end 32 | 33 | end 34 | -------------------------------------------------------------------------------- /app/models/contact_source.rb: -------------------------------------------------------------------------------- 1 | class ContactSource < ActiveRecord::Base 2 | has_many :github_contacts 3 | validates_presence_of :name, :on => :create, :message => "can't be blank" 4 | end 5 | -------------------------------------------------------------------------------- /app/models/cron_process.rb: -------------------------------------------------------------------------------- 1 | class CronProcess 2 | 3 | # updates all contacts in the database using delayed job 4 | def update_contacts 5 | GithubContact.where("updated_at < '#{1.week.ago}'").all.each { |x| x.delay.update_contact} 6 | end 7 | 8 | end -------------------------------------------------------------------------------- /app/models/deploy_task.rb: -------------------------------------------------------------------------------- 1 | class DeployTask < ActiveRecord::Base 2 | belongs_to :app 3 | has_many :team_deploy_tasks 4 | has_many :teams, :through => :team_deploy_tasks 5 | has_many :deploy_task_resources 6 | has_many :comments, :as => :commentable 7 | 8 | accepts_nested_attributes_for :deploy_task_resources 9 | 10 | end 11 | -------------------------------------------------------------------------------- /app/models/deploy_task_resource.rb: -------------------------------------------------------------------------------- 1 | class DeployTaskResource < ActiveRecord::Base 2 | belongs_to :deploy_task 3 | has_many :comments, :as => :commentable 4 | belongs_to :team 5 | 6 | end 7 | -------------------------------------------------------------------------------- /app/models/description.rb: -------------------------------------------------------------------------------- 1 | class Description < DeployTaskResource 2 | 3 | end 4 | -------------------------------------------------------------------------------- /app/models/detail.rb: -------------------------------------------------------------------------------- 1 | class Detail < ActiveRecord::Base 2 | belongs_to :app 3 | belongs_to :team 4 | 5 | validates_uniqueness_of :name, :on => :create, :scope => [:app_id, :team_id] 6 | validates_presence_of :name, :setting, :app, :team 7 | 8 | before_validation :on => :create do 9 | self.app ||= self.team.app 10 | self.team ||= self.app.core_team 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /app/models/heading.rb: -------------------------------------------------------------------------------- 1 | class Heading < DeployTaskResource 2 | 3 | end 4 | -------------------------------------------------------------------------------- /app/models/milestone.rb: -------------------------------------------------------------------------------- 1 | class Milestone < DeployTask 2 | has_many :steps, :foreign_key => :parent_id, :inverse_of => :milestone 3 | belongs_to :app 4 | scope :updated_at 5 | 6 | def skill_list 7 | skills = steps.inject([]) do |a,b| 8 | a += b.skill_list 9 | a.uniq 10 | end 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /app/models/region.rb: -------------------------------------------------------------------------------- 1 | class Region < ActiveRecord::Base 2 | has_many :teams 3 | has_many :users 4 | 5 | validates_uniqueness_of :city, :on => :create, :scope => :state 6 | validates_presence_of :nick_name 7 | 8 | has_attached_file :photo 9 | 10 | def pretty_name 11 | self.city + ", " + self.state 12 | end 13 | 14 | end 15 | -------------------------------------------------------------------------------- /app/models/sign_in_data.rb: -------------------------------------------------------------------------------- 1 | class SignInData 2 | include ActiveModel::AttributeMethods 3 | include ActiveModel::Conversion 4 | include ActiveModel::Validations 5 | include ActiveModel::Naming 6 | 7 | attr_accessor :email, :provider 8 | 9 | validates :provider, :presence => true 10 | validates :email, :presence => true 11 | 12 | def initialize(params = {}) 13 | params ||= {} 14 | self.email = params[:email] 15 | self.provider = params[:provider] 16 | end 17 | 18 | def persisted? 19 | false 20 | end 21 | end 22 | -------------------------------------------------------------------------------- /app/models/step.rb: -------------------------------------------------------------------------------- 1 | class Step < DeployTask 2 | belongs_to :milestone, :foreign_key => :parent_id, :inverse_of => :steps 3 | belongs_to :app 4 | 5 | acts_as_taggable_on :tags, :skills 6 | 7 | end 8 | -------------------------------------------------------------------------------- /app/models/team.rb: -------------------------------------------------------------------------------- 1 | class Team < ActiveRecord::Base 2 | has_many :team_members 3 | has_many :members, :through => :team_members, :source => :user 4 | has_many :admins, :through => :team_members, :source => :user, :conditions => {:team_members => {:admin => true}} 5 | belongs_to :region 6 | has_many :details 7 | belongs_to :app 8 | before_create :create_team_name 9 | has_many :team_deploy_tasks 10 | has_many :deploy_tasks, :through => :team_deploy_tasks 11 | has_many :activity_feeds 12 | has_many :comments, :as => :commentable 13 | 14 | validates_presence_of :region, :unless => Proc.new { |team| team.team_type == 'core' } 15 | validates_uniqueness_of :region_id, :scope => :app_id, :unless => Proc.new { |team| team.team_type == 'core' } 16 | 17 | # creates a unique team name based upon region's nickname "SF" and the app name 18 | 19 | def create_team_name 20 | if self.team_type != "core" 21 | new_name = region.nick_name.to_s + "-" + app.name.to_s 22 | self.name = new_name.gsub(" ", "-").downcase 23 | else 24 | self.name = app.name.gsub(" ", "-").downcase 25 | end 26 | end 27 | 28 | def to_url 29 | "/" + self.name 30 | end 31 | 32 | def pretty_name 33 | self.name.gsub('-', " ").downcase.titleize 34 | end 35 | 36 | def admin?(user) 37 | admins.include? user 38 | end 39 | 40 | end 41 | -------------------------------------------------------------------------------- /app/models/team_deploy_task.rb: -------------------------------------------------------------------------------- 1 | class TeamDeployTask < ActiveRecord::Base 2 | belongs_to :deploy_task 3 | belongs_to :team 4 | end 5 | -------------------------------------------------------------------------------- /app/models/team_member.rb: -------------------------------------------------------------------------------- 1 | class TeamMember < ActiveRecord::Base 2 | belongs_to :user 3 | belongs_to :team 4 | belongs_to :app 5 | has_many :activity_feeds, :as => :feedable 6 | 7 | validates_presence_of :user, :team, :app 8 | 9 | before_validation :on => :create do 10 | self.app ||= self.team.app 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /app/models/user.rb: -------------------------------------------------------------------------------- 1 | class User < ActiveRecord::Base 2 | # Setup accessible (or protected) attributes for your model 3 | attr_accessible :email, :password, :password_confirmation, :remember_me 4 | attr_protected :admin 5 | 6 | has_one :person 7 | has_many :team_members 8 | has_many :teams, :through => :team_members, :source => :team 9 | belongs_to :region 10 | has_many :comments 11 | 12 | scope :admins, joins(:team_members).where(:team_members => {:admin => true}) 13 | 14 | has_many :authentications, :dependent => :destroy do 15 | def info_get(key) 16 | info_with_key = self.map(&:info).compact.detect{|info| info[key].present? } 17 | return info_with_key[key] if info_with_key.present? 18 | end 19 | end 20 | 21 | devise :rememberable, :trackable 22 | 23 | def avatar_url 24 | if self.person.present? 25 | self.person.photo.url(:thumb) 26 | elsif self.authentications.present? 27 | (self.authentications.info_get(:image) || '/images/geekcorpsavatar1.png') 28 | else 29 | '/images/geekcorpsavatar1.png' 30 | end 31 | end 32 | 33 | def name 34 | self.person.try(:name) || self.authentications.info_get(:name) || "User #{self.id}" 35 | end 36 | 37 | def label_for_admin 38 | "#{self.id}: #{self.name} #{self.person.present? ? '*' : ''}" 39 | end 40 | 41 | def default_authentication 42 | self.authentications.first 43 | end 44 | 45 | def has_auth_from?(provider) 46 | self.authentications.via(provider).present? 47 | end 48 | 49 | end 50 | 51 | -------------------------------------------------------------------------------- /app/views/apps/_activity_stream.html.erb: -------------------------------------------------------------------------------- 1 |
2 | Yo, I'm an activity stream! How are you going to collect activities? Do it and iterate over me!! 3 |
4 | -------------------------------------------------------------------------------- /app/views/apps/_form.html.erb: -------------------------------------------------------------------------------- 1 | <%= form_for(@app) do |f| %> 2 | <% if @app.errors.any? %> 3 |
4 |

<%= pluralize(@app.errors.count, "error") %> prohibited this app from being saved:

5 | 6 | 11 |
12 | <% end %> 13 | 14 |
15 | <%= f.label :name %>
16 | <%= f.text_field :name %> 17 |
18 |
19 | <%= f.label :description %>
20 | <%= f.text_area :description %> 21 |
22 |
23 | <%= f.label :video_url %>
24 | <%= f.text_field :video_url %> 25 |
26 |
27 | <%= f.submit %> 28 |
29 | <% end %> 30 | -------------------------------------------------------------------------------- /app/views/apps/_header.html.erb: -------------------------------------------------------------------------------- 1 |

<%= header.name %>

2 | 11 | -------------------------------------------------------------------------------- /app/views/apps/_metric.html.erb: -------------------------------------------------------------------------------- 1 |
2 |
3 | 7 |
8 |
9 | 10 | <% if current_user && current_user.region %> 11 | <% if @app.teams.where(:region_id => current_user.region).blank?%> 12 | <%= button_to "Start this in #{current_user.region.nick_name}", app_teams_path(@app) %> 13 | <% else %> 14 | <%=link_to "Goto #{current_user.region.nick_name}'s Page", @app.teams.where(:region_id => current_user.region).first.to_url%> 15 | <% end %> 16 | <% else %> 17 | Join the Geek Corps to help start this project 18 | <% end %> 19 |
20 |
21 |
22 |
23 | -------------------------------------------------------------------------------- /app/views/apps/edit.html.erb: -------------------------------------------------------------------------------- 1 |

Editing app

2 | 3 | <%= render 'form' %> 4 | 5 | <%= link_to 'Show', @app %> | 6 | <%= link_to 'Back', apps_path %> 7 | -------------------------------------------------------------------------------- /app/views/apps/index.html.erb: -------------------------------------------------------------------------------- 1 | 2 | <% content_for(:page_heading) do %> 3 |
4 |

5 | Apps 6 |

7 |

8 |

9 |
10 | <% end %> 11 | 12 | <%= render :partial => 'list', :object => @apps %> 13 | 14 | -------------------------------------------------------------------------------- /app/views/apps/new.html.erb: -------------------------------------------------------------------------------- 1 |

New app

2 | 3 | <%= render 'form' %> 4 | 5 | <%= link_to 'Back', apps_path %> 6 | -------------------------------------------------------------------------------- /app/views/apps/people.html.erb: -------------------------------------------------------------------------------- 1 | <%= render :partial => 'header', :object => @app %> 2 | 3 |
4 |
5 | <%= render :partial => 'shared/list_item', :collection => @people %> 6 |
7 | 8 | 13 |
14 | 15 | -------------------------------------------------------------------------------- /app/views/apps/show.html.erb: -------------------------------------------------------------------------------- 1 | <%= render :partial => 'header', :object => @app %> 2 | 3 |
4 |
5 | 6 |
7 | <% unless @app.video.url == '/videos/original/missing.png' %> 8 | <%= video_tag @app.video.url, :id => 'app-video', :class => 'main-visual' %> 9 | <% else %> 10 | <%= image_tag @app.photo.url, :id => 'app-photo', :class => 'main-visual' %> 11 | <% end %> 12 |
13 |
14 | 15 | 16 |
17 |
18 | 19 |
20 |

About This Project

21 |

<%= @app.description %>

22 |
23 | 24 | <%= render :partial => 'activity_stream' %> 25 | 26 |
27 | 28 | 33 |
34 | 35 | -------------------------------------------------------------------------------- /app/views/authentications/_add_auth_form.html.erb: -------------------------------------------------------------------------------- 1 | 19 | -------------------------------------------------------------------------------- /app/views/authentications/_list.html.erb: -------------------------------------------------------------------------------- 1 | 12 | -------------------------------------------------------------------------------- /app/views/authentications/_login_form.html.erb: -------------------------------------------------------------------------------- 1 |
2 |

Sign In

3 | <%= form_for SignInData.new, :url => user_sessions_path do |f| %> 4 |

<%= f.label :email, "Email Address" %>
5 | <%= f.text_field :email, :size => nil, :autocorrect => "off", :autocapitalize => "off" %>

6 |

<%= f.label :provider, "Social Network Provider" %>
7 | <%= select :sign_in_data, :provider, Authentication::PROVIDER_OPTIONS %>
8 | Note, we only use social network authentication mechanisms such as Facebook connect. 9 |

10 | <%= f.submit "Sign in!", :id => "guide_submit" %> 11 | <% end %> 12 |
13 | 14 | -------------------------------------------------------------------------------- /app/views/authentications/_provider_list.html.erb: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /app/views/authentications/auth_failure.html.erb: -------------------------------------------------------------------------------- 1 |

Ack! Something went wrong!

2 |

We received an error of some kind back from your login provider. You can try again with the same login provider or choose another service.

3 |

Please pick a login provider to continue:

4 | <%= render :partial => 'provider_list' %> 5 | 6 | -------------------------------------------------------------------------------- /app/views/authentications/auto.html.erb: -------------------------------------------------------------------------------- 1 |

Eep! We couldn't find a way to log you in!

2 |

We tried to automatically pick a login provider for you based on your email address, but didn't find one.

3 |

Please pick a login provider to continue:

4 | <%= render :partial => 'provider_list' %> 5 | -------------------------------------------------------------------------------- /app/views/authentications/index.html.erb: -------------------------------------------------------------------------------- 1 |

Authentications

2 | <%= link_to 'New Authentication', new_authentication_path %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | <% for authentication in @authentications %> 13 | 14 | 19 | 20 | 21 | 22 | 27 | 28 | <% end %> 29 |
Provider Name Account Actions
15 | <% if authentication.info[:image] %> 16 | width=48 height=48 /> 17 | <% end %> 18 | <%= provider_icon(authentication.provider) %><%= authentication.info[:name] %><%= authentication.info[:nickname] %> 23 | <% if @authentications.size > 1 %> 24 | <%= link_to "Remove", authentication_path(authentication), :confirm => 'Are you sure?', :method => :delete %> 25 | <% end %> 26 |
30 | -------------------------------------------------------------------------------- /app/views/comments/create.html.erb: -------------------------------------------------------------------------------- 1 |

Comments#create

2 |

Find me in app/views/comments/create.html.erb

3 | -------------------------------------------------------------------------------- /app/views/details/_form.html.erb: -------------------------------------------------------------------------------- 1 | <%= form_for(@detail) do |f| %> 2 | <% if @detail.errors.any? %> 3 |
4 |

<%= pluralize(@detail.errors.count, "error") %> prohibited this detail from being saved:

5 | 6 | 11 |
12 | <% end %> 13 | 14 |
15 | <%= f.label :app_id %>
16 | <%= f.text_field :app_id %> 17 |
18 |
19 | <%= f.label :team_id %>
20 | <%= f.text_field :team_id %> 21 |
22 |
23 | <%= f.label :name %>
24 | <%= f.text_field :name %> 25 |
26 |
27 | <%= f.label :setting %>
28 | <%= f.text_field :setting %> 29 |
30 |
31 | <%= f.submit %> 32 |
33 | <% end %> 34 | -------------------------------------------------------------------------------- /app/views/details/edit.html.erb: -------------------------------------------------------------------------------- 1 |

Editing detail

2 | 3 | <%= render 'form' %> 4 | 5 | <%= link_to 'Show', @detail %> | 6 | <%= link_to 'Back', details_path %> 7 | -------------------------------------------------------------------------------- /app/views/details/index.html.erb: -------------------------------------------------------------------------------- 1 |

Listing details

2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | <% @details.each do |detail| %> 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | <% end %> 25 |
AppTeamNameSetting
<%= detail.app_id %><%= detail.team_id %><%= detail.name %><%= detail.setting %><%= link_to 'Show', detail %><%= link_to 'Edit', edit_detail_path(detail) %><%= link_to 'Destroy', detail, :confirm => 'Are you sure?', :method => :delete %>
26 | 27 |
28 | 29 | <%= link_to 'New Detail', new_detail_path %> 30 | -------------------------------------------------------------------------------- /app/views/details/new.html.erb: -------------------------------------------------------------------------------- 1 |

New detail

2 | 3 | <%= render 'form' %> 4 | 5 | <%= link_to 'Back', details_path %> 6 | -------------------------------------------------------------------------------- /app/views/details/show.html.erb: -------------------------------------------------------------------------------- 1 |

<%= notice %>

2 | 3 |

4 | App: 5 | <%= @detail.app_id %> 6 |

7 | 8 |

9 | Team: 10 | <%= @detail.team_id %> 11 |

12 | 13 |

14 | Name: 15 | <%= @detail.name %> 16 |

17 | 18 |

19 | Setting: 20 | <%= @detail.setting %> 21 |

22 | 23 | 24 | <%= link_to 'Edit', edit_detail_path(@detail) %> | 25 | <%= link_to 'Back', details_path %> 26 | -------------------------------------------------------------------------------- /app/views/layouts/_google_analytics.html.erb: -------------------------------------------------------------------------------- 1 | <% if SETTINGS["google_analytics_id"].present? %> 2 | 15 | <% end -%> 16 | -------------------------------------------------------------------------------- /app/views/layouts/application.html.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | <% if page_title %> 7 | <%= page_title %> 8 | <% else %> 9 | <%= "#{SETTINGS['organization']['name']}: #{SETTINGS['organization']['city']}'s Tech Directory"%> 10 | <% end %> 11 | 12 | <%= stylesheet_link_tag 'reset', 'geekcorps' %> 13 | <%= javascript_include_tag 'lib/jquery.min.js', 'lib/jquery-ujs', 'lib/jquery.cookie.js', 'lib/jquery.isotope.min.js', 'lib/jquery.hoverexpand.js', 'lib/jquery.sortElements.js', 'geekcorps.js' %> 14 | <%= csrf_meta_tag %> 15 | 16 | 17 | <%= render :partial => 'shared/header' %> 18 | 19 | 20 |
21 | <%= yield(:page_heading) %> 22 | <%= render_flash %> 23 | <%= yield %> 24 |
25 | 26 | <%= render :partial => 'shared/footer' %> 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /app/views/milestones/edit.html.erb: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | <%= image_tag @team.app.photo.url, :id => 'app-photo', :class => 'main-visual' %> 5 |
6 |

<%= @team.app.name %>

7 |
8 | <% unless @team.team_type == 'core' %> 9 |

<%=@team.region.city%>, <%=@team.region.state%>

10 | <% end%> 11 |

Organized by <% @team.team_members.where(:team_role => 'organizer').each do |organizer|%> 12 | <%=link_to organizer.user.person.name, organizer.user.person %> 13 | <%end%> 14 |

15 |
16 |
17 | <%= render "shared/guide_sidebar"%> 18 |
19 |
20 |
21 | <%= form_for @milestone do |f| %> 22 |
    23 |
  • Edit This Milestone
  • 24 |
  • <%= f.label :name, "Name:" %>
    <%= f.text_field :name %>

    25 |

    <%= f.label :description, "Description" %>
    <%= f.text_area :description %>

    26 | 27 |
  • 28 |
29 | <%= f.submit :id => "guide_submit" %> 30 | <% end %> 31 |
32 |
33 |
34 | 35 | -------------------------------------------------------------------------------- /app/views/milestones/new.html.erb: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | <%= image_tag @team.app.photo.url, :id => 'app-photo', :class => 'main-visual' %> 5 |
6 |

<%= @team.app.name %>

7 |
8 | <% unless @team.team_type == 'core' %> 9 |

<%=@team.region.city%>, <%=@team.region.state%>

10 | <% end%> 11 |

Organized by <% @team.team_members.where(:team_role => 'organizer').each do |organizer|%> 12 | <%=link_to organizer.user.person.name, organizer.user.person %> 13 | <%end%> 14 |

15 |
16 |
17 | <%= render "shared/guide_sidebar"%> 18 |
19 |
20 | <%= form_for @milestone do |f| %> 21 |

<%= f.label :name, "Name:" %><%= f.text_field :name %>

22 |

<%= f.label :description, "Description" %>
<%= f.text_area :description %>

23 | <%= f.hidden_field :goal%> 24 | 25 | <%= f.submit %> 26 | <% end %> 27 |
28 |
29 | 30 | -------------------------------------------------------------------------------- /app/views/pages/about.html.erb: -------------------------------------------------------------------------------- 1 |

Pages#about

2 |

Find me in app/views/pages/about.html.erb

3 | -------------------------------------------------------------------------------- /app/views/pages/api.html.erb: -------------------------------------------------------------------------------- 1 |

Pages#api

2 |

Find me in app/views/pages/api.html.erb

3 | -------------------------------------------------------------------------------- /app/views/pages/blog.html.erb: -------------------------------------------------------------------------------- 1 |

Pages#blog

2 |

Find me in app/views/pages/blog.html.erb

3 | -------------------------------------------------------------------------------- /app/views/pages/contact.html.erb: -------------------------------------------------------------------------------- 1 |

Pages#contact

2 |

Find me in app/views/pages/contact.html.erb

3 | -------------------------------------------------------------------------------- /app/views/pages/privacy.html.erb: -------------------------------------------------------------------------------- 1 |

Pages#privacy

2 |

Find me in app/views/pages/privacy.html.erb

3 | -------------------------------------------------------------------------------- /app/views/pages/terms.html.erb: -------------------------------------------------------------------------------- 1 |

Pages#terms

2 |

Find me in app/views/pages/terms.html.erb

3 | -------------------------------------------------------------------------------- /app/views/people/_common_skills.html.erb: -------------------------------------------------------------------------------- 1 |
2 |

Common Tags

3 | <%=get_skills%> 4 |
-------------------------------------------------------------------------------- /app/views/people/_form.html.erb: -------------------------------------------------------------------------------- 1 | <% form_for(@person) do |f| %> 2 |

<%= f.label :name, "Name" %>
3 | <%= f.text_field :name %>

4 |

<%= f.label :location, "Region" %>
5 | <%= select :person, :location, 6 | Region.all.map { |x| ["#{x.city}, #{x.state}", x.id]} %>

7 |

<%= f.label :website, "Website" %>
8 | <%= f.text_field :url, :label => 'Website' %>

9 |

<%= f.label :skill_list, "Tag List" %>
10 | <%= f.text_field :skill_list, :input_html => {:class => 'tags'}%>

11 |

<%= f.label :bio, "Bio" %>
12 | <%= f.text_area :bio, :as => :text%>

13 | <%=f.submit%> 14 | <% end %> 15 | -------------------------------------------------------------------------------- /app/views/people/_list.html.erb: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/views/people/_new_form.html.erb: -------------------------------------------------------------------------------- 1 | <% form_for(@person, :html => {:multipart => true}) do |f| %> 2 |

<%= f.label :name, "Name" %>
3 | <%= f.text_field :name, :value => current_user.authentications.first.info[:name] %>

4 |

<%= f.label :location, "Region" %>
5 | <%= select :person, :location, 6 | Region.all.map { |x| ["#{x.city}, #{x.state}", x.id]} %>

7 |

<%= f.label :website, "Website" %>
8 | <%= f.text_field :url, :label => 'Website' %>

9 |

<%= f.label :skill_list, "Tag List" %>
10 | <%= f.text_field :skill_list, :input_html => {:class => 'tags'}%>

11 |

<%= f.label :bio, "Bio" %>
12 | <%= f.text_area :bio, :value => current_user.authentications.first.info[:description]%>

13 |

<%= current_user.authentications.first.info[:image].present? ? image_tag(current_user.authentications.first.info[:image], :size => '220') : "We can't seem to find a photo for you" %>

14 |

<%= f.label :photo_import_url, "Import a photo from the web…" %><%=f.text_field :photo_import_url, :value => current_user.authentications.first.info[:image] %> 15 |

16 |

<%= f.label :photo, "…or upload one from your computer." %>
17 |

18 | <%= f.file_field :photo, :id => "person_photo_upload" %> 19 |
20 | 21 | 22 |
23 |
24 |

25 | <%=f.submit%>

26 | <% end %> 27 | -------------------------------------------------------------------------------- /app/views/people/_person_comments.html.erb: -------------------------------------------------------------------------------- 1 |
2 |
3 | <% comment.comments.order("created_at DESC").each do |feed| %> 4 |
5 | <%= activity_image(feed)%> 6 | <%=feed.text%> 7 | <%= activity_type(feed)%>, <%= time_ago_in_words(feed.created_at)%> 8 |
9 | <% end %> 10 |
11 |
12 | -------------------------------------------------------------------------------- /app/views/people/_person_edit_image.html.erb: -------------------------------------------------------------------------------- 1 | 28 | 29 | -------------------------------------------------------------------------------- /app/views/people/_person_header.html.erb: -------------------------------------------------------------------------------- 1 |
2 | <%= link_to image_tag(@person.photo.url, :id => 'person-photo', :class => 'main-visual'), @person %> 3 | <% if @person.user.team_members.where(:team_role => "organizer") %> <% end %> 4 |
5 |

<%=link_to "Hi #{@person.name}!", @person %>

6 | <% if @person.user && @person.user.region %> 7 |

<%=@person.user.region.city%>, <%=@person.user.region.state%>

8 | <% end %> 9 | <% if !@person.skill_list.blank? %> 10 |

Tags: <%= render :partial => 'shared/tag_list', :collection => @person.skill_list, :as => :skill %>

11 | <% end %> 12 | <% if user_signed_in? and current_user!=@person.user %> 13 |

Invite <%= @person.name %> to join one of your teams »

14 | <% end %> 15 | -------------------------------------------------------------------------------- /app/views/people/_person_teams.html.erb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/app/views/people/_person_teams.html.erb -------------------------------------------------------------------------------- /app/views/people/_team_list.html.erb: -------------------------------------------------------------------------------- 1 | 15 | -------------------------------------------------------------------------------- /app/views/people/claim.html.erb: -------------------------------------------------------------------------------- 1 |

<%= "Claiming #{@person.name}" %>

2 | 3 |

4 | This person was imported from <%= provider_name(@person.imported_from_provider) %> but you aren't logged in using your <%= provider_name(@person.imported_from_provider) %> account. 5 |

6 | 7 | <%= link_to "Sign in to #{provider_name(@person.imported_from_provider)} to continue", "/auth/#{@person.imported_from_provider}", :class => 'external' 8 | -------------------------------------------------------------------------------- /app/views/people/photo.html.erb: -------------------------------------------------------------------------------- 1 |
2 |

<%= @person.name %>

3 | <%= image_tag @person.photo.url %> 4 |
5 | -------------------------------------------------------------------------------- /app/views/people/show.html.erb: -------------------------------------------------------------------------------- 1 |
2 |
3 | <%= render "people/person_header"%> 4 |
5 |
6 |
7 |

Bio

8 | <% if @person.bio.present? %> 9 | <%= simple_format @person.bio %> 10 | <% end %> 11 |
12 |

Website

13 | <%= link_to( normalize_url(@person.url), normalize_url(@person.url), :class => 'url') if @person.url.present? %> 14 |
15 | 18 | <%= render "person_comments", :comment => @person.user%> 19 |
20 | 23 |
24 | 25 | 26 | -------------------------------------------------------------------------------- /app/views/regions/_form.html.erb: -------------------------------------------------------------------------------- 1 | <%= form_for(@region) do |f| %> 2 | <% if @region.errors.any? %> 3 |
4 |

<%= pluralize(@region.errors.count, "error") %> prohibited this region from being saved:

5 | 6 | 11 |
12 | <% end %> 13 | 14 |
15 | <%= f.label :city %>
16 | <%= f.text_field :city %> 17 |
18 |
19 | <%= f.label :state %>
20 | <%= f.text_field :state %> 21 |
22 |
23 | <%= f.submit %> 24 |
25 | <% end %> 26 | -------------------------------------------------------------------------------- /app/views/regions/edit.html.erb: -------------------------------------------------------------------------------- 1 |

Editing region

2 | 3 | <%= render 'form' %> 4 | 5 | <%= link_to 'Show', @region %> | 6 | <%= link_to 'Back', regions_path %> 7 | -------------------------------------------------------------------------------- /app/views/regions/index.html.erb: -------------------------------------------------------------------------------- 1 | <% content_for(:page_heading) do %> 2 |
3 |

4 | REGIONS! 5 |

6 |

7 | A different word for regions? Locales? Areas? 'Hoods? Something ...more playful? 8 |

9 |
10 | <% end %> 11 | 12 | <%= render :partial => 'shared/search', :locals => {:resource => @regions.first.class.new} %> 13 | 14 | <%= render :partial => 'shared/list', :object => @regions %> 15 | 16 | -------------------------------------------------------------------------------- /app/views/regions/new.html.erb: -------------------------------------------------------------------------------- 1 |

New region

2 | 3 | <%= render 'form' %> 4 | 5 | <%= link_to 'Back', regions_path %> 6 | -------------------------------------------------------------------------------- /app/views/regions/show.html.erb: -------------------------------------------------------------------------------- 1 |

<%= notice %>

2 | 3 |

4 | City: 5 | <%= @region.city %> 6 |

7 | 8 |

9 | State: 10 | <%= @region.state %> 11 |

12 | 13 | 14 | <%= link_to 'Edit', edit_region_path(@region) %> | 15 | <%= link_to 'Back', regions_path %> 16 | -------------------------------------------------------------------------------- /app/views/resources/_resource_list.html.erb: -------------------------------------------------------------------------------- 1 |
  • 2 |

    Resources

    3 |
      4 | <% resource_lists.each do |resource| %> 5 |
    1. 6 | <%=link_to resource.content, resource.link %> 7 | <% if user_signed_in? and (@team.admin?(current_user) || current_user.admin?) %> 8 | (<%=link_to "edit", edit_deploy_task_resource_path(resource)%>) 9 | <% end %> 10 |
    2. 11 | <% end %> 12 | <% if user_signed_in? and (@team.admin?(current_user) || current_user.admin?) %> 13 |
    3. 14 | <%=link_to "Add a New Resource", "#{@team.to_url}/guide/#{resource.class.to_s.downcase}/#{resource.id}/resources/new"%> 15 |
    4. 16 | <% end %> 17 |
    18 |
  • 19 | 20 | -------------------------------------------------------------------------------- /app/views/resources/edit.html.erb: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 | <%= image_tag @team.app.photo.url, :id => 'app-photo', :class => 'main-visual' %> 5 |
    6 |

    <%= @team.app.name %>

    7 |
    8 | <% unless @team.team_type == 'core' %> 9 |

    <%=@team.region.city%>, <%=@team.region.state%>

    10 | <% end%> 11 |

    Organized by <% @team.team_members.where(:team_role => 'organizer').each do |organizer|%> 12 | <%=link_to organizer.user.person.name, organizer.user.person %> 13 | <%end%> 14 |

    15 |
    16 |
    17 | <%= render "shared/guide_sidebar"%> 18 |
    19 |
    20 |
    21 |
      22 | <% form_for @deploy_task_resource do |f| -%> 23 |
    • Edit Resource for <%=@deploy_task_resource.deploy_task.name%>
    • 24 |
    • 25 |

      <%= f.label :content, "Title:" %><%= f.text_field :content %>

      26 |

      <%= f.label :link, "URL" %><%= f.text_field :link %>

      27 | 28 |
    • 29 | <%= f.submit "Update", :id => "guide_submit" %> 30 | <% end -%> 31 |
        32 |
    33 |
    34 |
    35 | 36 | -------------------------------------------------------------------------------- /app/views/resources/new.html.erb: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 | <%= image_tag @team.app.photo.url, :id => 'app-photo', :class => 'main-visual' %> 5 |
    6 |

    <%= @team.app.name %>

    7 |
    8 | <% unless @team.team_type == 'core' %> 9 |

    <%=@team.region.city%>, <%=@team.region.state%>

    10 | <% end%> 11 |

    Organized by <% @team.team_members.where(:team_role => 'organizer').each do |organizer|%> 12 | <%=link_to organizer.user.person.name, organizer.user.person %> 13 | <%end%> 14 |

    15 |
    16 |
    17 | <%= render "shared/guide_sidebar"%> 18 |
    19 |
    20 |
    21 |
      22 | <% form_for :deploy_task_resource, :url => deploy_task_resources_path do |f| -%> 23 |
    • New Resource for <%=@deploy_task_resource.deploy_task.name%>
    • 24 |
    • 25 |

      <%= f.label :content, "Title:" %><%= f.text_field :content %>

      26 |

      <%= f.label :link, "URL" %><%= f.text_field :link %>

      27 | <%= f.hidden_field :deploy_task_id %> 28 | 29 |
    • 30 | <%= f.submit "Create", :id => "guide_submit" %> 31 | <% end -%> 32 |
        33 |
    34 |
    35 |
    36 | 37 | -------------------------------------------------------------------------------- /app/views/shared/_app_header.html.erb: -------------------------------------------------------------------------------- 1 |
    2 | <%= link_to image_tag(@team.app.photo.url, :id => 'app-photo', :class => 'main-visual'), @team.to_url %> 3 |
    4 | <% if @team.team_type == 'core' %> 5 |

    <%=link_to @team.app.name, @team.to_url %>

    6 | 7 | 8 | <% else %> 9 |

    <%=link_to"#{@team.region.nick_name} #{@team.app.name}", @team.to_url %>

    10 |

    Implementation of <%= link_to @team.app.name, @team.app.core_team.to_url%> in <%=@team.region.pretty_name%>

    11 | <% end %> 12 |

    Organized by 13 | <%=raw @team.team_members.where(:team_role => 'organizer').map { |organizer| link_to organizer.user.person.name, organizer.user.person }.to_sentence %> 14 |

    15 | -------------------------------------------------------------------------------- /app/views/shared/_comment.html.erb: -------------------------------------------------------------------------------- 1 | <% form_for :comment, :url => comments_create_path do |f| -%> 2 |
    3 | <%= f.text_area :text, :rows => nil %> 4 | <%= f.hidden_field :team_id, :value => @team.id %> 5 | <%= f.hidden_field :commentable_type, :value => comment.class %> 6 | <%= f.hidden_field :commentable_id, :value => comment.id %> 7 |
    8 | <%= f.select :flag, [['Chatter', 1]] %> 9 |
    10 | <%= f.submit "Post" %> 11 |
    12 |
    13 | <% end -%> 14 | -------------------------------------------------------------------------------- /app/views/shared/_comment_list.html.erb: -------------------------------------------------------------------------------- 1 |
    2 |

    Comments

    3 |
    4 | <% comment.comments.order("created_at DESC").each do |feed| %> 5 |
    6 | <%= activity_image(feed)%> 7 | <%=feed.text%> 8 | <%= activity_type("Comment")%>, <%= time_ago_in_words(feed.created_at)%> 9 |
    10 | <% end %> 11 | <%= render "shared/comment", :comment => comment %> 12 |
    13 |
    14 | -------------------------------------------------------------------------------- /app/views/shared/_deploy_task_resource.html.erb: -------------------------------------------------------------------------------- 1 | <% form_for :deploy_task_resource, :url => comments_create_path do |f| -%> 2 |
    3 | <%= f.text_area :text, :rows => nil %> 4 | <%= f.hidden_field :team_id, :value => @team.id %> 5 | <%= f.hidden_field :commentable_type, :value => comment.class %> 6 | <%= f.hidden_field :commentable_id, :value => comment.id %> 7 |
    8 | <%= f.select :flag, [['Chatter', 1]] %> 9 |
    10 | <%= f.submit "Post" %> 11 |
    12 |
    13 | <% end -%> 14 | -------------------------------------------------------------------------------- /app/views/shared/_footer.html.erb: -------------------------------------------------------------------------------- 1 | 22 | -------------------------------------------------------------------------------- /app/views/shared/_header.html.erb: -------------------------------------------------------------------------------- 1 | 26 | -------------------------------------------------------------------------------- /app/views/shared/_list.html.erb: -------------------------------------------------------------------------------- 1 | 4 | 7 | -------------------------------------------------------------------------------- /app/views/shared/_list_item.html.erb: -------------------------------------------------------------------------------- 1 |
  • 2 |

    <%= link_to list_item.name, polymorphic_path(list_item) %>

    3 | <%= image_tag list_item.photo.url %> 4 |
  • 5 | -------------------------------------------------------------------------------- /app/views/shared/_list_pagination.html.erb: -------------------------------------------------------------------------------- 1 | <% if list_pagination.respond_to?(:total_pages) && list_pagination.total_pages > 1 %> 2 | 6 | <% end %> 7 | -------------------------------------------------------------------------------- /app/views/shared/_search.html.erb: -------------------------------------------------------------------------------- 1 | <%= form_for @search, :url => polymorphic_path(resource), :html => {:method => :get} do |f| %> 2 | <%= f.text_field :name_contains, :id => 'main-search' %> 3 | <%= f.select :roles_id_equals, Role.all.map {|r| [r.name, r.id] }, {:include_blank => true} %> 4 | <%= f.select :skills_id_equals, Skill.all.map {|s| [s.name, s.id] }, {:include_blank => true} %> 5 | <%= f.select :languages_id_equals, Language.all.map {|l| [l.name, l.id] }, {:include_blank => true} %> 6 | 7 | <% end %> 8 | -------------------------------------------------------------------------------- /app/views/shared/_tag_list.html.erb: -------------------------------------------------------------------------------- 1 | <% if @person%> 2 | <%=skill%> 3 | <% elsif @team.team_type=="application"%> 4 | <%=skill%> 5 | <% else %> 6 | <%=skill%> 7 | <% end %> -------------------------------------------------------------------------------- /app/views/steps/edit.html.erb: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 | <%= image_tag @team.app.photo.url, :id => 'app-photo', :class => 'main-visual' %> 5 |
    6 |

    <%= @team.app.name %>

    7 |
    8 | <% unless @team.team_type == 'core' %> 9 |

    <%=@team.region.city%>, <%=@team.region.state%>

    10 | <% end%> 11 |

    Organized by <% @team.team_members.where(:team_role => 'organizer').each do |organizer|%> 12 | <%=link_to organizer.user.person.name, organizer.user.person %> 13 | <%end%> 14 |

    15 |
    16 |
    17 | <%= render "shared/guide_sidebar"%> 18 |
    19 |
    20 |
    21 | <%= form_for @step do |f| %> 22 |
      23 |
    • Edit This Step
    • 24 |
    • <%= f.label :name, "Name:" %>
      <%= f.text_field :name %>

      25 |

      <%= f.label :skill_list, "Required Skills:" %>
      <%= f.text_field :skill_list, :input_html => {:class => 'tags'}%>

      26 |

      <%= f.label :description, "Description" %>
      <%= f.text_area :description %>

      27 |

      <%= f.label :milestone, "Milestone:" %>
      <%= select "step", "parent_id", @team.app.milestones.collect {|x| [x.name, x.id]}%>

      28 | 29 |
    • 30 |
    31 | <%= f.submit :id => "guide_submit" %> 32 | <% end %> 33 |
    34 |
    35 |
    36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /app/views/steps/new.html.erb: -------------------------------------------------------------------------------- 1 |
    2 |
    3 |
    4 | <%= image_tag @team.app.photo.url, :id => 'app-photo', :class => 'main-visual' %> 5 |
    6 |

    <%= @team.app.name %>

    7 |
    8 | <% unless @team.team_type == 'core' %> 9 |

    <%=@team.region.city%>, <%=@team.region.state%>

    10 | <% end%> 11 |

    Organized by <% @team.team_members.where(:team_role => 'organizer').each do |organizer|%> 12 | <%=link_to organizer.user.person.name, organizer.user.person %> 13 | <%end%> 14 |

    15 |
    16 |
    17 | <%= render "shared/guide_sidebar"%> 18 |
    19 |
    20 | <%= form_for @step do |f| %> 21 |

    <%= f.label :name, "Name:" %><%= f.text_field :name %>

    22 |

    <%= f.label :skill_list, "Required Skills:" %>
    <%= f.text_field :skill_list, :input_html => {:class => 'tags'}%>

    23 |

    <%= f.label :description, "Description" %>
    <%= f.text_area :description %>

    24 | <%= f.hidden_field :parent_id%> 25 | 26 | <%= f.submit %> 27 | <% end %> 28 |
    29 |
    30 | 31 | -------------------------------------------------------------------------------- /app/views/tags/_list.html.erb: -------------------------------------------------------------------------------- 1 | <% type ||= :all %> 2 | <% list = list.map{|tag| link_to(tag, send("#{type.to_s.pluralize}_tagged_path", tag.to_s)) } %> 3 | <%= list.join(", ").html_safe %> 4 | 5 | -------------------------------------------------------------------------------- /app/views/teams/_activity_stream.html.erb: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | <% @team.activity_feeds.order("created_at DESC")[0..20].each do |feed| %> 4 |
    5 | <%= activity_image(feed.feedable)%> 6 | 7 | <% if feed.feedable.user%> 8 | <%=link_to feed.feedable.user.person.name, feed.feedable.user.person %> 9 | <% else%> 10 | Geek Robot 11 | <%end %> 12 | 13 | <%=feed.activity%> 14 | <%= activity_type(feed.feedable)%>, <%= time_ago_in_words(feed.created_at)%> 15 |
    16 | <% end %> 17 | <%= render "shared/comment", :comment => @team %> 18 |
    19 |
    20 |
    21 | -------------------------------------------------------------------------------- /app/views/teams/_core_metric.html.erb: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | 7 |
    8 |
    9 | 10 | <% if current_user && current_user.region %> 11 | <% if @team.app.teams.where(:region_id => current_user.region).blank?%> 12 | <%= button_to "Start this in #{current_user.region.nick_name}", app_teams_path(@team.app), :class => 'join-btn' %> 13 | <% else %> 14 | <%=link_to "Goto #{current_user.region.nick_name}'s Page", @team.app.teams.where(:region_id => current_user.region).first.to_url, :class => 'join-btn' %> 15 | <% end %> 16 | <% else %> 17 | <%= link_to 'Join the Geek Corps to help start this project', sign_in_path, :class => 'join-btn' %> 18 | <% end %> 19 |
    20 |
    21 |
    22 |
    23 | -------------------------------------------------------------------------------- /app/views/teams/_core_team.html.erb: -------------------------------------------------------------------------------- 1 | 14 | -------------------------------------------------------------------------------- /app/views/teams/_form.html.erb: -------------------------------------------------------------------------------- 1 | <%= form_for(@team) do |f| %> 2 | <% if @team.errors.any? %> 3 |
    4 |

    <%= pluralize(@team.errors.count, "error") %> prohibited this team from being saved:

    5 | 6 | 11 |
    12 | <% end %> 13 | 14 |
    15 | <%= f.label :app_id %>
    16 | <%= f.text_field :app_id %> 17 |
    18 |
    19 | <%= f.label :region_id %>
    20 | <%= f.text_field :region_id %> 21 |
    22 |
    23 | <%= f.label :team_type %>
    24 | <%= f.text_field :team_type %> 25 |
    26 |
    27 | <%= f.label :name %>
    28 | <%= f.text_field :name %> 29 |
    30 |
    31 | <%= f.submit %> 32 |
    33 | <% end %> 34 | -------------------------------------------------------------------------------- /app/views/teams/_implementations.html.erb: -------------------------------------------------------------------------------- 1 | 14 | -------------------------------------------------------------------------------- /app/views/teams/_list.html.erb: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/views/teams/_list_item.html.erb: -------------------------------------------------------------------------------- 1 | <% if list_item.team_type == 'application'%> 2 |
  • <%=skill_list(list_item.app.skill_list)%>"> 3 |

    <%= list_item.pretty_name %>

    4 | <%= image_tag list_item.app.photo.url %> 5 |
  • 6 | <% end %> -------------------------------------------------------------------------------- /app/views/teams/_metric.html.erb: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | 18 |
    19 |
    20 | <% if user_signed_in? %> 21 | <% if current_user.teams.where(:id => @team).blank? %> 22 | <%= button_to "Join this Team!", team_members_path(@team), :class => 'join-btn' %> 23 | <% else %> 24 | <% role = current_user.team_members.where(:team_id => @team).first.team_role%> 25 | <%= link_to "Your Role: #{role.nil? ? "Doesn't Exist :(" : role.capitalize}", "#", :class => 'join-btn' %> 26 | <% end %> 27 | <% else %> 28 | <%= link_to 'Join the Geek Corps to help start this project', sign_in_path, :class => 'join-btn' %> 29 | <% end %> 30 |
    31 |
    32 |
    33 |
    34 | -------------------------------------------------------------------------------- /app/views/teams/_organizers.html.erb: -------------------------------------------------------------------------------- 1 | 13 | 14 | -------------------------------------------------------------------------------- /app/views/teams/_supporters.html.erb: -------------------------------------------------------------------------------- 1 | 14 | 15 | -------------------------------------------------------------------------------- /app/views/teams/edit.html.erb: -------------------------------------------------------------------------------- 1 |

    Editing team

    2 | 3 | <%= render 'form' %> 4 | 5 | <%= link_to 'Show', @team %> | 6 | <%= link_to 'Back', teams_path %> 7 | -------------------------------------------------------------------------------- /app/views/teams/new.html.erb: -------------------------------------------------------------------------------- 1 |

    New team

    2 | 3 | <%= render 'form' %> 4 | 5 | <%= link_to 'Back', teams_path %> 6 | -------------------------------------------------------------------------------- /app/views/teams/show.html.erb: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | <%= render "shared/app_header"%> 4 |
    5 |
    6 |
    7 |

    About This Project

    8 |

    <%= @team.app.description %>

    9 |
    10 | 15 | 16 | <%= render :partial => 'activity_stream' %> 17 | 18 |
    19 | 20 | 31 |
    32 | 33 | -------------------------------------------------------------------------------- /app/views/users/home.html.erb: -------------------------------------------------------------------------------- 1 | <% content_for(:section_header) do %> 2 |
    3 |

    Hey there!

    4 |
    5 | <% end %> 6 | 7 |
    8 |
    9 |

    What would you like to do?

    10 | 15 |
    16 |
    17 |

    Linked Accounts

    18 | <%= semantic_form_for(SignInData.new(:email => current_user.email), :url => user_sessions_path) do |f| %> 19 | <%= f.inputs do %> 20 | <%= f.input :email, :as => :hidden %> 21 | <%= f.input :provider, :collection => Authentication::PROVIDER_OPTIONS, :prompt => 'Pick a service…', :label => 'Add an account' %> 22 | <% end %> 23 | <%= f.buttons do %> 24 | <%= f.commit_button "Add it!" %> 25 | <% end %> 26 | <% end %> 27 | 28 | <%= render :partial => 'authentications/list', :object => current_user.authentications %> 29 |
    30 |
    31 | -------------------------------------------------------------------------------- /app/views/users/sessions/new.html.erb: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | <%= render :partial => 'authentications/login_form' %> 4 |
    5 |
    6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/views/users/welcome.html.erb: -------------------------------------------------------------------------------- 1 |
    2 |
    3 | <% if !@person.new_record? %> 4 | <%= render "people/person_header"%> 5 | <% else %> 6 |

    Welcome to the Geek Corps!

    7 | <% end %> 8 |
    9 |
    10 |
    11 |

    Edit Your Information

    12 | <% if @person.new_record? %> 13 |

    <%= "We imported as much info as we could from your #{provider_name(current_user.authentications.first.provider)} account. Look it over and hit the big button to get started."%>

    14 | <% else %> 15 |

    <%= "You were already in the directory! Please review your details and let us know they're right." %> 16 | <%end%> 17 |

    18 | <% if @person.new_record?%> 19 | <%= render :partial => 'people/new_form' %> 20 | <% else%> 21 | <%= render :partial => 'people/form' %> 22 | <% end %> 23 |
    24 |
    25 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /config.ru: -------------------------------------------------------------------------------- 1 | # This file is used by Rack-based servers to start the application. 2 | 3 | require ::File.expand_path('../config/environment', __FILE__) 4 | run GeekCorps::Application 5 | -------------------------------------------------------------------------------- /config/boot.rb: -------------------------------------------------------------------------------- 1 | require 'rubygems' 2 | 3 | # Set up gems listed in the Gemfile. 4 | ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__) 5 | 6 | require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE']) 7 | -------------------------------------------------------------------------------- /config/database.yml: -------------------------------------------------------------------------------- 1 | # SQLite version 3.x 2 | # gem install sqlite3 3 | development: 4 | adapter: sqlite3 5 | database: db/development.sqlite3 6 | pool: 5 7 | timeout: 5000 8 | 9 | # Warning: The database defined as "test" will be erased and 10 | # re-generated from your development database when you run "rake". 11 | # Do not set this db to the same as development or production. 12 | test: 13 | adapter: sqlite3 14 | database: db/test.sqlite3 15 | pool: 5 16 | timeout: 5000 17 | 18 | production: 19 | adapter: sqlite3 20 | database: db/production.sqlite3 21 | pool: 5 22 | timeout: 5000 23 | 24 | jenkins: 25 | adapter: sqlite3 26 | database: db/jenkins.sqlite3 27 | pool: 5 28 | timeout: 5000 29 | -------------------------------------------------------------------------------- /config/environment.rb: -------------------------------------------------------------------------------- 1 | # Load the rails application 2 | require File.expand_path('../application', __FILE__) 3 | 4 | # Initialize the rails application 5 | GeekCorps::Application.initialize! 6 | -------------------------------------------------------------------------------- /config/environments/development.rb: -------------------------------------------------------------------------------- 1 | GeekCorps::Application.configure do 2 | # Settings specified here will take precedence over those in config/application.rb 3 | 4 | # In the development environment your application's code is reloaded on 5 | # every request. This slows down response time but is perfect for development 6 | # since you don't have to restart the webserver when you make code changes. 7 | config.cache_classes = false 8 | 9 | # Log error messages when you accidentally call methods on nil. 10 | config.whiny_nils = true 11 | 12 | # Show full error reports and disable caching 13 | config.consider_all_requests_local = true 14 | config.action_view.debug_rjs = true 15 | config.action_controller.perform_caching = false 16 | 17 | # Don't care if the mailer can't send 18 | config.action_mailer.raise_delivery_errors = false 19 | 20 | # Print deprecation notices to the Rails logger 21 | config.active_support.deprecation = :log 22 | 23 | # Only use best-standards-support built into browsers 24 | config.action_dispatch.best_standards_support = :builtin 25 | end 26 | 27 | -------------------------------------------------------------------------------- /config/environments/jenkins.rb: -------------------------------------------------------------------------------- 1 | GeekCorps::Application.configure do 2 | # Settings specified here will take precedence over those in config/application.rb 3 | 4 | # The test environment is used exclusively to run your application's 5 | # test suite. You never need to work with it otherwise. Remember that 6 | # your test database is "scratch space" for the test suite and is wiped 7 | # and recreated between test runs. Don't rely on the data there! 8 | config.cache_classes = false 9 | 10 | # Log error messages when you accidentally call methods on nil. 11 | config.whiny_nils = true 12 | 13 | # Show full error reports and disable caching 14 | config.consider_all_requests_local = true 15 | config.action_controller.perform_caching = false 16 | 17 | # Raise exceptions instead of rendering exception templates 18 | config.action_dispatch.show_exceptions = false 19 | 20 | # Disable request forgery protection in test environment 21 | config.action_controller.allow_forgery_protection = false 22 | 23 | # Tell Action Mailer not to deliver emails to the real world. 24 | # The :test delivery method accumulates sent emails in the 25 | # ActionMailer::Base.deliveries array. 26 | config.action_mailer.delivery_method = :test 27 | 28 | # Use SQL instead of Active Record's schema dumper when creating the test database. 29 | # This is necessary if your schema can't be completely dumped by the schema dumper, 30 | # like if you have constraints or database-specific column types 31 | # config.active_record.schema_format = :sql 32 | 33 | # Print deprecation notices to the stderr 34 | config.active_support.deprecation = :stderr 35 | end 36 | -------------------------------------------------------------------------------- /config/environments/test.rb: -------------------------------------------------------------------------------- 1 | GeekCorps::Application.configure do 2 | # Settings specified here will take precedence over those in config/application.rb 3 | 4 | # The test environment is used exclusively to run your application's 5 | # test suite. You never need to work with it otherwise. Remember that 6 | # your test database is "scratch space" for the test suite and is wiped 7 | # and recreated between test runs. Don't rely on the data there! 8 | config.cache_classes = false 9 | 10 | # Log error messages when you accidentally call methods on nil. 11 | config.whiny_nils = true 12 | 13 | # Show full error reports and disable caching 14 | config.consider_all_requests_local = true 15 | config.action_controller.perform_caching = false 16 | 17 | # Raise exceptions instead of rendering exception templates 18 | config.action_dispatch.show_exceptions = false 19 | 20 | # Disable request forgery protection in test environment 21 | config.action_controller.allow_forgery_protection = false 22 | 23 | # Tell Action Mailer not to deliver emails to the real world. 24 | # The :test delivery method accumulates sent emails in the 25 | # ActionMailer::Base.deliveries array. 26 | config.action_mailer.delivery_method = :test 27 | 28 | # Use SQL instead of Active Record's schema dumper when creating the test database. 29 | # This is necessary if your schema can't be completely dumped by the schema dumper, 30 | # like if you have constraints or database-specific column types 31 | # config.active_record.schema_format = :sql 32 | 33 | # Print deprecation notices to the stderr 34 | config.active_support.deprecation = :stderr 35 | 36 | 37 | end 38 | -------------------------------------------------------------------------------- /config/initializers/backtrace_silencers.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces. 4 | # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ } 5 | 6 | # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code. 7 | # Rails.backtrace_cleaner.remove_silencers! 8 | -------------------------------------------------------------------------------- /config/initializers/delayed_job.rb: -------------------------------------------------------------------------------- 1 | Delayed::Worker.destroy_failed_jobs = false 2 | Delayed::Worker.sleep_delay = 60 3 | Delayed::Worker.max_attempts = 3 4 | Delayed::Worker.max_run_time = 5.minutes -------------------------------------------------------------------------------- /config/initializers/devise.rb: -------------------------------------------------------------------------------- 1 | # Use this hook to configure devise mailer, warden hooks and so forth. The first 2 | # four configuration values can also be set straight in your models. 3 | Devise.setup do |config| 4 | # ==> Mailer Configuration 5 | # Configure the e-mail address which will be shown in DeviseMailer. 6 | config.mailer_sender = "badger@codeforamerica.org" 7 | 8 | # ==> ORM configuration 9 | # Load and configure the ORM. Supports :active_record (default) and 10 | # :mongoid (bson_ext recommended) by default. Other ORMs may be 11 | # available as additional gems. 12 | require 'devise/orm/active_record' 13 | 14 | # ==> Configuration for :database_authenticatable 15 | # For bcrypt, this is the cost for hashing the password and defaults to 10. If 16 | # using other encryptors, it sets how many times you want the password re-encrypted. 17 | config.stretches = 10 18 | 19 | # Define which will be the encryption algorithm. Devise also supports encryptors 20 | # from others authentication tools as :clearance_sha1, :authlogic_sha512 (then 21 | # you should set stretches above to 20 for default behavior) and :restful_authentication_sha1 22 | # (then you should set stretches to 10, and copy REST_AUTH_SITE_KEY to pepper) 23 | config.encryptor = :bcrypt 24 | 25 | # Setup a pepper to generate the encrypted password. 26 | config.pepper = "38da18c0ad53fe8552fa82ccde0ab072e8e137a347e9e66a84ec2c0601d5acf46a8d7dbcb9f4f393a3248905723fe574e1d466c2df1338e3ade63e86719d09bb" 27 | 28 | end 29 | -------------------------------------------------------------------------------- /config/initializers/inflections.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Add new inflection rules using the following format 4 | # (all these examples are active by default): 5 | # ActiveSupport::Inflector.inflections do |inflect| 6 | # inflect.plural /^(ox)$/i, '\1en' 7 | # inflect.singular /^(ox)en/i, '\1' 8 | # inflect.irregular 'person', 'people' 9 | # inflect.uncountable %w( fish sheep ) 10 | # end 11 | -------------------------------------------------------------------------------- /config/initializers/mime_types.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Add new mime types for use in respond_to blocks: 4 | # Mime::Type.register "text/richtext", :rtf 5 | # Mime::Type.register_alias "text/html", :iphone 6 | -------------------------------------------------------------------------------- /config/initializers/omniauth.rb: -------------------------------------------------------------------------------- 1 | require 'openid' 2 | require 'openid/store/filesystem' 3 | 4 | OpenID.fetcher.timeout = 6 5 | 6 | Rails.application.config.middleware.use OmniAuth::Builder do 7 | SETTINGS['auth_credentials'].each do |provider_name, opts| 8 | provider provider_name.to_sym, opts['key'], opts['secret'] 9 | end 10 | 11 | 12 | 13 | provider(:open_id, OpenID::Store::Filesystem.new('/tmp')) if SETTINGS['providers'].include?('open_id') 14 | 15 | use(OmniAuth::Strategies::OpenID, OpenID::Store::Filesystem.new('/tmp'), 16 | :name => 'google', 17 | :identifier => 'https://www.google.com/accounts/o8/id') \ 18 | if SETTINGS['providers'].include?('google') 19 | 20 | provider :google_apps, OpenID::Store::Filesystem.new('/tmp') 21 | end 22 | 23 | 24 | 25 | consumers = {} 26 | SETTINGS['auth_credentials'].each do |provider_name, opts| 27 | strategy_class = OmniAuth::Strategies.const_get("#{OmniAuth::Utils.camelize(provider_name)}") 28 | strategy = strategy_class.new(nil, opts['key'], opts['secret']) 29 | 30 | if strategy.is_a?(OmniAuth::Strategies::OAuth) 31 | consumers[provider_name] = strategy.consumer 32 | elsif strategy.is_a?(OmniAuth::Strategies::OAuth2) 33 | consumers[provider_name] = strategy.client 34 | end 35 | end 36 | 37 | OAUTH_CONSUMERS = consumers 38 | -------------------------------------------------------------------------------- /config/initializers/paperclip.rb: -------------------------------------------------------------------------------- 1 | Paperclip.interpolates :safe_filename do |attachment, style| 2 | filename(attachment, style).gsub(/#/, '-') 3 | end 4 | -------------------------------------------------------------------------------- /config/initializers/secret_token.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | # Your secret key for verifying the integrity of signed cookies. 4 | # If you change this key, all old signed cookies will become invalid! 5 | # Make sure the secret is at least 30 characters and all random, 6 | # no regular words or you'll be exposed to dictionary attacks. 7 | GeekCorps::Application.config.secret_token = '2c7f58746dfdcf12e6e22a89159d50af2c5e00f60f8d98d908fa0a6e011d67c03e972db5fd58f02f95e6b1ae8ac0e80a612410e98f086a207905f7d70ea4783b' 8 | -------------------------------------------------------------------------------- /config/initializers/session_store.rb: -------------------------------------------------------------------------------- 1 | # Be sure to restart your server when you modify this file. 2 | 3 | GeekCorps::Application.config.session_store :cookie_store, :key => '_geek_corps_session' 4 | 5 | # Use the database for sessions instead of the cookie-based default, 6 | # which shouldn't be used to store highly confidential information 7 | # (create the session table with "rails generate session_migration") 8 | # GeekCorps::Application.config.session_store :active_record_store 9 | -------------------------------------------------------------------------------- /config/locales/en.yml: -------------------------------------------------------------------------------- 1 | # Sample localization file for English. Add more files in this directory for other locales. 2 | # See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points. 3 | 4 | en: 5 | hello: "Hello world" 6 | -------------------------------------------------------------------------------- /config/settings-local-sample.yml: -------------------------------------------------------------------------------- 1 | # environment-specific settings will be deep merged with the common hash, overriding values therein 2 | 3 | common: 4 | providers: 5 | - twitter 6 | - open_id 7 | - google 8 | - facebook 9 | - linked_in 10 | - github 11 | google_analytics_id: 12 | organization: 13 | name: Org Name 14 | city: City 15 | state: State 16 | url: http://geeks.codeforamerica.org 17 | twitter: codeforamerica 18 | email: corps@codeforamerica.org 19 | host: heroku 20 | host_url: geeks@codeforamerica.org 21 | logotype: GeekCorps 22 | development: 23 | auth_credentials: 24 | github: 25 | key: developmentkey 26 | secret: devseekrit! 27 | twitter: 28 | key: skeletonkey 29 | secret: seekrit! 30 | facebook: 31 | key: skeletonkey 32 | secret: seekrit! 33 | linked_in: 34 | key: 35 | secret: seekrit! 36 | 37 | -------------------------------------------------------------------------------- /config/twitter_auth.yml: -------------------------------------------------------------------------------- 1 | development: 2 | strategy: oauth 3 | oauth_consumer_key: QanfwVWWT86uL1JoICBIA 4 | oauth_consumer_secret: fXTwkCQL9fYqtA1kxUVsNxtKJcLhOen85uRt3q6so 5 | base_url: "https://twitter.com" 6 | authorize_path: "/oauth/authenticate" 7 | api_timeout: 10 8 | remember_for: 14 # days 9 | oauth_callback: "http://localhost:3000/oauth_callback" 10 | test: 11 | strategy: oauth 12 | oauth_consumer_key: testkey 13 | oauth_consumer_secret: testsecret 14 | base_url: "https://twitter.com" 15 | authorize_path: "/oauth/authenticate" 16 | api_timeout: 10 17 | remember_for: 14 # days 18 | oauth_callback: "http://localhost:3000/oauth_callback" 19 | production: 20 | strategy: oauth 21 | oauth_consumer_key: LmE7Cre33pZRjJa2PKaFQ 22 | oauth_consumer_secret: VOqZ4KbFkHG6vjJxUavGP8opB8r2iPftCK2x3Ph3c 23 | authorize_path: "/oauth/authenticate" 24 | base_url: "https://twitter.com" 25 | api_timeout: 10 26 | remember_for: 14 # days -------------------------------------------------------------------------------- /db/migrate/20110601194123_create_github_contacts.rb: -------------------------------------------------------------------------------- 1 | class CreateGithubContacts < ActiveRecord::Migration 2 | def self.up 3 | create_table :contact_sources do |t| 4 | t.string :name 5 | end 6 | 7 | create_table :github_contacts do |t| 8 | t.string :gravatar_id 9 | t.string :company 10 | t.string :name 11 | t.datetime :created_at 12 | t.string :location 13 | t.integer :public_repo_count 14 | t.integer :public_gist_count 15 | t.string :blog 16 | t.integer :following_count 17 | t.string :type 18 | t.integer :followers_count 19 | t.string :login 20 | t.boolean :permission 21 | t.string :email 22 | t.integer :contact_source_id 23 | t.datetime :first_commit 24 | t.datetime :updated_at 25 | end 26 | 27 | add_index :github_contacts, :login 28 | add_index :github_contacts, :following_count 29 | add_index :github_contacts, :followers_count 30 | add_index :github_contacts, :public_repo_count 31 | add_index :github_contacts, :public_gist_count 32 | add_index :github_contacts, :created_at 33 | add_index :github_contacts, :contact_source_id 34 | 35 | end 36 | 37 | def self.down 38 | drop_table :contact_sources 39 | drop_table :github_contacts 40 | end 41 | end 42 | -------------------------------------------------------------------------------- /db/migrate/20110601235912_create_delayed_jobs.rb: -------------------------------------------------------------------------------- 1 | class CreateDelayedJobs < ActiveRecord::Migration 2 | def self.up 3 | create_table :delayed_jobs, :force => true do |table| 4 | table.integer :priority, :default => 0 # Allows some jobs to jump to the front of the queue 5 | table.integer :attempts, :default => 0 # Provides for retries, but still fail eventually. 6 | table.text :handler # YAML-encoded string of the object that will do work 7 | table.text :last_error # reason for last failure (See Note below) 8 | table.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future. 9 | table.datetime :locked_at # Set when a client is working on this object 10 | table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead) 11 | table.string :locked_by # Who is working on this object (if locked) 12 | table.timestamps 13 | end 14 | 15 | add_index :delayed_jobs, [:priority, :run_at], :name => 'delayed_jobs_priority' 16 | end 17 | 18 | def self.down 19 | drop_table :delayed_jobs 20 | end 21 | end -------------------------------------------------------------------------------- /db/migrate/20110602162632_create_batchbook_contacts.rb: -------------------------------------------------------------------------------- 1 | class CreateBatchbookContacts < ActiveRecord::Migration 2 | def self.up 3 | create_table :batchbook_contacts do |t| 4 | t.integer :batchbook_id 5 | t.string :first_name 6 | t.string :last_name 7 | t.boolean :primary 8 | t.string :label 9 | t.integer :location_id 10 | t.string :email 11 | t.string :website 12 | t.string :phone 13 | t.string :cell 14 | t.string :state 15 | t.string :city 16 | t.string :postal_code 17 | t.string :country 18 | t.timestamps 19 | end 20 | end 21 | 22 | def self.down 23 | drop_table :batchbook_contacts 24 | end 25 | end 26 | -------------------------------------------------------------------------------- /db/migrate/20110602163032_acts_as_taggable_on_migration.rb: -------------------------------------------------------------------------------- 1 | class ActsAsTaggableOnMigration < ActiveRecord::Migration 2 | def self.up 3 | create_table :tags do |t| 4 | t.string :name 5 | end 6 | 7 | create_table :taggings do |t| 8 | t.references :tag 9 | 10 | # You should make sure that the column created is 11 | # long enough to store the required class names. 12 | t.references :taggable, :polymorphic => true 13 | t.references :tagger, :polymorphic => true 14 | 15 | t.string :context 16 | 17 | t.datetime :created_at 18 | end 19 | 20 | add_index :taggings, :tag_id 21 | add_index :taggings, [:taggable_id, :taggable_type, :context] 22 | end 23 | 24 | def self.down 25 | drop_table :taggings 26 | drop_table :tags 27 | end 28 | end 29 | -------------------------------------------------------------------------------- /db/migrate/20110627233220_create_people.rb: -------------------------------------------------------------------------------- 1 | class CreatePeople < ActiveRecord::Migration 2 | def self.up 3 | create_table :people do |t| 4 | t.string :bio 5 | t.string :location 6 | t.float :lat 7 | t.float :long 8 | t.string :picture 9 | 10 | t.timestamps 11 | end 12 | end 13 | 14 | def self.down 15 | drop_table :people 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /db/migrate/20110705171644_devise_create_users.rb: -------------------------------------------------------------------------------- 1 | class DeviseCreateUsers < ActiveRecord::Migration 2 | def self.up 3 | create_table(:users) do |t| 4 | t.rememberable 5 | t.trackable 6 | t.timestamps 7 | t.string :email 8 | t.boolean :admin, :default => false 9 | end 10 | 11 | end 12 | 13 | def self.down 14 | drop_table :users 15 | end 16 | end -------------------------------------------------------------------------------- /db/migrate/20110705172005_update_person.rb: -------------------------------------------------------------------------------- 1 | class UpdatePerson < ActiveRecord::Migration 2 | def self.up 3 | add_column :people, :twitter, :string 4 | add_column :people, :url, :string 5 | add_column :people, :user_id, :integer 6 | add_column :people, :name, :string 7 | add_column :people, :imported_from_provider, :string 8 | add_column :people, :imported_from_id, :string 9 | add_column :people, :photo_file_name, :string 10 | add_column :people, :photo_content_type,:string 11 | add_column :people, :photo_file_size, :integer 12 | add_column :people, :photo_updated_at, :datetime 13 | add_column :people, :reviewed, :boolean, :default => false 14 | add_column :people, :imported_from_screen_name, :string 15 | end 16 | 17 | def self.down 18 | end 19 | end 20 | -------------------------------------------------------------------------------- /db/migrate/20110705172312_authentications.rb: -------------------------------------------------------------------------------- 1 | class Authentications < ActiveRecord::Migration 2 | def self.up 3 | create_table :authentications do |t| 4 | t.integer :user_id 5 | t.string :provider 6 | t.string :uid 7 | t.string :access_token 8 | t.string :access_token_secret 9 | t.text :info 10 | t.timestamps 11 | end 12 | end 13 | 14 | def self.down 15 | drop_table :authentications 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /db/migrate/20110706162252_create_apps.rb: -------------------------------------------------------------------------------- 1 | class CreateApps < ActiveRecord::Migration 2 | def self.up 3 | create_table :apps do |t| 4 | t.string :name 5 | t.text :description 6 | t.string :video_url 7 | 8 | t.timestamps 9 | end 10 | end 11 | 12 | def self.down 13 | drop_table :apps 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /db/migrate/20110707213317_create_regions.rb: -------------------------------------------------------------------------------- 1 | class CreateRegions < ActiveRecord::Migration 2 | def self.up 3 | create_table :regions do |t| 4 | t.string :city 5 | t.string :state 6 | 7 | t.timestamps 8 | end 9 | end 10 | 11 | def self.down 12 | drop_table :regions 13 | end 14 | end 15 | -------------------------------------------------------------------------------- /db/migrate/20110707213640_create_teams.rb: -------------------------------------------------------------------------------- 1 | class CreateTeams < ActiveRecord::Migration 2 | def self.up 3 | create_table :teams do |t| 4 | t.integer :app_id 5 | t.integer :region_id 6 | t.string :team_type 7 | t.string :name 8 | 9 | t.timestamps 10 | end 11 | end 12 | 13 | def self.down 14 | drop_table :teams 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /db/migrate/20110707213749_create_team_members.rb: -------------------------------------------------------------------------------- 1 | class CreateTeamMembers < ActiveRecord::Migration 2 | def self.up 3 | create_table :team_members do |t| 4 | t.integer :team_id 5 | t.integer :user_id 6 | t.string :team_role 7 | 8 | t.timestamps 9 | end 10 | end 11 | 12 | def self.down 13 | drop_table :team_members 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /db/migrate/20110707214056_create_details.rb: -------------------------------------------------------------------------------- 1 | class CreateDetails < ActiveRecord::Migration 2 | def self.up 3 | create_table :details do |t| 4 | t.integer :app_id 5 | t.integer :team_id 6 | t.string :name 7 | t.string :setting 8 | 9 | t.timestamps 10 | end 11 | end 12 | 13 | def self.down 14 | drop_table :details 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /db/migrate/20110707222526_add_nick_name_to_regions.rb: -------------------------------------------------------------------------------- 1 | class AddNickNameToRegions < ActiveRecord::Migration 2 | def self.up 3 | add_column :regions, :nick_name, :string 4 | end 5 | 6 | def self.down 7 | remove_column :regions, :nick_name 8 | end 9 | end -------------------------------------------------------------------------------- /db/migrate/20110707230536_add_region_id_to_users.rb: -------------------------------------------------------------------------------- 1 | class AddRegionIdToUsers < ActiveRecord::Migration 2 | def self.up 3 | add_column :users, :region_id, :integer 4 | end 5 | 6 | def self.down 7 | remove_column :users, :region_id 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /db/migrate/20110707232700_add_admin_to_team_members.rb: -------------------------------------------------------------------------------- 1 | class AddAdminToTeamMembers < ActiveRecord::Migration 2 | def self.up 3 | add_column :team_members, :admin, :boolean, :default => false 4 | end 5 | 6 | def self.down 7 | remove_column :team_members, :admin 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /db/migrate/20110708173625_add_app_id_to_team_members.rb: -------------------------------------------------------------------------------- 1 | class AddAppIdToTeamMembers < ActiveRecord::Migration 2 | def self.up 3 | add_column :team_members, :app_id, :integer 4 | end 5 | 6 | def self.down 7 | remove_column :team_members, :app_id 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /db/migrate/20110726163650_create_roles.rb: -------------------------------------------------------------------------------- 1 | class CreateRoles < ActiveRecord::Migration 2 | def self.up 3 | create_table :roles do |t| 4 | t.string :name 5 | t.references :rolable, :polymorphic => true 6 | 7 | t.timestamps 8 | end 9 | end 10 | 11 | def self.down 12 | drop_table :roles 13 | end 14 | end 15 | -------------------------------------------------------------------------------- /db/migrate/20110726163903_create_skills.rb: -------------------------------------------------------------------------------- 1 | class CreateSkills < ActiveRecord::Migration 2 | def self.up 3 | create_table :skills do |t| 4 | t.string :name 5 | t.references :skillable, :polymorphic => true 6 | t.integer :role_id 7 | t.timestamps 8 | end 9 | end 10 | 11 | def self.down 12 | drop_table :skills 13 | end 14 | end 15 | -------------------------------------------------------------------------------- /db/migrate/20110726171207_create_languages.rb: -------------------------------------------------------------------------------- 1 | class CreateLanguages < ActiveRecord::Migration 2 | def self.up 3 | create_table :languages do |t| 4 | t.string :name 5 | t.references :polyglot, :polymorphic => true 6 | t.timestamps 7 | end 8 | end 9 | 10 | def self.down 11 | drop_table :languages 12 | end 13 | end 14 | -------------------------------------------------------------------------------- /db/migrate/20110726194202_add_photos_to_apps.rb: -------------------------------------------------------------------------------- 1 | class AddPhotosToApps < ActiveRecord::Migration 2 | def self.up 3 | add_column :apps, :photo_file_name, :string 4 | add_column :apps, :photo_content_type, :string 5 | add_column :apps, :photo_file_size, :integer 6 | add_column :apps, :photo_updated_at, :datetime 7 | end 8 | 9 | def self.down 10 | remove_column :apps, :photo_file_name 11 | remove_column :apps, :photo_content_type 12 | remove_column :apps, :photo_file_size 13 | remove_column :apps, :photo_updated_at 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /db/migrate/20110801021736_use_paper_clip_for_apps_videos.rb: -------------------------------------------------------------------------------- 1 | class UsePaperClipForAppsVideos < ActiveRecord::Migration 2 | def self.up 3 | remove_column :apps, :video_url 4 | add_column :apps, :video_file_name, :string 5 | add_column :apps, :video_content_type, :string 6 | add_column :apps, :video_file_size, :integer 7 | add_column :apps, :video_updated_at, :datetime 8 | end 9 | 10 | def self.down 11 | add_column :apps, :video_url, :string 12 | remove_column :apps, :video_file_name 13 | remove_column :apps, :video_content_type 14 | remove_column :apps, :video_file_size 15 | remove_column :apps, :video_updated_at 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /db/migrate/20110801124607_add_repo_url_to_teams_table.rb: -------------------------------------------------------------------------------- 1 | class AddRepoUrlToTeamsTable < ActiveRecord::Migration 2 | def self.up 3 | add_column :teams, :repo_url, :string 4 | end 5 | 6 | def self.down 7 | remove_column :teams, :repo_url 8 | end 9 | end 10 | -------------------------------------------------------------------------------- /db/migrate/20110801150627_create_deploy_tasks.rb: -------------------------------------------------------------------------------- 1 | class CreateDeployTasks < ActiveRecord::Migration 2 | def self.up 3 | create_table :deploy_tasks do |t| 4 | t.integer :app_id 5 | t.string :type 6 | t.integer :parent_id 7 | t.timestamps 8 | end 9 | end 10 | 11 | def self.down 12 | drop_table :deploy_tasks 13 | end 14 | end 15 | -------------------------------------------------------------------------------- /db/migrate/20110801150927_create_deploy_task_resources.rb: -------------------------------------------------------------------------------- 1 | class CreateDeployTaskResources < ActiveRecord::Migration 2 | def self.up 3 | create_table :deploy_task_resources do |t| 4 | t.integer :deploy_task_id 5 | t.integer :team_id 6 | t.string :resource_type 7 | t.text :content 8 | t.string :link 9 | t.timestamps 10 | end 11 | end 12 | 13 | def self.down 14 | drop_table :deploy_task_resources 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /db/migrate/20110801151358_create_team_deploy_tasks.rb: -------------------------------------------------------------------------------- 1 | class CreateTeamDeployTasks < ActiveRecord::Migration 2 | def self.up 3 | create_table :team_deploy_tasks do |t| 4 | t.integer :team_id 5 | t.integer :deploy_task_id 6 | t.boolean :completed 7 | t.timestamps 8 | end 9 | end 10 | 11 | def self.down 12 | drop_table :team_deploy_tasks 13 | end 14 | end 15 | -------------------------------------------------------------------------------- /db/migrate/20110801152005_create_comments.rb: -------------------------------------------------------------------------------- 1 | class CreateComments < ActiveRecord::Migration 2 | def self.up 3 | create_table :comments do |t| 4 | t.text :text 5 | t.integer :user_id 6 | t.integer :flag 7 | t.integer :team_id 8 | t.timestamps 9 | end 10 | end 11 | 12 | def self.down 13 | drop_table :comments 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /db/migrate/20110804182313_create_activity_feeds.rb: -------------------------------------------------------------------------------- 1 | class CreateActivityFeeds < ActiveRecord::Migration 2 | def self.up 3 | create_table :activity_feeds do |t| 4 | t.integer :team_id 5 | t.string :feedable_type 6 | t.integer :feedable_id 7 | t.string :activity 8 | 9 | t.timestamps 10 | end 11 | end 12 | 13 | def self.down 14 | drop_table :activity_feeds 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /db/migrate/20110804192425_add_commentable_to_comment.rb: -------------------------------------------------------------------------------- 1 | class AddCommentableToComment < ActiveRecord::Migration 2 | def self.up 3 | add_column :comments, :commentable_type, :string 4 | add_column :comments, :commentable_id, :integer 5 | end 6 | 7 | def self.down 8 | remove_column :comments, :commentable_id 9 | remove_column :comments, :commentable_type 10 | end 11 | end -------------------------------------------------------------------------------- /db/migrate/20110805000044_add_photos_to_regions.rb: -------------------------------------------------------------------------------- 1 | class AddPhotosToRegions < ActiveRecord::Migration 2 | def self.up 3 | add_column :regions, :photo_file_name, :string 4 | add_column :regions, :photo_content_type, :string 5 | add_column :regions, :photo_updated_at, :datetime 6 | add_column :regions, :photo_file_size, :integer 7 | end 8 | 9 | def self.down 10 | remove_column :regions, :photo_file_name 11 | remove_column :regions, :photo_content_type 12 | remove_column :regions, :photo_updated_at 13 | remove_column :regions, :photo_file_size 14 | end 15 | end 16 | -------------------------------------------------------------------------------- /db/migrate/20110805185055_upate_deploy_tasks_table.rb: -------------------------------------------------------------------------------- 1 | class UpateDeployTasksTable < ActiveRecord::Migration 2 | def self.up 3 | add_column :deploy_tasks, :goal, :integer, :default => 1 4 | add_column :deploy_tasks, :est_time, :integer, :default => 0 5 | add_column :deploy_tasks, :position, :integer, :default => 0 6 | add_column :deploy_tasks, :name, :string 7 | add_column :deploy_tasks, :description, :text 8 | end 9 | 10 | def self.down 11 | remove_column :deploy_tasks, :goal 12 | remove_column :deploy_tasks, :est_time 13 | remove_column :deploy_tasks, :position 14 | remove_column :deploy_tasks, :name 15 | remove_column :deploy_tasks, :description 16 | end 17 | end 18 | -------------------------------------------------------------------------------- /db/migrate/20110809170919_drop_langs_skills_roles_tables.rb: -------------------------------------------------------------------------------- 1 | class DropLangsSkillsRolesTables < ActiveRecord::Migration 2 | def self.up 3 | drop_table :languages 4 | drop_table :skills 5 | drop_table :roles 6 | end 7 | 8 | def self.down 9 | create_table :languages do |t| 10 | t.name :string 11 | t.belongs_to :polyglot, :polymorphic => true 12 | end 13 | create_table :roles do |t| 14 | t.name :string 15 | t.belongs_to :rolable, :polymorphic => true 16 | end 17 | create_table :skills do |t| 18 | t.name :string 19 | t.belongs_to :skillable, :polymorphic => true 20 | end 21 | end 22 | end 23 | -------------------------------------------------------------------------------- /db/migrate/20110812194931_change_activity_in_activity_feeds.rb: -------------------------------------------------------------------------------- 1 | class ChangeActivityInActivityFeeds < ActiveRecord::Migration 2 | def self.up 3 | remove_column :activity_feeds, :activity 4 | add_column :activity_feeds, :activity, :text 5 | end 6 | 7 | def self.down 8 | remove_column :activity_feeds, :activity 9 | add_column :activity_feeds, :activity, :string 10 | 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /db/migrate/20110812221737_changing_people_bio_to_text.rb: -------------------------------------------------------------------------------- 1 | class ChangingPeopleBioToText < ActiveRecord::Migration 2 | def self.up 3 | remove_column :people, :bio 4 | add_column :people, :bio, :text 5 | end 6 | 7 | def self.down 8 | remove_column :people, :bio 9 | add_column :people, :bio, :string 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /lib/api_client.rb: -------------------------------------------------------------------------------- 1 | # Provides a common interface for interacting with various oauthed services 2 | module APIClient 3 | class APIAuthenticationError < StandardError; end 4 | 5 | def self.for(auth, options={}) 6 | return ("APIClient::" + OmniAuth::Utils.camelize(auth.provider)).constantize.new(auth, options) 7 | rescue NameError 8 | consumer = OAUTH_CONSUMERS[auth.provider] 9 | 10 | if consumer.is_a?(::OAuth::Consumer) 11 | return APIClient::OAuth.new(auth) 12 | elsif consumer.is_a?(::OAuth2::Client) 13 | return APIClient::OAuth2.new(auth) 14 | else 15 | return nil 16 | end 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /lib/api_client/base.rb: -------------------------------------------------------------------------------- 1 | module APIClient 2 | class Base 3 | DEFAULT_LIMIT = 5 4 | attr_reader :client 5 | 6 | def initialize(auth, options={}) 7 | @auth = auth 8 | end 9 | 10 | def search(query, options = {}) 11 | [] 12 | end 13 | 14 | def get(id) 15 | nil 16 | end 17 | end 18 | end 19 | -------------------------------------------------------------------------------- /lib/api_client/facebook.rb: -------------------------------------------------------------------------------- 1 | module APIClient 2 | class Facebook < APIClient::OAuth2 3 | def initialize(auth, options={}) 4 | super(auth) 5 | @client = ::Mogli::Client.new(auth.access_token) 6 | end 7 | 8 | def search(query, options = {}) 9 | Mogli::User.search(query, @client, :limit => (options[:limit] || DEFAULT_LIMIT)).map{|fb_search_result| 10 | fb_user = Mogli::User.find(fb_search_result.id, client) 11 | self.person_from(fb_user) 12 | } 13 | end 14 | 15 | def get(id) 16 | fb_user = Mogli::User.find(id, @client) 17 | self.person_from(fb_user) if fb_user.present? 18 | end 19 | 20 | def person_from(fb_user) 21 | # Facebook's large image URL redirects from https to http, which open-uri forbids. 22 | photo_url = fb_user.large_image_url.gsub!("https://graph.facebook.com/", "http://graph.facebook.com/") 23 | 24 | Person.new( :name => fb_user.name, 25 | :bio => fb_user.bio, 26 | :photo_import_url => photo_url, 27 | :url => fb_user.website, 28 | :location => fb_user.location.try(:name) ) \ 29 | .tap{|person| 30 | person.imported_from_provider = 'facebook' 31 | person.imported_from_id = fb_user.id 32 | } 33 | end 34 | end 35 | end 36 | -------------------------------------------------------------------------------- /lib/api_client/o_auth.rb: -------------------------------------------------------------------------------- 1 | module APIClient 2 | class OAuth < APIClient::Base 3 | def initialize(auth, options={}) 4 | super 5 | @client = access_token_object 6 | end 7 | 8 | def consumer 9 | OAUTH_CONSUMERS[@auth.provider] 10 | end 11 | 12 | def access_token_object 13 | ::OAuth::AccessToken.new(consumer, @auth.access_token, @auth.access_token_secret) 14 | end 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /lib/api_client/o_auth2.rb: -------------------------------------------------------------------------------- 1 | module APIClient 2 | class OAuth2 < APIClient::Base 3 | def initialize(auth, options={}) 4 | super 5 | @client = access_token_object 6 | end 7 | 8 | def consumer 9 | OAUTH_CONSUMERS[@auth.provider] 10 | end 11 | 12 | def access_token_object 13 | ::OAuth2::AccessToken.new(consumer, @auth.access_token) 14 | end 15 | end 16 | end 17 | -------------------------------------------------------------------------------- /lib/application_responder.rb: -------------------------------------------------------------------------------- 1 | class ApplicationResponder < ActionController::Responder 2 | include Responders::FlashResponder 3 | include Responders::HttpCacheResponder 4 | 5 | # Uncomment this responder if you want your resources to redirect to the collection 6 | # path (index action) instead of the resource path for POST/PUT/DELETE requests. 7 | # include Responders::CollectionResponder 8 | end 9 | -------------------------------------------------------------------------------- /lib/localness.rb: -------------------------------------------------------------------------------- 1 | module Localness 2 | PORTLAND_SUBURBS = ["beaverton", "gresham", "hillsboro", "clackamas", 3 | "damascus", "gladstone", "king city", "lake oswego", 4 | "milwaukie", "oregon city", "sherwood", "tigard", 5 | "troutdale", "tualatin", "west linn", "wilsonville", 6 | "aloha"] 7 | 8 | def localness(person) 9 | location = person.location.try(:downcase) || '' 10 | if %w(portland pdx stumptown).any?{|term| location.include?(term) } 11 | return 5 12 | elsif PORTLAND_SUBURBS.any?{|term| location.include?(term) } 13 | return 4 14 | elsif %w(oregon washington or wa).any?{|term| location.include?(term) } 15 | return 3 16 | else 17 | return 0 18 | end 19 | end 20 | end 21 | -------------------------------------------------------------------------------- /lib/tasks/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/lib/tasks/.gitkeep -------------------------------------------------------------------------------- /public/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | The page you were looking for doesn't exist (404) 5 | 17 | 18 | 19 | 20 | 21 |
    22 |

    The page you were looking for doesn't exist.

    23 |

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

    24 |
    25 | 26 | 27 | -------------------------------------------------------------------------------- /public/422.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | The change you wanted was rejected (422) 5 | 17 | 18 | 19 | 20 | 21 |
    22 |

    The change you wanted was rejected.

    23 |

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

    24 |
    25 | 26 | 27 | -------------------------------------------------------------------------------- /public/500.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | We're sorry, but something went wrong (500) 5 | 17 | 18 | 19 | 20 | 21 |
    22 |

    We're sorry, but something went wrong.

    23 |

    We've been notified about this issue and we'll take a look at it shortly.

    24 |
    25 | 26 | 27 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/favicon.ico -------------------------------------------------------------------------------- /public/fonts/League_Gothic-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/fonts/League_Gothic-webfont.eot -------------------------------------------------------------------------------- /public/fonts/League_Gothic-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/fonts/League_Gothic-webfont.ttf -------------------------------------------------------------------------------- /public/fonts/League_Gothic-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/fonts/League_Gothic-webfont.woff -------------------------------------------------------------------------------- /public/images/add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/add.png -------------------------------------------------------------------------------- /public/images/arrow-left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/arrow-left.png -------------------------------------------------------------------------------- /public/images/arrow-right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/arrow-right.png -------------------------------------------------------------------------------- /public/images/arrows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/arrows.png -------------------------------------------------------------------------------- /public/images/authbuttons/aol_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/aol_128.png -------------------------------------------------------------------------------- /public/images/authbuttons/aol_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/aol_256.png -------------------------------------------------------------------------------- /public/images/authbuttons/aol_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/aol_32.png -------------------------------------------------------------------------------- /public/images/authbuttons/aol_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/aol_64.png -------------------------------------------------------------------------------- /public/images/authbuttons/auth-add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/auth-add.png -------------------------------------------------------------------------------- /public/images/authbuttons/auth-delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/auth-delete.png -------------------------------------------------------------------------------- /public/images/authbuttons/basecamp_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/basecamp_128.png -------------------------------------------------------------------------------- /public/images/authbuttons/basecamp_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/basecamp_256.png -------------------------------------------------------------------------------- /public/images/authbuttons/basecamp_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/basecamp_32.png -------------------------------------------------------------------------------- /public/images/authbuttons/basecamp_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/basecamp_64.png -------------------------------------------------------------------------------- /public/images/authbuttons/campfire_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/campfire_128.png -------------------------------------------------------------------------------- /public/images/authbuttons/campfire_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/campfire_256.png -------------------------------------------------------------------------------- /public/images/authbuttons/campfire_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/campfire_32.png -------------------------------------------------------------------------------- /public/images/authbuttons/campfire_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/campfire_64.png -------------------------------------------------------------------------------- /public/images/authbuttons/facebook_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/facebook_128.png -------------------------------------------------------------------------------- /public/images/authbuttons/facebook_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/facebook_256.png -------------------------------------------------------------------------------- /public/images/authbuttons/facebook_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/facebook_32.png -------------------------------------------------------------------------------- /public/images/authbuttons/facebook_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/facebook_64.png -------------------------------------------------------------------------------- /public/images/authbuttons/github_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/github_128.png -------------------------------------------------------------------------------- /public/images/authbuttons/github_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/github_256.png -------------------------------------------------------------------------------- /public/images/authbuttons/github_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/github_32.png -------------------------------------------------------------------------------- /public/images/authbuttons/github_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/github_64.png -------------------------------------------------------------------------------- /public/images/authbuttons/google_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/google_128.png -------------------------------------------------------------------------------- /public/images/authbuttons/google_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/google_256.png -------------------------------------------------------------------------------- /public/images/authbuttons/google_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/google_32.png -------------------------------------------------------------------------------- /public/images/authbuttons/google_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/google_64.png -------------------------------------------------------------------------------- /public/images/authbuttons/linked_in_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/linked_in_128.png -------------------------------------------------------------------------------- /public/images/authbuttons/linked_in_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/linked_in_256.png -------------------------------------------------------------------------------- /public/images/authbuttons/linked_in_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/linked_in_32.png -------------------------------------------------------------------------------- /public/images/authbuttons/linked_in_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/linked_in_64.png -------------------------------------------------------------------------------- /public/images/authbuttons/myspace_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/myspace_128.png -------------------------------------------------------------------------------- /public/images/authbuttons/myspace_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/myspace_256.png -------------------------------------------------------------------------------- /public/images/authbuttons/myspace_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/myspace_32.png -------------------------------------------------------------------------------- /public/images/authbuttons/myspace_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/myspace_64.png -------------------------------------------------------------------------------- /public/images/authbuttons/open_id_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/open_id_128.png -------------------------------------------------------------------------------- /public/images/authbuttons/open_id_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/open_id_256.png -------------------------------------------------------------------------------- /public/images/authbuttons/open_id_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/open_id_32.png -------------------------------------------------------------------------------- /public/images/authbuttons/open_id_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/open_id_64.png -------------------------------------------------------------------------------- /public/images/authbuttons/presently_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/presently_128.png -------------------------------------------------------------------------------- /public/images/authbuttons/presently_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/presently_256.png -------------------------------------------------------------------------------- /public/images/authbuttons/presently_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/presently_32.png -------------------------------------------------------------------------------- /public/images/authbuttons/presently_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/presently_64.png -------------------------------------------------------------------------------- /public/images/authbuttons/twitter_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/twitter_128.png -------------------------------------------------------------------------------- /public/images/authbuttons/twitter_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/twitter_256.png -------------------------------------------------------------------------------- /public/images/authbuttons/twitter_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/twitter_32.png -------------------------------------------------------------------------------- /public/images/authbuttons/twitter_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/twitter_64.png -------------------------------------------------------------------------------- /public/images/authbuttons/yahoo_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/yahoo_128.png -------------------------------------------------------------------------------- /public/images/authbuttons/yahoo_256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/yahoo_256.png -------------------------------------------------------------------------------- /public/images/authbuttons/yahoo_32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/yahoo_32.png -------------------------------------------------------------------------------- /public/images/authbuttons/yahoo_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/authbuttons/yahoo_64.png -------------------------------------------------------------------------------- /public/images/avatar-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/avatar-1.png -------------------------------------------------------------------------------- /public/images/avatar-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/avatar-2.png -------------------------------------------------------------------------------- /public/images/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/background.png -------------------------------------------------------------------------------- /public/images/binocular.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/binocular.png -------------------------------------------------------------------------------- /public/images/bos-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/bos-icon.png -------------------------------------------------------------------------------- /public/images/cfa-full-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/cfa-full-logo.png -------------------------------------------------------------------------------- /public/images/check-white-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/check-white-icon.png -------------------------------------------------------------------------------- /public/images/cityhero_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/cityhero_logo.png -------------------------------------------------------------------------------- /public/images/civicopia-widget-bottom-dropshadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/civicopia-widget-bottom-dropshadow.png -------------------------------------------------------------------------------- /public/images/content-border.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/content-border.png -------------------------------------------------------------------------------- /public/images/creepy-baby-sloth.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/creepy-baby-sloth.jpg -------------------------------------------------------------------------------- /public/images/default_app_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/default_app_1.png -------------------------------------------------------------------------------- /public/images/default_app_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/default_app_2.png -------------------------------------------------------------------------------- /public/images/default_app_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/default_app_3.png -------------------------------------------------------------------------------- /public/images/delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/delete.png -------------------------------------------------------------------------------- /public/images/example.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/example.jpg -------------------------------------------------------------------------------- /public/images/fork.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/fork.png -------------------------------------------------------------------------------- /public/images/geekcorpsavatar1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/geekcorpsavatar1.png -------------------------------------------------------------------------------- /public/images/geekcorpsavatar1_medium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/geekcorpsavatar1_medium.png -------------------------------------------------------------------------------- /public/images/geekcorpsavatar1_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/geekcorpsavatar1_small.png -------------------------------------------------------------------------------- /public/images/geekcorpsavatar1_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/geekcorpsavatar1_thumb.png -------------------------------------------------------------------------------- /public/images/geekcorpsavatar2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/geekcorpsavatar2.png -------------------------------------------------------------------------------- /public/images/geekcorpsavatar2_medium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/geekcorpsavatar2_medium.png -------------------------------------------------------------------------------- /public/images/geekcorpsavatar2_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/geekcorpsavatar2_small.png -------------------------------------------------------------------------------- /public/images/geekcorpsavatar2_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/geekcorpsavatar2_thumb.png -------------------------------------------------------------------------------- /public/images/geekcorpsavatar3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/geekcorpsavatar3.png -------------------------------------------------------------------------------- /public/images/geekcorpsavatar3_medium.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/geekcorpsavatar3_medium.png -------------------------------------------------------------------------------- /public/images/geekcorpsavatar3_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/geekcorpsavatar3_small.png -------------------------------------------------------------------------------- /public/images/geekcorpsavatar3_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/geekcorpsavatar3_thumb.png -------------------------------------------------------------------------------- /public/images/home_12x12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/home_12x12.png -------------------------------------------------------------------------------- /public/images/join-ribbon-shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/join-ribbon-shadow.png -------------------------------------------------------------------------------- /public/images/join-sash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/join-sash.png -------------------------------------------------------------------------------- /public/images/list-item-check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/list-item-check.png -------------------------------------------------------------------------------- /public/images/logo-sash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/logo-sash.png -------------------------------------------------------------------------------- /public/images/map-icon-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/map-icon-white.png -------------------------------------------------------------------------------- /public/images/map-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/map-icon.png -------------------------------------------------------------------------------- /public/images/map-shadow-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/map-shadow-icon.png -------------------------------------------------------------------------------- /public/images/no-image.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/no-image.gif -------------------------------------------------------------------------------- /public/images/notify_icon_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/notify_icon_green.png -------------------------------------------------------------------------------- /public/images/notify_icon_orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/notify_icon_orange.png -------------------------------------------------------------------------------- /public/images/notify_icon_purple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/notify_icon_purple.png -------------------------------------------------------------------------------- /public/images/notify_icon_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/notify_icon_red.png -------------------------------------------------------------------------------- /public/images/notify_icon_rust.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/notify_icon_rust.png -------------------------------------------------------------------------------- /public/images/org-sash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/org-sash.png -------------------------------------------------------------------------------- /public/images/org-sash.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/org-sash.psd -------------------------------------------------------------------------------- /public/images/person_photo_upload_img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/person_photo_upload_img.png -------------------------------------------------------------------------------- /public/images/person_photo_upload_img_sm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/person_photo_upload_img_sm.png -------------------------------------------------------------------------------- /public/images/phl-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/phl-icon.png -------------------------------------------------------------------------------- /public/images/progress-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/progress-background.png -------------------------------------------------------------------------------- /public/images/project-overview-dropshadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/project-overview-dropshadow.png -------------------------------------------------------------------------------- /public/images/rails.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/rails.png -------------------------------------------------------------------------------- /public/images/rainbow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/rainbow.png -------------------------------------------------------------------------------- /public/images/sanscons_16/add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/add.png -------------------------------------------------------------------------------- /public/images/sanscons_16/addressbook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/addressbook.png -------------------------------------------------------------------------------- /public/images/sanscons_16/alert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/alert.png -------------------------------------------------------------------------------- /public/images/sanscons_16/apple.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/apple.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow1_e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow1_e.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow1_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow1_n.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow1_ne.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow1_ne.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow1_nw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow1_nw.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow1_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow1_s.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow1_se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow1_se.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow1_sw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow1_sw.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow1_w.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow1_w.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow2_e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow2_e.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow2_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow2_n.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow2_ne.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow2_ne.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow2_nw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow2_nw.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow2_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow2_s.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow2_se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow2_se.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow2_sw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow2_sw.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow2_w.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow2_w.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow3_e.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow3_e.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow3_n.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow3_n.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow3_ne.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow3_ne.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow3_nw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow3_nw.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow3_s.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow3_s.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow3_se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow3_se.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow3_sw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow3_sw.png -------------------------------------------------------------------------------- /public/images/sanscons_16/arrow3_w.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/arrow3_w.png -------------------------------------------------------------------------------- /public/images/sanscons_16/ascii.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/ascii.png -------------------------------------------------------------------------------- /public/images/sanscons_16/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/back.png -------------------------------------------------------------------------------- /public/images/sanscons_16/bigsmile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/bigsmile.png -------------------------------------------------------------------------------- /public/images/sanscons_16/binary.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/binary.png -------------------------------------------------------------------------------- /public/images/sanscons_16/blah.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/blah.png -------------------------------------------------------------------------------- /public/images/sanscons_16/bstop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/bstop.png -------------------------------------------------------------------------------- /public/images/sanscons_16/buy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/buy.png -------------------------------------------------------------------------------- /public/images/sanscons_16/calday.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/calday.png -------------------------------------------------------------------------------- /public/images/sanscons_16/calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/calendar.png -------------------------------------------------------------------------------- /public/images/sanscons_16/camera.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/camera.png -------------------------------------------------------------------------------- /public/images/sanscons_16/cart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/cart.png -------------------------------------------------------------------------------- /public/images/sanscons_16/cd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/cd.png -------------------------------------------------------------------------------- /public/images/sanscons_16/cellphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/cellphone.png -------------------------------------------------------------------------------- /public/images/sanscons_16/chat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/chat.png -------------------------------------------------------------------------------- /public/images/sanscons_16/check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/check.png -------------------------------------------------------------------------------- /public/images/sanscons_16/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/close.png -------------------------------------------------------------------------------- /public/images/sanscons_16/comment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/comment.png -------------------------------------------------------------------------------- /public/images/sanscons_16/cube.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/cube.png -------------------------------------------------------------------------------- /public/images/sanscons_16/day.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/day.png -------------------------------------------------------------------------------- /public/images/sanscons_16/denied.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/denied.png -------------------------------------------------------------------------------- /public/images/sanscons_16/document.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/document.png -------------------------------------------------------------------------------- /public/images/sanscons_16/download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/download.png -------------------------------------------------------------------------------- /public/images/sanscons_16/edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/edit.png -------------------------------------------------------------------------------- /public/images/sanscons_16/eject.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/eject.png -------------------------------------------------------------------------------- /public/images/sanscons_16/equalizer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/equalizer.png -------------------------------------------------------------------------------- /public/images/sanscons_16/first.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/first.png -------------------------------------------------------------------------------- /public/images/sanscons_16/flag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/flag.png -------------------------------------------------------------------------------- /public/images/sanscons_16/flash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/flash.png -------------------------------------------------------------------------------- /public/images/sanscons_16/folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/folder.png -------------------------------------------------------------------------------- /public/images/sanscons_16/forward.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/forward.png -------------------------------------------------------------------------------- /public/images/sanscons_16/frown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/frown.png -------------------------------------------------------------------------------- /public/images/sanscons_16/ftp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/ftp.png -------------------------------------------------------------------------------- /public/images/sanscons_16/graph.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/graph.png -------------------------------------------------------------------------------- /public/images/sanscons_16/heart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/heart.png -------------------------------------------------------------------------------- /public/images/sanscons_16/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/home.png -------------------------------------------------------------------------------- /public/images/sanscons_16/html.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/html.png -------------------------------------------------------------------------------- /public/images/sanscons_16/ipod.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/ipod.png -------------------------------------------------------------------------------- /public/images/sanscons_16/last.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/last.png -------------------------------------------------------------------------------- /public/images/sanscons_16/lock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/lock.png -------------------------------------------------------------------------------- /public/images/sanscons_16/loop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/loop.png -------------------------------------------------------------------------------- /public/images/sanscons_16/mail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/mail.png -------------------------------------------------------------------------------- /public/images/sanscons_16/man.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/man.png -------------------------------------------------------------------------------- /public/images/sanscons_16/manman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/manman.png -------------------------------------------------------------------------------- /public/images/sanscons_16/music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/music.png -------------------------------------------------------------------------------- /public/images/sanscons_16/mute.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/mute.png -------------------------------------------------------------------------------- /public/images/sanscons_16/mute_centered.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/mute_centered.png -------------------------------------------------------------------------------- /public/images/sanscons_16/newwindow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/newwindow.png -------------------------------------------------------------------------------- /public/images/sanscons_16/next.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/next.png -------------------------------------------------------------------------------- /public/images/sanscons_16/night.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/night.png -------------------------------------------------------------------------------- /public/images/sanscons_16/open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/open.png -------------------------------------------------------------------------------- /public/images/sanscons_16/pause.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/pause.png -------------------------------------------------------------------------------- /public/images/sanscons_16/phone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/phone.png -------------------------------------------------------------------------------- /public/images/sanscons_16/play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/play.png -------------------------------------------------------------------------------- /public/images/sanscons_16/previous.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/previous.png -------------------------------------------------------------------------------- /public/images/sanscons_16/quicktime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/quicktime.png -------------------------------------------------------------------------------- /public/images/sanscons_16/redo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/redo.png -------------------------------------------------------------------------------- /public/images/sanscons_16/reload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/reload.png -------------------------------------------------------------------------------- /public/images/sanscons_16/sad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/sad.png -------------------------------------------------------------------------------- /public/images/sanscons_16/save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/save.png -------------------------------------------------------------------------------- /public/images/sanscons_16/scream.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/scream.png -------------------------------------------------------------------------------- /public/images/sanscons_16/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/search.png -------------------------------------------------------------------------------- /public/images/sanscons_16/seconds.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/seconds.png -------------------------------------------------------------------------------- /public/images/sanscons_16/smile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/smile.png -------------------------------------------------------------------------------- /public/images/sanscons_16/smirk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/smirk.png -------------------------------------------------------------------------------- /public/images/sanscons_16/star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/star.png -------------------------------------------------------------------------------- /public/images/sanscons_16/stop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/stop.png -------------------------------------------------------------------------------- /public/images/sanscons_16/subtract.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/subtract.png -------------------------------------------------------------------------------- /public/images/sanscons_16/switch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/switch.png -------------------------------------------------------------------------------- /public/images/sanscons_16/target.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/target.png -------------------------------------------------------------------------------- /public/images/sanscons_16/tcp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/tcp.png -------------------------------------------------------------------------------- /public/images/sanscons_16/time.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/time.png -------------------------------------------------------------------------------- /public/images/sanscons_16/toggle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/toggle.png -------------------------------------------------------------------------------- /public/images/sanscons_16/tongue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/tongue.png -------------------------------------------------------------------------------- /public/images/sanscons_16/tools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/tools.png -------------------------------------------------------------------------------- /public/images/sanscons_16/trackback.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/trackback.png -------------------------------------------------------------------------------- /public/images/sanscons_16/trash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/trash.png -------------------------------------------------------------------------------- /public/images/sanscons_16/tv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/tv.png -------------------------------------------------------------------------------- /public/images/sanscons_16/type.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/type.png -------------------------------------------------------------------------------- /public/images/sanscons_16/undo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/undo.png -------------------------------------------------------------------------------- /public/images/sanscons_16/unlock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/unlock.png -------------------------------------------------------------------------------- /public/images/sanscons_16/upload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/upload.png -------------------------------------------------------------------------------- /public/images/sanscons_16/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/user.png -------------------------------------------------------------------------------- /public/images/sanscons_16/video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/video.png -------------------------------------------------------------------------------- /public/images/sanscons_16/volume_high.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/volume_high.png -------------------------------------------------------------------------------- /public/images/sanscons_16/volume_low.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/volume_low.png -------------------------------------------------------------------------------- /public/images/sanscons_16/wifi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/wifi.png -------------------------------------------------------------------------------- /public/images/sanscons_16/window.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/window.png -------------------------------------------------------------------------------- /public/images/sanscons_16/woman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/woman.png -------------------------------------------------------------------------------- /public/images/sanscons_16/womanman.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/womanman.png -------------------------------------------------------------------------------- /public/images/sanscons_16/work.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/work.png -------------------------------------------------------------------------------- /public/images/sanscons_16/zoomin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/zoomin.png -------------------------------------------------------------------------------- /public/images/sanscons_16/zoomout.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sanscons_16/zoomout.png -------------------------------------------------------------------------------- /public/images/sea-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sea-icon.png -------------------------------------------------------------------------------- /public/images/search_icon-15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/search_icon-15.png -------------------------------------------------------------------------------- /public/images/search_icon-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/search_icon-50.png -------------------------------------------------------------------------------- /public/images/sf-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/sf-icon.png -------------------------------------------------------------------------------- /public/images/stats-border.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/stats-border.png -------------------------------------------------------------------------------- /public/images/step-indicate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/step-indicate.png -------------------------------------------------------------------------------- /public/images/target-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/target-icon.png -------------------------------------------------------------------------------- /public/images/tmp-geekcorps-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/tmp-geekcorps-logo.png -------------------------------------------------------------------------------- /public/images/twitter-24x24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/twitter-24x24.png -------------------------------------------------------------------------------- /public/images/wayfinder-check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/wayfinder-check.png -------------------------------------------------------------------------------- /public/images/wayfinder-item-background1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/wayfinder-item-background1.png -------------------------------------------------------------------------------- /public/images/wayfinder-item-background2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/wayfinder-item-background2.png -------------------------------------------------------------------------------- /public/images/wayfinder-plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/wayfinder-plus.png -------------------------------------------------------------------------------- /public/images/widget-border.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/widget-border.png -------------------------------------------------------------------------------- /public/images/wizard-field-tip-border.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/wizard-field-tip-border.png -------------------------------------------------------------------------------- /public/images/wizard-general-tip-border.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/images/wizard-general-tip-border.png -------------------------------------------------------------------------------- /public/javascripts/lib/jquery.hoverexpand.js: -------------------------------------------------------------------------------- 1 | (function($) { 2 | $.fn.hoverexpand = function(options) { 3 | var defaults = { 4 | minHeight: '100px', // If an element has a height greater than minHeight, it will become 'expandable' 5 | collapsedClass: 'expand-me', // Class to be added to 'expandable' elements. The class is removed at the end of the expand event 6 | hoverTime: 500 // Time (in ms) that a user must hover over an element before it expands 7 | }; 8 | var options = $.extend(defaults, options); 9 | 10 | return this.each(function() { 11 | var $obj = $(this); 12 | var origHeight = $obj.css('height'); 13 | var timer = null; 14 | 15 | if( parseInt(origHeight) > parseInt(options.minHeight)) { 16 | $obj.css({ 17 | height: options.minHeight, 18 | overflow: 'hidden' 19 | }).addClass(options.collapsedClass); 20 | 21 | $obj.hover( 22 | function() { // mouseover 23 | if(!timer) { 24 | timer = window.setTimeout(function() { 25 | $obj.animate({height: origHeight }, 500).removeClass(options.collapsedClass); //expand 26 | timer = null; 27 | }, options.hoverTime); 28 | } 29 | }, 30 | function() { // mouseout 31 | if(timer) { 32 | window.clearTimeout(timer); 33 | timer = null; 34 | } else { 35 | $obj.animate({height: options.minHeight}, 500).addClass(options.collapsedClass); //contract 36 | } 37 | } 38 | ); 39 | } 40 | }); 41 | }; 42 | })(jQuery); -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # See http://www.robotstxt.org/wc/norobots.html for documentation on how to use the robots.txt file 2 | # 3 | # To ban all spiders from the entire site uncomment the next two lines: 4 | # User-Agent: * 5 | # Disallow: / 6 | -------------------------------------------------------------------------------- /public/stylesheets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/public/stylesheets/.gitkeep -------------------------------------------------------------------------------- /public/stylesheets/reset.css: -------------------------------------------------------------------------------- 1 | /* http://meyerweb.com/eric/tools/css/reset/ 2 | v2.0 | 20110126 3 | License: none (public domain) 4 | */ 5 | 6 | html, body, div, span, applet, object, iframe, 7 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 8 | a, abbr, acronym, address, big, cite, code, 9 | del, dfn, em, img, ins, kbd, q, s, samp, 10 | small, strike, strong, sub, sup, tt, var, 11 | b, u, i, center, 12 | dl, dt, dd, ol, ul, li, 13 | fieldset, form, label, legend, 14 | table, caption, tbody, tfoot, thead, tr, th, td, 15 | article, aside, canvas, details, embed, 16 | figure, figcaption, footer, header, hgroup, 17 | menu, nav, output, ruby, section, summary, 18 | time, mark, audio, video { 19 | margin: 0; 20 | padding: 0; 21 | border: 0; 22 | font-size: 100%; 23 | font: inherit; 24 | } 25 | /* HTML5 display-role reset for older browsers */ 26 | article, aside, details, figcaption, figure, 27 | footer, header, hgroup, menu, nav, section { 28 | display: block; 29 | } 30 | body { 31 | line-height: 1; 32 | } 33 | ol, ul { 34 | list-style: none; 35 | } 36 | blockquote, q { 37 | quotes: none; 38 | } 39 | blockquote:before, blockquote:after, 40 | q:before, q:after { 41 | content: ''; 42 | content: none; 43 | } 44 | table { 45 | border-collapse: collapse; 46 | border-spacing: 0; 47 | } -------------------------------------------------------------------------------- /script/delayed_job: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | 3 | require File.expand_path(File.join(File.dirname(__FILE__), '..', 'config', 'environment')) 4 | require 'delayed/command' 5 | Delayed::Command.new(ARGV).daemonize 6 | -------------------------------------------------------------------------------- /script/rails: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application. 3 | 4 | APP_PATH = File.expand_path('../../config/application', __FILE__) 5 | require File.expand_path('../../config/boot', __FILE__) 6 | require 'rails/commands' 7 | -------------------------------------------------------------------------------- /spec/controllers/comments_controller_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe CommentsController do 4 | 5 | describe "post 'create'" do 6 | 7 | before do 8 | @user = Factory(:user) 9 | sign_in(@user) 10 | @comment = Factory(:comment) 11 | end 12 | 13 | 14 | it "should be post to comments and redirect with success" do 15 | request.env['HTTP_REFERER'] = @comment.commentable.to_url 16 | post 'create', :comment => Factory.attributes_for(:comment, :team => @comment.team, :user => @user, :commentable => @comment.commentable ) 17 | flash[:success].should == 'Comment added!' 18 | response.should redirect_to @comment.commentable.to_url 19 | end 20 | 21 | it "should be post to comments and redirect with error" do 22 | request.env['HTTP_REFERER'] = '/' + @comment.team.to_url 23 | post 'create',:comment => Factory.attributes_for(:comment, :team => @comment.team, :commentable => nil) 24 | flash[:error].should == 'We had a problem adding that comment' 25 | 26 | end 27 | 28 | end 29 | 30 | describe "not signed in" do 31 | 32 | before do 33 | @comment = Factory(:comment) 34 | end 35 | 36 | it "should not be successful" do 37 | post 'create', :comment => Factory.attributes_for(:comment, :team => @comment.team, :user => @comment.user, :commentable => @comment.team) 38 | response.should redirect_to new_user_session_path 39 | end 40 | 41 | end 42 | 43 | end 44 | -------------------------------------------------------------------------------- /spec/controllers/details_controller_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe DetailsController do 4 | 5 | end 6 | -------------------------------------------------------------------------------- /spec/controllers/regions_controller_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe RegionsController do 4 | 5 | end 6 | -------------------------------------------------------------------------------- /spec/controllers/teams_controller_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe TeamsController do 4 | 5 | before do 6 | @user = Factory(:user) 7 | sign_in(@user) 8 | end 9 | 10 | it "creates a team around an application" do 11 | pending 'this worked as of 27c4b3e but now its not, and none of the actors have substantially changed....' do 12 | app = Factory(:app) 13 | region = Factory(:region) 14 | expect { 15 | post :create, :app_id => app.id 16 | }.to change(Team, :count).by(1) 17 | end 18 | end 19 | end 20 | -------------------------------------------------------------------------------- /spec/factories/github_contacts.json: -------------------------------------------------------------------------------- 1 | [[{"results":70,"page":1,"total_items":70}],[ 2 | {"coder":{"blog":"http://buttonpresser.com","company":"Buttonpresser","created_at":"2010-09-02T19:23:11Z","email":"pete@buttonpresser.com","first_commit":"2011-01-25T17:06:40Z","followers_count":2,"following_count":2,"gravatar_id":"53ef865f704bafef10b893f277849e78","id":5,"location":"Grand Rapids, Michigan","login":"Buttonpresser","name":"Pete Fecteau","org_id":null,"permission":null,"public_gist_count":0,"public_repo_count":7}}, 3 | {"coder":{"blog":"http://labratrevenge.com","company":"Lab Rat Revenge LLC","created_at":"2008-01-15T04:47:24Z","email":"justin@labratrevenge.com","first_commit":"2010-10-07T08:49:46Z","followers_count":161,"following_count":44,"gravatar_id":"05234d5e970dd3c5f23e16898106062a","id":6,"location":"Portland, OR","login":"Caged","name":"Justin Palmer","org_id":null,"permission":null,"public_gist_count":35,"public_repo_count":26}} 4 | ]] -------------------------------------------------------------------------------- /spec/factories/github_contacts_update.json: -------------------------------------------------------------------------------- 1 | [[{"results":70,"page":1,"total_items":70}],[ 2 | {"coder":{"blog":"http://buttonpresser.com","company":"Buttonpresser","created_at":"2010-09-02T19:23:11Z","email":"pete@buttonpresser.com","first_commit":"2011-01-25T17:06:40Z","followers_count":2,"following_count":2,"gravatar_id":"53ef865f704bafef10b893f277849e78","id":5,"location":"Grand Rapids, Michigan","login":"Buttonpresser","name":"Pete Fecteau","org_id":null,"permission":null,"public_gist_count":0,"public_repo_count":7}}, 3 | {"coder":{"blog":"http://labratrevenge.com","company":"Lab Rat Revenge LLC","created_at":"2008-01-15T04:47:24Z","email":"justin@labratrevenge.com","first_commit":"2010-10-07T08:49:46Z","followers_count":161,"following_count":44,"gravatar_id":"05234d5e970dd3c5f23e16898106062a","id":6,"location":"Portland, OR","login":"lover","name":"Justin Palmer","org_id":null,"permission":null,"public_gist_count":35,"public_repo_count":26}} 4 | ]] -------------------------------------------------------------------------------- /spec/factories/github_contacts_update_coder.json: -------------------------------------------------------------------------------- 1 | [[{"results":1,"page":1,"total_items":1}],[{"coder":{"blog":"http://www.codeforamerica.org","company":"Code for America","created_at":"2009-06-28T17:57:22Z","email":"melton.dan@gmail.com","first_commit":"2010-11-06T21:14:51Z","followers_count":15,"following_count":19,"gravatar_id":"4616698e5452eae10b53f2092f0d6cb6","id":4,"location":"San Francisco","login":"danmelton","name":"Dan Melton","org_id":null,"permission":null,"public_gist_count":1,"public_repo_count":19}}]] -------------------------------------------------------------------------------- /spec/models/activity_feed_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe ActivityFeed do 4 | before do 5 | @team = Factory(:team) 6 | @activity_feed = Factory(:activity_feed, :team => @team) 7 | end 8 | 9 | context "validations" do 10 | it "require team" do 11 | feed = ActivityFeed.new(Factory.attributes_for(:activity_feed, :team => nil)) 12 | feed.save.should be_false 13 | end 14 | 15 | it "require feedable" do 16 | feed = ActivityFeed.new(Factory.attributes_for(:activity_feed, :feedable => nil)) 17 | feed.save.should be_false 18 | end 19 | 20 | end 21 | 22 | context "crud functions" do 23 | 24 | it 'should respond to teams' do 25 | @activity_feed.respond_to?(:team).should be_true 26 | end 27 | 28 | it 'should respond to feedable' do 29 | @activity_feed.respond_to?(:feedable).should be_true 30 | end 31 | 32 | end 33 | 34 | end 35 | -------------------------------------------------------------------------------- /spec/models/app_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe App do 4 | before do 5 | @app = Factory(:app) 6 | end 7 | context 'has many' do 8 | it 'teams' do 9 | @app.respond_to?(:teams).should be_true 10 | end 11 | it 'details' do 12 | @app.respond_to?(:details).should be_true 13 | end 14 | it 'team_members' do 15 | @app.respond_to?(:team_members).should be_true 16 | end 17 | it 'users' do 18 | @app.respond_to?(:users).should be_true 19 | end 20 | end 21 | context 'validates' do 22 | it 'uniqueness of name' do 23 | attr = Factory.attributes_for(:app) 24 | @app = App.new(attr) 25 | @app.save! 26 | @invalid_app = App.new(attr) 27 | @invalid_app.should have(1).error_on(:name) 28 | end 29 | end 30 | 31 | context 'aggregates skill list' do 32 | it 'skill_list' do 33 | s1 = Factory(:step, :app => @app, :skill_list => ['one', 'two']) 34 | s2 = Factory(:step, :app => @app, :skill_list => ['two']) 35 | s3 = Factory(:step, :app => @app, :skill_list => ['two', 'three']) 36 | s4 = Factory(:step, :app => @app, :skill_list => ['one', 'two']) 37 | s5 = Factory(:step, :app => @app, :skill_list => ['two']) 38 | s6 = Factory(:step, :app => @app, :skill_list => ['two', 'three']) 39 | m1 = Factory(:milestone, :app => @app, :steps => [s3, s2, s1]) 40 | m2 = Factory(:milestone, :app => @app, :steps => [s4, s5, s6]) 41 | @app.reload.milestones.size.should == 2 42 | @app.reload.skill_list.should == ['one', 'two', 'three'] 43 | end 44 | 45 | end 46 | end 47 | -------------------------------------------------------------------------------- /spec/models/batchbook_contact_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | ENV['batchbook_account'] = 'codeforamerica' 3 | ENV['batchbook_key'] = 'something' 4 | 5 | describe BatchbookContact do 6 | 7 | # before do 8 | # BatchbookContact.delete_all 9 | # end 10 | # 11 | # describe "sync with server" do 12 | # before do 13 | # stub_request(:get, "http://something:x@codeforamerica.batchbook.com/service/people.xml?limit=100&offset=1"). 14 | # with(:headers => {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}). 15 | # to_return(:status => 200, :body => fixture("batchbook_people.xml"), :headers => {}) 16 | # end 17 | # 18 | # it "should add contacts" do 19 | # BatchbookContact.new.get_contacts(1) 20 | # end 21 | # 22 | # end 23 | end 24 | -------------------------------------------------------------------------------- /spec/models/detail_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe Detail do 4 | before do 5 | @detail = Factory.build(:detail) 6 | end 7 | context 'belongs to' do 8 | it 'app' do 9 | @detail.respond_to?(:app).should be_true 10 | end 11 | it 'team' do 12 | @detail.respond_to?(:team).should be_true 13 | end 14 | end 15 | context 'validates' do 16 | it 'unique name' do 17 | attr = Factory.attributes_for(:detail) 18 | @detail = Detail.new(attr) 19 | @detail.save! 20 | @invalid_detail = Detail.new(attr) 21 | @invalid_detail.should have(1).error_on(:name) 22 | end 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /spec/models/milestone_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe Milestone do 4 | 5 | it 'skill_list' do 6 | s1 = Factory(:step, :skill_list => ['one', 'two']) 7 | s2 = Factory(:step, :skill_list => ['two']) 8 | s3 = Factory(:step, :skill_list => ['two', 'three']) 9 | m = Factory(:milestone, :steps => [s3, s2, s1]) 10 | m.skill_list.sort.should == ['one', 'two', 'three'].sort 11 | end 12 | end 13 | -------------------------------------------------------------------------------- /spec/models/person_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe Person do 4 | before do 5 | @person = Factory(:person) 6 | end 7 | context 'belongs to' do 8 | it 'user' do 9 | @person.respond_to?(:user).should be_true 10 | end 11 | end 12 | context 'validates' do 13 | it 'presence of name' do 14 | @person.name = nil 15 | @person.should have(1).error_on(:name) 16 | end 17 | end 18 | 19 | end 20 | -------------------------------------------------------------------------------- /spec/models/region_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe Region do 4 | before do 5 | @region = Factory(:region) 6 | end 7 | context 'has many' do 8 | it 'teams' do 9 | @region.respond_to?(:teams).should be_true 10 | end 11 | it 'users' do 12 | @region.respond_to?(:users).should be_true 13 | end 14 | end 15 | context 'validates' do 16 | 17 | it 'uniqueness of city' do 18 | attr = Factory.attributes_for(:region) 19 | @region = Region.new(attr) 20 | @region.save! 21 | @invalid_region = Region.new(attr) 22 | @invalid_region.should have(1).error_on(:city) 23 | end 24 | 25 | it 'presence of nick_name' do 26 | @region.nick_name = nil 27 | @region.should have(1).error_on(:nick_name) 28 | end 29 | end 30 | end 31 | -------------------------------------------------------------------------------- /spec/models/team_member_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe TeamMember do 4 | before do 5 | @team_member = Factory(:team_member) 6 | end 7 | context 'belongs_to' do 8 | it 'user' do 9 | @team_member.respond_to?(:user).should be_true 10 | end 11 | it 'team' do 12 | @team_member.respond_to?(:team).should be_true 13 | end 14 | it 'app' do 15 | @team_member.respond_to?(:app).should be_true 16 | end 17 | end 18 | context 'validations' do 19 | it 'must have a user' do 20 | @team_member.user = nil 21 | @team_member.should have(1).error_on(:user) 22 | end 23 | it 'must have a team' do 24 | @team_member.team = nil 25 | @team_member.should have(1).error_on(:team) 26 | end 27 | it 'must have an app' do 28 | @team_member.app = nil 29 | @team_member.should have(1).error_on(:app) 30 | end 31 | end 32 | end 33 | -------------------------------------------------------------------------------- /spec/models/team_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe Team do 4 | context 'associates' do 5 | before do 6 | @team = Factory.build(:team) 7 | end 8 | it 'many team members' do 9 | @team.respond_to?(:team_members).should be_true 10 | end 11 | it 'many members' do 12 | @team.respond_to?(:members).should be_true 13 | end 14 | it 'many details' do 15 | @team.respond_to?(:details).should be_true 16 | end 17 | it 'belongs to region' do 18 | @team.respond_to?(:region).should be_true 19 | end 20 | it 'belongs to app' do 21 | @team.respond_to?(:app).should be_true 22 | end 23 | end 24 | context 'create_team_name' do 25 | before do 26 | @team = Factory.build(:team) 27 | end 28 | it "should create a unique name for an implementation team" do 29 | @team.team_type = 'substantial' 30 | @team.save(:validate => false) 31 | @team.name.should == (@team.region.nick_name + "-" + @team.app.name).gsub(" ", "-").downcase 32 | end 33 | it "should create a name that matches the application if its the core team" do 34 | @team.team_type = "core" 35 | @team.save(:validate => false) 36 | @team.name.should == @team.app.name 37 | end 38 | end 39 | end 40 | -------------------------------------------------------------------------------- /spec/models/user_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe 'User' do 4 | 5 | context 'has accessible attribute' do 6 | before do 7 | @user = Factory(:user) 8 | end 9 | it("email") { @user.respond_to?(:email).should be_true } 10 | it("remember_me") { @user.respond_to?(:remember_me).should be_true } 11 | end 12 | context 'has association with' do 13 | before do 14 | @user = Factory(:user) 15 | end 16 | it('one person') { @user.respond_to?(:person).should be_true } 17 | it('many team_members') { @user.respond_to?(:team_members).should be_true } 18 | it('many teams') { @user.respond_to?(:teams).should be_true } 19 | it('one region') { @user.respond_to?(:region).should be_true } 20 | it('many authentications') { @user.respond_to?(:authentications).should be_true } 21 | end 22 | context 'validates' do 23 | end 24 | context 'methods' do 25 | before do 26 | @user = Factory(:user) 27 | end 28 | it 'returns a default image if theres an authentication but no image stored with that auth' do 29 | new_auth = @user.authentications.create! 30 | @user.authentications = [new_auth] 31 | @user.person = nil 32 | @user.save! 33 | @user.avatar_url.should == '/images/geekcorpsavatar1.png' 34 | end 35 | end 36 | end 37 | -------------------------------------------------------------------------------- /spec/views/comments/create.html.erb_spec.rb: -------------------------------------------------------------------------------- 1 | require 'spec_helper' 2 | 3 | describe "comments/create.html.erb" do 4 | pending "add some examples to (or delete) #{__FILE__}" 5 | end 6 | -------------------------------------------------------------------------------- /vendor/plugins/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codeforamerica/geek_corps/17e8ff02f0335674c6e3d43c82108afbc3831d87/vendor/plugins/.gitkeep --------------------------------------------------------------------------------