Showing preview only (8,718K chars total). Download the full file or copy to clipboard to get everything.
Repository: Bettermeans/bettermeans
Branch: master
Commit: 3cc796930874
Files: 1916
Total size: 7.9 MB
Directory structure:
gitextract_i_av7aco/
├── .gitignore
├── .gitmodules
├── .rspec
├── .rvmrc
├── Gemfile
├── Guardfile
├── README.md
├── Rakefile
├── app/
│ ├── controllers/
│ │ ├── account_controller.rb
│ │ ├── activity_stream_preferences_controller.rb
│ │ ├── activity_stream_preferences_module.rb
│ │ ├── activity_streams_controller.rb
│ │ ├── activity_streams_module.rb
│ │ ├── admin_controller.rb
│ │ ├── application_controller.rb
│ │ ├── attachments_controller.rb
│ │ ├── auth_sources_controller.rb
│ │ ├── boards_controller.rb
│ │ ├── comments_controller.rb
│ │ ├── credit_distributions_controller.rb
│ │ ├── credit_transfers_controller.rb
│ │ ├── credits_controller.rb
│ │ ├── documents_controller.rb
│ │ ├── email_updates_controller.rb
│ │ ├── enterprises_controller.rb
│ │ ├── enumerations_controller.rb
│ │ ├── help_controller.rb
│ │ ├── help_sections_controller.rb
│ │ ├── home_controller.rb
│ │ ├── hourly_types_controller.rb
│ │ ├── invitations_controller.rb
│ │ ├── issue_invitations_controller.rb
│ │ ├── issue_relations_controller.rb
│ │ ├── issue_statuses_controller.rb
│ │ ├── issue_votes_controller.rb
│ │ ├── issues_controller.rb
│ │ ├── journals_controller.rb
│ │ ├── mail_handler_controller.rb
│ │ ├── mails_controller.rb
│ │ ├── members_controller.rb
│ │ ├── messages_controller.rb
│ │ ├── motion_votes_controller.rb
│ │ ├── motions_controller.rb
│ │ ├── my_controller.rb
│ │ ├── news_controller.rb
│ │ ├── notifications_controller.rb
│ │ ├── projects_controller.rb
│ │ ├── queries_controller.rb
│ │ ├── quotes_controller.rb
│ │ ├── recurly_notifications_controller.rb
│ │ ├── reports_controller.rb
│ │ ├── reputations_controller.rb
│ │ ├── retro_ratings_controller.rb
│ │ ├── retros_controller.rb
│ │ ├── roles_controller.rb
│ │ ├── search_controller.rb
│ │ ├── settings_controller.rb
│ │ ├── shares_controller.rb
│ │ ├── todos_controller.rb
│ │ ├── trackers_controller.rb
│ │ ├── users_controller.rb
│ │ ├── votes_controller.rb
│ │ ├── watchers_controller.rb
│ │ ├── welcome_controller.rb
│ │ ├── wiki_controller.rb
│ │ ├── wikis_controller.rb
│ │ └── workflows_controller.rb
│ ├── helpers/
│ │ ├── admin_helper.rb
│ │ ├── application_helper.rb
│ │ ├── attachments_helper.rb
│ │ ├── groups_helper.rb
│ │ ├── issue_relations_helper.rb
│ │ ├── issues_helper.rb
│ │ ├── journals_helper.rb
│ │ ├── messages_helper.rb
│ │ ├── motions_helper.rb
│ │ ├── my_helper.rb
│ │ ├── news_helper.rb
│ │ ├── projects_helper.rb
│ │ ├── queries_helper.rb
│ │ ├── reports_helper.rb
│ │ ├── retros_helper.rb
│ │ ├── search_helper.rb
│ │ ├── settings_helper.rb
│ │ ├── sort_helper.rb
│ │ ├── users_helper.rb
│ │ ├── watchers_helper.rb
│ │ └── wiki_helper.rb
│ ├── models/
│ │ ├── activity_stream.rb
│ │ ├── activity_stream_preference.rb
│ │ ├── activity_stream_total.rb
│ │ ├── attachment.rb
│ │ ├── auth_source.rb
│ │ ├── auth_source_ldap.rb
│ │ ├── board.rb
│ │ ├── comment.rb
│ │ ├── credit.rb
│ │ ├── credit_distribution.rb
│ │ ├── credit_transfer.rb
│ │ ├── daily_digest.rb
│ │ ├── document.rb
│ │ ├── document_observer.rb
│ │ ├── email_update.rb
│ │ ├── enabled_module.rb
│ │ ├── enterprise.rb
│ │ ├── enumeration.rb
│ │ ├── help_section.rb
│ │ ├── hourly_type.rb
│ │ ├── invitation.rb
│ │ ├── issue.rb
│ │ ├── issue_observer.rb
│ │ ├── issue_relation.rb
│ │ ├── issue_status.rb
│ │ ├── issue_vote.rb
│ │ ├── journal.rb
│ │ ├── journal_detail.rb
│ │ ├── journal_observer.rb
│ │ ├── mail.rb
│ │ ├── mail_handler.rb
│ │ ├── mailer.rb
│ │ ├── member.rb
│ │ ├── member_role.rb
│ │ ├── message.rb
│ │ ├── message_observer.rb
│ │ ├── motion.rb
│ │ ├── motion_vote.rb
│ │ ├── news.rb
│ │ ├── news_observer.rb
│ │ ├── notification.rb
│ │ ├── open_id_authentication_association.rb
│ │ ├── open_id_authentication_nonces.rb
│ │ ├── personal_welcome.rb
│ │ ├── plan.rb
│ │ ├── plugin_schema_info.rb
│ │ ├── project.rb
│ │ ├── query.rb
│ │ ├── quote.rb
│ │ ├── reputation.rb
│ │ ├── retro.rb
│ │ ├── retro_rating.rb
│ │ ├── role.rb
│ │ ├── setting.rb
│ │ ├── share.rb
│ │ ├── todo.rb
│ │ ├── token.rb
│ │ ├── track.rb
│ │ ├── tracker.rb
│ │ ├── user.rb
│ │ ├── user_preference.rb
│ │ ├── watcher.rb
│ │ ├── wiki.rb
│ │ ├── wiki_content.rb
│ │ ├── wiki_content_observer.rb
│ │ ├── wiki_page.rb
│ │ ├── wiki_redirect.rb
│ │ └── workflow.rb
│ └── views/
│ ├── account/
│ │ ├── login.html.erb
│ │ ├── lost_password.html.erb
│ │ ├── password_recovery.html.erb
│ │ └── register.html.erb
│ ├── activity_stream_preferences/
│ │ └── index.html.erb
│ ├── activity_streams/
│ │ ├── _activity_comment.html.erb
│ │ ├── _activity_stream.html.erb
│ │ ├── _activity_stream_feed.atom.builder
│ │ ├── _activity_stream_group.erb
│ │ ├── _activity_stream_list.html.erb
│ │ ├── _activity_stream_sub.html.erb
│ │ ├── _indirect_object.html.erb
│ │ ├── _table_header.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── admin/
│ │ ├── _menu.html.erb
│ │ ├── _no_data.html.erb
│ │ ├── index.html.erb
│ │ ├── info.html.erb
│ │ ├── plugins.html.erb
│ │ ├── projects.html.erb
│ │ └── user_stats.html.erb
│ ├── attachments/
│ │ ├── _form.html.erb
│ │ ├── _links.html.erb
│ │ ├── _table.erb
│ │ ├── diff.html.erb
│ │ └── file.html.erb
│ ├── auth_sources/
│ │ ├── _form.html.erb
│ │ ├── edit.html.erb
│ │ ├── list.html.erb
│ │ └── new.html.erb
│ ├── boards/
│ │ ├── _form.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── common/
│ │ ├── 403.html.erb
│ │ ├── 404.html.erb
│ │ ├── _calendar.html.erb
│ │ ├── _diff.html.erb
│ │ ├── _file.html.erb
│ │ ├── _main_menu_home.html.erb
│ │ ├── _preview.html.erb
│ │ ├── _tabs.html.erb
│ │ └── feed.atom.rxml
│ ├── credit_distributions/
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── credit_transfers/
│ │ ├── _credit_transfer_history.html.erb
│ │ ├── _eligible_recipients.erb
│ │ ├── _new_credit_transfer.html.erb
│ │ └── index.html.erb
│ ├── credits/
│ │ ├── _credit_breakdown.html.erb
│ │ ├── _credit_history.html.erb
│ │ ├── _credit_queue.html.erb
│ │ ├── _my_credits.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── documents/
│ │ ├── _document.html.erb
│ │ ├── _form.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── email_updates/
│ │ └── new.html.erb
│ ├── enterprises/
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── enumerations/
│ │ ├── _form.html.erb
│ │ ├── destroy.html.erb
│ │ ├── edit.html.erb
│ │ ├── list.html.erb
│ │ └── new.html.erb
│ ├── help/
│ │ └── show.html.erb
│ ├── help_sections/
│ │ ├── _show.html.erb
│ │ ├── _show_popup.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── home/
│ │ ├── _footer.html.erb
│ │ ├── _header.html.erb
│ │ ├── about.html.erb
│ │ ├── apps.html.erb
│ │ ├── contact.html.erb
│ │ ├── elements.html.erb
│ │ ├── features_original.html.erb
│ │ ├── how.html.erb
│ │ ├── hq.html.erb
│ │ ├── index.html.erb
│ │ ├── library.html.erb
│ │ ├── old_index.html.erb
│ │ ├── old_index2.html.erb
│ │ ├── old_inviteonline.html.erb
│ │ ├── open_enterprise_governance_model.html.erb
│ │ ├── pricing.html.erb
│ │ ├── privacy.html.erb
│ │ ├── services.html.erb
│ │ ├── signup.html.erb
│ │ ├── tour.html.erb
│ │ ├── user_agreement.html.erb
│ │ ├── webdesign.html.erb
│ │ ├── what.html.erb
│ │ └── why.html.erb
│ ├── hourly_types/
│ │ ├── _form.html.erb
│ │ ├── edit.html.erb
│ │ └── new.html.erb
│ ├── invitations/
│ │ ├── _generic_invitation.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── issue_relations/
│ │ └── _form.html.erb
│ ├── issue_statuses/
│ │ ├── _form.html.erb
│ │ ├── edit.html.erb
│ │ ├── list.html.erb
│ │ └── new.html.erb
│ ├── issue_votes/
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── issues/
│ │ ├── _action_menu.html.erb
│ │ ├── _attributes.html.erb
│ │ ├── _edit.html.erb
│ │ ├── _form.html.erb
│ │ ├── _form_add_team_member.html.erb
│ │ ├── _form_update.html.erb
│ │ ├── _history.html.erb
│ │ ├── _joined_by.html.erb
│ │ ├── _list.html.erb
│ │ ├── _list_simple.html.erb
│ │ ├── _list_very_simple.html.erb
│ │ ├── _relations.html.erb
│ │ ├── _sidebar.html.erb
│ │ ├── calendar.html.erb
│ │ ├── changes.rxml
│ │ ├── context_menu.html.erb
│ │ ├── edit.html.erb
│ │ ├── gantt.html.erb
│ │ ├── index.html.erb
│ │ ├── move.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── journals/
│ │ ├── _notes_form.html.erb
│ │ ├── edit.rjs
│ │ └── update.rjs
│ ├── layouts/
│ │ ├── _account_menu.html.erb
│ │ ├── activescaffold.html.erb
│ │ ├── admin.html.erb
│ │ ├── base.html.erb
│ │ ├── blank.html.erb
│ │ ├── gooey.html.erb
│ │ ├── help_sections.html.erb
│ │ ├── issue_blank.html.erb
│ │ ├── mailer.text.html.erb
│ │ ├── mailer.text.plain.erb
│ │ └── static.html.erb
│ ├── mailer/
│ │ ├── _issue_text_html.html.erb
│ │ ├── _issue_text_plain.html.erb
│ │ ├── account_activated.text.html.html.erb
│ │ ├── account_activated.text.plain.html.erb
│ │ ├── account_activation_request.text.html.html.erb
│ │ ├── account_activation_request.text.plain.html.erb
│ │ ├── account_information.text.html.html.erb
│ │ ├── account_information.text.plain.html.erb
│ │ ├── attachments_added.text.html.html.erb
│ │ ├── attachments_added.text.plain.html.erb
│ │ ├── daily_digest.text.html.html.erb
│ │ ├── daily_digest.text.plain.html.erb
│ │ ├── document_added.text.html.html.erb
│ │ ├── document_added.text.plain.html.erb
│ │ ├── email_update_activation.text.html.html.erb
│ │ ├── email_update_activation.text.plain.html.erb
│ │ ├── invitation_add.text.html.html.erb
│ │ ├── invitation_add.text.plain.html.erb
│ │ ├── invitation_remind.text.html.html.erb
│ │ ├── invitation_remind.text.plain.html.erb
│ │ ├── issue_add.text.html.html.erb
│ │ ├── issue_add.text.plain.html.erb
│ │ ├── issue_edit.text.html.html.erb
│ │ ├── issue_edit.text.plain.html.erb
│ │ ├── lost_password.text.html.html.erb
│ │ ├── lost_password.text.plain.html.erb
│ │ ├── message_posted.text.html.html.erb
│ │ ├── message_posted.text.plain.html.erb
│ │ ├── news_added.text.html.html.erb
│ │ ├── news_added.text.plain.html.erb
│ │ ├── personal_welcome.text.html.html.erb
│ │ ├── personal_welcome.text.plain.html.erb
│ │ ├── register.text.html.html.erb
│ │ ├── register.text.plain.html.erb
│ │ ├── reminder.text.html.html.erb
│ │ ├── reminder.text.plain.html.erb
│ │ ├── test.text.html.html.erb
│ │ ├── test.text.plain.html.erb
│ │ ├── wiki_content_added.text.html.html.erb
│ │ ├── wiki_content_added.text.plain.html.erb
│ │ ├── wiki_content_updated.text.html.html.erb
│ │ └── wiki_content_updated.text.plain.html.erb
│ ├── mails/
│ │ ├── _inbox.html.erb
│ │ ├── _sent.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── members/
│ │ └── autocomplete_for_member.html.erb
│ ├── messages/
│ │ ├── _form.html.erb
│ │ ├── _motion_topic.html.erb
│ │ ├── edit.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── motion_votes/
│ │ ├── _vote.html.erb
│ │ ├── cast_vote.js.rjs
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── motions/
│ │ ├── _motions.html.erb
│ │ ├── edit.html.erb
│ │ ├── eligible_users.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── my/
│ │ ├── _belong_to_projects.html.erb
│ │ ├── _billing_form.html.erb
│ │ ├── _block.html.erb
│ │ ├── _my_projects.html.erb
│ │ ├── _plan_description.html.erb
│ │ ├── _plan_descriptions.html.erb
│ │ ├── _project_list.html.erb
│ │ ├── _sidebar.html.erb
│ │ ├── _usage_stats.html.erb
│ │ ├── account.html.erb
│ │ ├── blocks/
│ │ │ ├── _calendar.html.erb
│ │ │ ├── _documents.html.erb
│ │ │ ├── _issuesassignedtome.html.erb
│ │ │ ├── _issuesreportedbyme.html.erb
│ │ │ ├── _issueswatched.html.erb
│ │ │ └── _news.html.erb
│ │ ├── issues.html.erb
│ │ ├── page.html.erb
│ │ ├── page_layout.html.erb
│ │ ├── password.html.erb
│ │ ├── projects.html.erb
│ │ └── upgrade.html.erb
│ ├── news/
│ │ ├── _form.html.erb
│ │ ├── _news.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── notifications/
│ │ ├── _credits_distributed.erb
│ │ ├── _credits_transferred.html.erb
│ │ ├── _invitation.erb
│ │ ├── _issue_joined.html.erb
│ │ ├── _issue_left.html.erb
│ │ ├── _issue_team_member_added.html.erb
│ │ ├── _issue_team_member_removed.html.erb
│ │ ├── _mention.html.erb
│ │ ├── _message.html.erb
│ │ ├── _motion_started.erb
│ │ ├── _new_role.erb
│ │ ├── _retro_ended.erb
│ │ ├── _retro_started.erb
│ │ ├── _trial_expired.html.erb
│ │ ├── _unresponded.html.erb
│ │ ├── _usage_over.html.erb
│ │ ├── edit.html.erb
│ │ ├── error.js.rjs
│ │ ├── hide.js.rjs
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── projects/
│ │ ├── _active_member_box.html.erb
│ │ ├── _active_member_box_simple.html.erb
│ │ ├── _clearance_member_box.html.erb
│ │ ├── _dashboard_javascript_variables.html.erb
│ │ ├── _edit.html.erb
│ │ ├── _form.html.erb
│ │ ├── _member_box.html.erb
│ │ ├── _point_scale.html.erb
│ │ ├── _project_list.html.erb
│ │ ├── _project_summary.html.erb
│ │ ├── _projects_list_simple.html.erb
│ │ ├── _subprojects.html.erb
│ │ ├── _team_link.html.erb
│ │ ├── _team_list.html.erb
│ │ ├── _team_list_member.html.erb
│ │ ├── activity.html.erb
│ │ ├── add.html.erb
│ │ ├── add_file.html.erb
│ │ ├── copy.html.erb
│ │ ├── core_vote.js.rjs
│ │ ├── credits.html.erb
│ │ ├── dashboard.html.erb
│ │ ├── index.html.erb
│ │ ├── list_files.html.erb
│ │ ├── list_members.html.erb
│ │ ├── map.html.erb
│ │ ├── move.html.erb
│ │ ├── overview.html.erb
│ │ ├── settings/
│ │ │ ├── _boards.html.erb
│ │ │ ├── _hourly_types.html.erb
│ │ │ ├── _members.html.erb
│ │ │ ├── _modules.html.erb
│ │ │ ├── _select_new_member.html.erb
│ │ │ └── _wiki.html.erb
│ │ ├── settings.html.erb
│ │ ├── show.png.flexi
│ │ ├── team.html.erb
│ │ └── team_update.js.rjs
│ ├── queries/
│ │ ├── _columns.html.erb
│ │ ├── _filters.html.erb
│ │ ├── _form.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ └── new.html.erb
│ ├── quotes/
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── reports/
│ │ ├── _details.html.erb
│ │ ├── _simple.html.erb
│ │ ├── issue_report.html.erb
│ │ └── issue_report_details.html.erb
│ ├── reputations/
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── retro_ratings/
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── retros/
│ │ ├── _issue_details.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ ├── show.html.erb
│ │ └── show_multiple.html.erb
│ ├── roles/
│ │ ├── _form.html.erb
│ │ ├── edit.html.erb
│ │ ├── list.html.erb
│ │ ├── new.html.erb
│ │ └── report.html.erb
│ ├── search/
│ │ └── index.html.erb
│ ├── settings/
│ │ ├── _authentication.html.erb
│ │ ├── _display.html.erb
│ │ ├── _general.html.erb
│ │ ├── _issues.html.erb
│ │ ├── _mail_handler.html.erb
│ │ ├── _notifications.html.erb
│ │ ├── _projects.html.erb
│ │ ├── edit.html.erb
│ │ └── plugin.html.erb
│ ├── shares/
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── todos/
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── trackers/
│ │ ├── _form.html.erb
│ │ ├── edit.html.erb
│ │ ├── list.html.erb
│ │ └── new.html.erb
│ ├── users/
│ │ ├── _activity.html.erb
│ │ ├── _form.html.erb
│ │ ├── _general.html.erb
│ │ ├── _general_info.html.erb
│ │ ├── _membership.html.erb
│ │ ├── _memberships.html.erb
│ │ ├── _reputation.html.erb
│ │ ├── add.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ └── show.html.erb
│ ├── watchers/
│ │ └── _watchers.html.erb
│ ├── welcome/
│ │ ├── _list_workstreams.html.erb
│ │ ├── index.html.erb
│ │ └── robots.html.erb
│ ├── wiki/
│ │ ├── _content.html.erb
│ │ ├── _sidebar.html.erb
│ │ ├── annotate.html.erb
│ │ ├── destroy.html.erb
│ │ ├── diff.html.erb
│ │ ├── edit.html.erb
│ │ ├── export.html.erb
│ │ ├── export_multiple.html.erb
│ │ ├── history.html.erb
│ │ ├── rename.html.erb
│ │ ├── show.html.erb
│ │ ├── special_date_index.html.erb
│ │ └── special_page_index.html.erb
│ ├── wikis/
│ │ └── destroy.html.erb
│ └── workflows/
│ ├── _action_menu.html.erb
│ ├── copy.html.erb
│ ├── edit.html.erb
│ └── index.html.erb
├── config/
│ ├── additional_environment.rb.example
│ ├── boot.rb
│ ├── database.yml.example
│ ├── email.yml.example
│ ├── environment.rb
│ ├── environments/
│ │ ├── cucumber.rb
│ │ ├── demo.rb
│ │ ├── development.rb
│ │ ├── production.rb
│ │ ├── selenium.rb
│ │ ├── test.rb
│ │ ├── test_pgsql.rb
│ │ └── test_sqlite3.rb
│ ├── exceptional.yml
│ ├── initializers/
│ │ ├── 10-patches.rb
│ │ ├── 20-mime_types.rb
│ │ ├── 30-redmine.rb
│ │ ├── 40-email.rb
│ │ ├── activity_streams.rb
│ │ ├── admin_data.rb
│ │ ├── aws_s3.rb
│ │ ├── backtrace_silencers.rb
│ │ ├── bigdecimal-segfault-fix.rb
│ │ ├── hash.rb
│ │ ├── inflections.rb
│ │ ├── recurly_config.rb
│ │ └── timeout.rb
│ ├── locales/
│ │ └── en.yml
│ ├── preinitializer.rb
│ ├── rails_best_practices.yml
│ ├── routes.rb
│ ├── s3.yml
│ ├── selenium.yml
│ └── settings.yml
├── cucumber.yml
├── db/
│ ├── migrate/
│ │ ├── 20110320055526_acts_as_taggable_on_migration.rb
│ │ ├── 20110329230314_add_projectid_to_taggable.rb
│ │ └── 20110330041648_add_tags_to_issue.rb
│ ├── schema.rb
│ └── seeds.rb
├── deploy
├── doc/
│ ├── COPYING
│ ├── INSTALL
│ ├── README_FOR_APP
│ └── RUNNING_TESTS
├── extra/
│ ├── mail_handler/
│ │ └── rdm-mailhandler.rb
│ └── sample_plugin/
│ ├── README
│ ├── app/
│ │ ├── controllers/
│ │ │ └── example_controller.rb
│ │ ├── models/
│ │ │ └── meeting.rb
│ │ └── views/
│ │ ├── example/
│ │ │ ├── say_goodbye.html.erb
│ │ │ └── say_hello.html.erb
│ │ ├── my/
│ │ │ └── blocks/
│ │ │ └── _sample_block.html.erb
│ │ └── settings/
│ │ └── _sample_plugin_settings.html.erb
│ ├── assets/
│ │ └── stylesheets/
│ │ └── example.css
│ ├── config/
│ │ └── locales/
│ │ ├── en.yml
│ │ └── fr.yml
│ ├── db/
│ │ └── migrate/
│ │ └── 001_create_meetings.rb
│ └── init.rb
├── lib/
│ ├── activity_streams/
│ │ ├── log_activity_streams.rb
│ │ └── routes.rb
│ ├── activity_streams.rb
│ ├── ar_condition.rb
│ ├── diff.rb
│ ├── faster_csv.rb
│ ├── float.rb
│ ├── generators/
│ │ ├── redmine_plugin/
│ │ │ ├── USAGE
│ │ │ ├── redmine_plugin_generator.rb
│ │ │ └── templates/
│ │ │ ├── README.rdoc
│ │ │ ├── en.yml
│ │ │ ├── en_rails_i18n.yml
│ │ │ ├── init.rb.erb
│ │ │ └── test_helper.rb.erb
│ │ ├── redmine_plugin_controller/
│ │ │ ├── USAGE
│ │ │ ├── redmine_plugin_controller_generator.rb
│ │ │ └── templates/
│ │ │ ├── controller.rb.erb
│ │ │ ├── functional_test.rb.erb
│ │ │ ├── helper.rb.erb
│ │ │ └── view.html.erb
│ │ └── redmine_plugin_model/
│ │ ├── USAGE
│ │ ├── redmine_plugin_model_generator.rb
│ │ └── templates/
│ │ ├── fixtures.yml
│ │ ├── migration.rb.erb
│ │ ├── model.rb.erb
│ │ └── unit_test.rb.erb
│ ├── mention.rb
│ ├── redcloth3.rb
│ ├── redmine/
│ │ ├── about.rb
│ │ ├── access_control.rb
│ │ ├── access_keys.rb
│ │ ├── activity/
│ │ │ └── fetcher.rb
│ │ ├── activity.rb
│ │ ├── core_ext/
│ │ │ ├── string/
│ │ │ │ ├── conversions.rb
│ │ │ │ └── inflections.rb
│ │ │ └── string.rb
│ │ ├── core_ext.rb
│ │ ├── default_data/
│ │ │ └── loader.rb
│ │ ├── export/
│ │ │ └── pdf.rb
│ │ ├── helpers/
│ │ │ ├── calendar.rb
│ │ │ └── gantt.rb
│ │ ├── i18n.rb
│ │ ├── imap.rb
│ │ ├── info.rb
│ │ ├── menu_manager.rb
│ │ ├── mime_type.rb
│ │ ├── platform.rb
│ │ ├── plugin.rb
│ │ ├── search.rb
│ │ ├── themes.rb
│ │ ├── unified_diff.rb
│ │ ├── utils.rb
│ │ ├── version.rb
│ │ ├── views/
│ │ │ ├── my_page/
│ │ │ │ └── block.rb
│ │ │ └── other_formats_builder.rb
│ │ ├── wiki_formatting/
│ │ │ ├── macros.rb
│ │ │ └── textile/
│ │ │ ├── formatter.rb
│ │ │ └── helper.rb
│ │ └── wiki_formatting.rb
│ ├── redmine.rb
│ ├── string.rb
│ ├── tabular_form_builder.rb
│ └── tasks/
│ ├── autoaccept_commitrequests.rake
│ ├── backup.rake
│ ├── bootstrap.rake
│ ├── cleanup.rake
│ ├── close_retros.rake
│ ├── cron.rake
│ ├── cucumber.rake
│ ├── custom.rake
│ ├── deprecated.rake
│ ├── email.rake
│ ├── extract_fixtures.rake
│ ├── fetch_changesets.rake
│ ├── initializers.rake
│ ├── load_default_data.rake
│ ├── locales.rake
│ ├── metrics.rake
│ ├── migrate_from_mantis.rake
│ ├── migrate_from_trac.rake
│ ├── migrate_plugins.rake
│ ├── plugins.rake
│ ├── reek.rake
│ ├── reminder.rake
│ ├── remove_problem_type.rake
│ ├── reset_all_passwords.rake
│ ├── rspec.rake
│ ├── steak.rake
│ ├── testing.rake
│ ├── update_item_statuses.rake
│ └── watchers.rake
├── public/
│ ├── .htaccess
│ ├── 404.html
│ ├── 500.html
│ ├── help/
│ │ ├── wiki_syntax.html
│ │ └── wiki_syntax_detailed.html
│ ├── images/
│ │ ├── gallery/
│ │ │ └── index.sof
│ │ ├── inner-background.psd
│ │ └── static/
│ │ ├── HomePageMain.psd
│ │ ├── Untitled-1.psd
│ │ ├── Untitled-2.psd
│ │ ├── call-us.psd
│ │ ├── col-img3.psd
│ │ ├── index.sof
│ │ ├── landingmockup.psd
│ │ ├── pricings-buttom.psd
│ │ ├── thanks.psd
│ │ └── videotemplate.psd
│ ├── javascripts/
│ │ ├── application.js
│ │ ├── calendar/
│ │ │ ├── calendar-setup.js
│ │ │ ├── calendar.js
│ │ │ └── lang/
│ │ │ ├── calendar-bg.js
│ │ │ ├── calendar-bs.js
│ │ │ ├── calendar-ca.js
│ │ │ ├── calendar-cs.js
│ │ │ ├── calendar-da.js
│ │ │ ├── calendar-de.js
│ │ │ ├── calendar-en.js
│ │ │ ├── calendar-es.js
│ │ │ ├── calendar-fi.js
│ │ │ ├── calendar-fr.js
│ │ │ ├── calendar-gl.js
│ │ │ ├── calendar-he.js
│ │ │ ├── calendar-hu.js
│ │ │ ├── calendar-id.js
│ │ │ ├── calendar-it.js
│ │ │ ├── calendar-ja.js
│ │ │ ├── calendar-ko.js
│ │ │ ├── calendar-lt.js
│ │ │ ├── calendar-mk.js
│ │ │ ├── calendar-nl.js
│ │ │ ├── calendar-no.js
│ │ │ ├── calendar-pl.js
│ │ │ ├── calendar-pt-br.js
│ │ │ ├── calendar-pt.js
│ │ │ ├── calendar-ro.js
│ │ │ ├── calendar-ru.js
│ │ │ ├── calendar-sk.js
│ │ │ ├── calendar-sl.js
│ │ │ ├── calendar-sr.js
│ │ │ ├── calendar-sv.js
│ │ │ ├── calendar-th.js
│ │ │ ├── calendar-tr.js
│ │ │ ├── calendar-uk.js
│ │ │ ├── calendar-vi.js
│ │ │ ├── calendar-zh-tw.js
│ │ │ └── calendar-zh.js
│ │ ├── context_menu.js
│ │ ├── controls.js
│ │ ├── dashboard.js
│ │ ├── dragdrop.js
│ │ ├── effects.js
│ │ ├── enterprise_map.js
│ │ ├── fancybox/
│ │ │ ├── index.sof
│ │ │ ├── jquery.fancybox-1.3.0.css
│ │ │ ├── jquery.fancybox-1.3.0.pack.js
│ │ │ └── jquery.mousewheel-3.0.2.pack.js
│ │ ├── fileuploader.js
│ │ ├── hoverIntent.js
│ │ ├── issue.js
│ │ ├── jQuery.bubbletip-1.0.4.js
│ │ ├── jScrollPane
│ │ ├── jScrollPane.js
│ │ ├── jit-yc.js
│ │ ├── jit.js
│ │ ├── jquery-ui.js
│ │ ├── jquery.autocomplete.js
│ │ ├── jquery.autocomplete.pack.js
│ │ ├── jquery.easing-1.3.pack.js
│ │ ├── jquery.em.js
│ │ ├── jquery.fancybox-1.3.0.js
│ │ ├── jquery.fancybox-1.3.0.pack.js
│ │ ├── jquery.fancybox-1.3.4.js
│ │ ├── jquery.fancybox-1.3.4.pack.js
│ │ ├── jquery.fileupload-ui.js
│ │ ├── jquery.fileupload.js
│ │ ├── jquery.jgrowl_minimized.js
│ │ ├── jquery.js
│ │ ├── jquery.mousewheel-3.0.2.pack.js
│ │ ├── jquery.mousewheel-3.0.4.pack.js
│ │ ├── jquery.mousewheel.js
│ │ ├── jquery.scrollTo-min.js
│ │ ├── jquery.tagsinput.js
│ │ ├── jquery.ui.autocomplete.ext.js
│ │ ├── jquery.ui.autocomplete.js
│ │ ├── jquery.ui.position.js
│ │ ├── jrails.js
│ │ ├── json2.js
│ │ ├── jstoolbar/
│ │ │ ├── jstoolbar.js
│ │ │ ├── lang/
│ │ │ │ ├── jstoolbar-bg.js
│ │ │ │ ├── jstoolbar-bs.js
│ │ │ │ ├── jstoolbar-ca.js
│ │ │ │ ├── jstoolbar-cs.js
│ │ │ │ ├── jstoolbar-da.js
│ │ │ │ ├── jstoolbar-de.js
│ │ │ │ ├── jstoolbar-en.js
│ │ │ │ ├── jstoolbar-es.js
│ │ │ │ ├── jstoolbar-fi.js
│ │ │ │ ├── jstoolbar-fr.js
│ │ │ │ ├── jstoolbar-gl.js
│ │ │ │ ├── jstoolbar-he.js
│ │ │ │ ├── jstoolbar-hu.js
│ │ │ │ ├── jstoolbar-id.js
│ │ │ │ ├── jstoolbar-it.js
│ │ │ │ ├── jstoolbar-ja.js
│ │ │ │ ├── jstoolbar-ko.js
│ │ │ │ ├── jstoolbar-lt.js
│ │ │ │ ├── jstoolbar-mk.js
│ │ │ │ ├── jstoolbar-nl.js
│ │ │ │ ├── jstoolbar-no.js
│ │ │ │ ├── jstoolbar-pl.js
│ │ │ │ ├── jstoolbar-pt-br.js
│ │ │ │ ├── jstoolbar-pt.js
│ │ │ │ ├── jstoolbar-ro.js
│ │ │ │ ├── jstoolbar-ru.js
│ │ │ │ ├── jstoolbar-sk.js
│ │ │ │ ├── jstoolbar-sl.js
│ │ │ │ ├── jstoolbar-sr.js
│ │ │ │ ├── jstoolbar-sv.js
│ │ │ │ ├── jstoolbar-th.js
│ │ │ │ ├── jstoolbar-tr.js
│ │ │ │ ├── jstoolbar-uk.js
│ │ │ │ ├── jstoolbar-vi.js
│ │ │ │ ├── jstoolbar-zh-tw.js
│ │ │ │ └── jstoolbar-zh.js
│ │ │ └── textile.js
│ │ ├── lightbox.js
│ │ ├── prototype.js
│ │ ├── repository_navigation.js
│ │ ├── retro.js
│ │ ├── select_list_move.js
│ │ ├── static/
│ │ │ ├── Quicksand_Book_400.font.js
│ │ │ ├── css_browser_selector.js
│ │ │ ├── cufon-yui.js
│ │ │ ├── execute.js
│ │ │ ├── hoverIntent.js
│ │ │ ├── index.sof
│ │ │ ├── jquery-galleryview-1.1/
│ │ │ │ ├── index.sof
│ │ │ │ ├── jquery.galleryview-1.1.js
│ │ │ │ └── jquery.timers-1.1.2.js
│ │ │ ├── jquery.easing.1.3.js
│ │ │ ├── jquery.scroll.pack.js
│ │ │ ├── jquery.send.js
│ │ │ └── superfish.js
│ │ ├── store.js
│ │ ├── superfish.js
│ │ ├── supersubs.js
│ │ ├── textile-editor-config.js
│ │ └── textile-editor.js
│ ├── maintenance/
│ │ └── index.html
│ ├── stylesheets/
│ │ ├── bubbletip-IE.css
│ │ ├── bubbletip.css
│ │ ├── calendar.css
│ │ ├── context_menu.css
│ │ ├── csshover.htc
│ │ ├── custom.css
│ │ ├── dashboard.css
│ │ ├── enterprise_map.css
│ │ ├── fileuploader.css
│ │ ├── gt-fixed.css
│ │ ├── gt-rounded-corners.css
│ │ ├── gt-styles.css
│ │ ├── headerandfooter.css
│ │ ├── issue.css
│ │ ├── jScrollPane.css
│ │ ├── jquery-ui-1.7.2.custom.css
│ │ ├── jquery-ui-1.8.8.custom.css
│ │ ├── jquery.autocomplete.css
│ │ ├── jquery.fancybox-1.3.0.css
│ │ ├── jquery.fancybox-1.3.4.css
│ │ ├── jquery.fileupload-ui.css
│ │ ├── jquery.tagsinput.css
│ │ ├── jquery.ui.autocomplete.css
│ │ ├── jstoolbar.css
│ │ ├── lightbox.css
│ │ ├── oldapplication.css
│ │ ├── override.css
│ │ ├── reset-fonts.css
│ │ ├── scaffold.css
│ │ ├── scm.css
│ │ ├── static/
│ │ │ ├── index.sof
│ │ │ ├── print.css
│ │ │ ├── screen.css
│ │ │ ├── style.css
│ │ │ └── superfish.css
│ │ └── textile-editor.css
│ └── themes/
│ ├── README
│ └── bettermeans/
│ └── stylesheets/
│ └── application.css
├── script/
│ ├── about
│ ├── autospec
│ ├── breakpointer
│ ├── console
│ ├── cucumber
│ ├── dbconsole
│ ├── delayed_job
│ ├── destroy
│ ├── generate
│ ├── performance/
│ │ ├── benchmarker
│ │ ├── profiler
│ │ └── request
│ ├── plugin
│ ├── process/
│ │ ├── inspector
│ │ ├── reaper
│ │ ├── spawner
│ │ └── spinner
│ ├── runner
│ ├── server
│ └── spec
├── spec/
│ ├── acceptance/
│ │ ├── acceptance_helper.rb
│ │ ├── support/
│ │ │ ├── helpers.rb
│ │ │ └── paths.rb
│ │ └── user_login_spec.rb
│ ├── controllers/
│ │ ├── account_controller_spec.rb
│ │ └── projects/
│ │ ├── index_active_spec.rb
│ │ ├── index_latest_spec.rb
│ │ ├── index_spec.rb
│ │ ├── move_spec.rb
│ │ └── new_dash_data_spec.rb
│ ├── factories.rb
│ ├── lib/
│ │ └── hash_spec.rb
│ ├── models/
│ │ └── project_spec.rb
│ ├── rcov.opts
│ ├── routing/
│ │ ├── accounts_routing_spec.rb
│ │ ├── activity_stream_preferences_routing_spec.rb
│ │ ├── activity_streams_routing_spec.rb
│ │ ├── admin_routing_spec.rb
│ │ ├── attachments_routing_spec.rb
│ │ ├── auth_sources_routing_spec.rb
│ │ ├── boards_routing_spec.rb
│ │ ├── comments_routing_spec.rb
│ │ ├── credit_distributions_routing_spec.rb
│ │ ├── credit_transfers_routing_spec.rb
│ │ ├── credits_routing_spec.rb
│ │ ├── documents_routing_spec.rb
│ │ ├── email_updates_routing_spec.rb
│ │ ├── enterprises_routing_spec.rb
│ │ ├── enumerations_routing_spec.rb
│ │ ├── help_routing_spec.rb
│ │ ├── help_sections_routing_spec.rb
│ │ ├── home_routing_spec.rb
│ │ ├── hourly_types_routing_spec.rb
│ │ ├── invitations_routing_spec.rb
│ │ ├── issue_invitations_routing_spec.rb
│ │ ├── issue_relations_routing_spec.rb
│ │ ├── issue_statuses_routing_spec.rb
│ │ ├── issue_votes_routing_spec.rb
│ │ ├── issues_routing_spec.rb
│ │ ├── journals_routing_spec.rb
│ │ ├── mail_handler_routing_spec.rb
│ │ ├── mails_routing_spec.rb
│ │ ├── members_routing_spec.rb
│ │ ├── messages_routing_spec.rb
│ │ ├── motion_votes_routing_spec.rb
│ │ ├── motions_routing_spec.rb
│ │ ├── my_routing_spec.rb
│ │ ├── news_routing_spec.rb
│ │ ├── notifications_routing_spec.rb
│ │ ├── projects_routing_spec.rb
│ │ ├── queries_routing_spec.rb
│ │ ├── quotes_routing_spec.rb
│ │ ├── recurly_notifications_routing_spec.rb
│ │ ├── reports_routing_spec.rb
│ │ ├── reputations_routing_spec.rb
│ │ ├── retro_ratings_routing_spec.rb
│ │ ├── retros_routing_spec.rb
│ │ ├── roles_routing_spec.rb
│ │ ├── search_routing_spec.rb
│ │ ├── settings_routing_spec.rb
│ │ ├── shares_routing_spec.rb
│ │ ├── todos_routing_spec.rb
│ │ ├── trackers_routing_spec.rb
│ │ ├── users_routing_spec.rb
│ │ ├── votes_routing_spec.rb
│ │ ├── watchers_routing_spec.rb
│ │ ├── welcome_routing_spec.rb
│ │ ├── wiki_routing_spec.rb
│ │ ├── wikis_routing_spec.rb
│ │ └── workflows_routing_spec.rb
│ ├── spec.opts
│ └── spec_helper.rb
└── vendor/
└── plugins/
├── acts-as-taggable-on/
│ ├── .rspec
│ ├── CHANGELOG
│ ├── Gemfile
│ ├── MIT-LICENSE
│ ├── README.rdoc
│ ├── Rakefile
│ ├── VERSION
│ ├── acts-as-taggable-on.gemspec
│ ├── generators/
│ │ └── acts_as_taggable_on_migration/
│ │ ├── acts_as_taggable_on_migration_generator.rb
│ │ └── templates/
│ │ └── migration.rb
│ ├── lib/
│ │ ├── acts-as-taggable-on.rb
│ │ ├── acts_as_taggable_on/
│ │ │ ├── acts_as_tagger.rb
│ │ │ ├── compatibility/
│ │ │ │ ├── Gemfile
│ │ │ │ └── active_record_backports.rb
│ │ │ ├── tag.rb
│ │ │ ├── tag_list.rb
│ │ │ ├── taggable/
│ │ │ │ ├── cache.rb
│ │ │ │ ├── collection.rb
│ │ │ │ ├── core.rb
│ │ │ │ ├── ownership.rb
│ │ │ │ └── related.rb
│ │ │ ├── taggable.rb
│ │ │ ├── tagging.rb
│ │ │ └── tags_helper.rb
│ │ └── generators/
│ │ └── acts_as_taggable_on/
│ │ └── migration/
│ │ ├── migration_generator.rb
│ │ └── templates/
│ │ └── active_record/
│ │ └── migration.rb
│ ├── rails/
│ │ └── init.rb
│ ├── spec/
│ │ ├── acts_as_taggable_on/
│ │ │ ├── acts_as_taggable_on_spec.rb
│ │ │ ├── acts_as_tagger_spec.rb
│ │ │ ├── tag_list_spec.rb
│ │ │ ├── tag_spec.rb
│ │ │ ├── taggable_spec.rb
│ │ │ ├── tagger_spec.rb
│ │ │ ├── tagging_spec.rb
│ │ │ └── tags_helper_spec.rb
│ │ ├── bm.rb
│ │ ├── database.yml.sample
│ │ ├── models.rb
│ │ ├── schema.rb
│ │ └── spec_helper.rb
│ └── uninstall.rb
├── acts_as_attachable/
│ ├── init.rb
│ └── lib/
│ └── acts_as_attachable.rb
├── acts_as_event/
│ ├── init.rb
│ └── lib/
│ └── acts_as_event.rb
├── acts_as_list/
│ ├── README
│ ├── init.rb
│ ├── lib/
│ │ └── active_record/
│ │ └── acts/
│ │ └── list.rb
│ └── test/
│ └── list_test.rb
├── acts_as_searchable/
│ ├── init.rb
│ └── lib/
│ └── acts_as_searchable.rb
├── acts_as_tree/
│ ├── README
│ ├── Rakefile
│ ├── init.rb
│ ├── lib/
│ │ └── active_record/
│ │ └── acts/
│ │ └── tree.rb
│ └── test/
│ ├── abstract_unit.rb
│ ├── acts_as_tree_test.rb
│ ├── database.yml
│ ├── fixtures/
│ │ ├── mixin.rb
│ │ └── mixins.yml
│ └── schema.rb
├── acts_as_versioned/
│ ├── CHANGELOG
│ ├── MIT-LICENSE
│ ├── README
│ ├── RUNNING_UNIT_TESTS
│ ├── Rakefile
│ ├── init.rb
│ ├── lib/
│ │ └── acts_as_versioned.rb
│ └── test/
│ ├── abstract_unit.rb
│ ├── database.yml
│ ├── fixtures/
│ │ ├── authors.yml
│ │ ├── landmark.rb
│ │ ├── landmark_versions.yml
│ │ ├── landmarks.yml
│ │ ├── locked_pages.yml
│ │ ├── locked_pages_revisions.yml
│ │ ├── migrations/
│ │ │ └── 1_add_versioned_tables.rb
│ │ ├── page.rb
│ │ ├── page_versions.yml
│ │ ├── pages.yml
│ │ └── widget.rb
│ ├── migration_test.rb
│ ├── schema.rb
│ └── versioned_test.rb
├── acts_as_watchable/
│ ├── init.rb
│ └── lib/
│ └── acts_as_watchable.rb
├── admin_data/
│ ├── History.txt
│ ├── README.md
│ ├── Rakefile
│ ├── app/
│ │ ├── controllers/
│ │ │ └── admin_data/
│ │ │ ├── base_controller.rb
│ │ │ ├── diagnostic_controller.rb
│ │ │ ├── feed_controller.rb
│ │ │ ├── main_controller.rb
│ │ │ ├── migration_controller.rb
│ │ │ ├── search_controller.rb
│ │ │ └── validate_model_controller.rb
│ │ └── views/
│ │ ├── admin_data/
│ │ │ ├── diagnostic/
│ │ │ │ ├── index.html.erb
│ │ │ │ └── missing_index.html.erb
│ │ │ ├── feed/
│ │ │ │ └── index.rss.builder
│ │ │ ├── main/
│ │ │ │ ├── all_models.html.erb
│ │ │ │ ├── association/
│ │ │ │ │ ├── _association_info.html.erb
│ │ │ │ │ ├── _belongs_to_info.html.erb
│ │ │ │ │ ├── _has_many_info.html.erb
│ │ │ │ │ └── _has_one_info.html.erb
│ │ │ │ ├── edit.html.erb
│ │ │ │ ├── misc/
│ │ │ │ │ ├── _form.html.erb
│ │ │ │ │ └── _modify_record.html.erb
│ │ │ │ ├── new.html.erb
│ │ │ │ ├── show.html.erb
│ │ │ │ └── table_structure.html.erb
│ │ │ ├── migration/
│ │ │ │ ├── index.html.erb
│ │ │ │ └── jstest.html.erb
│ │ │ ├── search/
│ │ │ │ ├── _search_base.html.erb
│ │ │ │ ├── advance_search.html.erb
│ │ │ │ ├── quick_search.html.erb
│ │ │ │ └── search/
│ │ │ │ ├── _advance_search_form.html.erb
│ │ │ │ ├── _errors.html.erb
│ │ │ │ ├── _listing.html.erb
│ │ │ │ ├── _search_form.html.erb
│ │ │ │ ├── _sortby.html.erb
│ │ │ │ └── _title.html.erb
│ │ │ ├── shared/
│ │ │ │ ├── _breadcrum.html.erb
│ │ │ │ ├── _drop_down_klasses.html.erb
│ │ │ │ ├── _flash_message.html.erb
│ │ │ │ ├── _header.html.erb
│ │ │ │ ├── _powered_by.html.erb
│ │ │ │ └── _secondary_navigation.html.erb
│ │ │ └── validate_model/
│ │ │ ├── _bad.html.erb
│ │ │ ├── tid.html.erb
│ │ │ └── validate.html.erb
│ │ └── layouts/
│ │ └── admin_data.html.erb
│ ├── config/
│ │ └── routes.rb
│ ├── doc/
│ │ └── git.txt
│ ├── init.rb
│ ├── lib/
│ │ ├── admin_data/
│ │ │ ├── chelper.rb
│ │ │ ├── compatibility.rb
│ │ │ ├── helpers.rb
│ │ │ ├── rake_util.rb
│ │ │ ├── search.rb
│ │ │ ├── settings.rb
│ │ │ └── util.rb
│ │ ├── admin_data_date_validation.rb
│ │ ├── css/
│ │ │ ├── app.css
│ │ │ ├── base.css
│ │ │ ├── header.css
│ │ │ ├── rounded.css
│ │ │ ├── themes/
│ │ │ │ └── drastic-dark/
│ │ │ │ └── style.css
│ │ │ ├── umbrella.css
│ │ │ └── vendor/
│ │ │ ├── jquery-ui-1.7.2.custom.css
│ │ │ └── qunit.css
│ │ └── js/
│ │ ├── advance_search/
│ │ │ ├── act_on_result.js
│ │ │ ├── adv_search.js
│ │ │ ├── advance_search.js
│ │ │ ├── advance_search_structure.js
│ │ │ ├── ajaxify_advance_search.js
│ │ │ ├── build_first_row.js
│ │ │ ├── event_bindings.js
│ │ │ ├── global_ajax_setting.js
│ │ │ └── trigger_submit_on_domready.js
│ │ ├── misc/
│ │ │ ├── drop_down_change.js
│ │ │ ├── js_util.js
│ │ │ └── quick_search_input_focus.js
│ │ ├── test/
│ │ │ ├── act_on_result.js
│ │ │ ├── advance_search.js
│ │ │ ├── ajaxify_advance_search.js
│ │ │ ├── build_first_row.js
│ │ │ └── event_bindings.js
│ │ ├── validate_model/
│ │ │ ├── ajaxify_form.js
│ │ │ └── select_all.js
│ │ └── vendor/
│ │ ├── jack.js
│ │ ├── jquery-1.4.1.js
│ │ ├── jquery.ba-isjquery.js
│ │ ├── jquery.form.js
│ │ ├── jquery.lint.js
│ │ ├── log.js
│ │ └── qunit.js
│ ├── tasks/
│ │ ├── admin_data_tasks.rake
│ │ └── validate_models_bg.rake
│ └── test/
│ ├── factories/
│ │ ├── article.rb
│ │ ├── car.rb
│ │ ├── city.rb
│ │ ├── comment.rb
│ │ ├── door.rb
│ │ └── engine.rb
│ ├── functional/
│ │ ├── base_controller_test.rb
│ │ ├── feed_controller_test.rb
│ │ ├── main_controller_test.rb
│ │ ├── migration_controller_test.rb
│ │ └── search_controller_test.rb
│ ├── helper/
│ │ └── view_helper_test.rb
│ ├── misc_tests/
│ │ ├── date_validation_test.rb
│ │ ├── settings_test.rb
│ │ └── util_test.rb
│ ├── rails_root/
│ │ ├── Rakefile
│ │ ├── app/
│ │ │ ├── controllers/
│ │ │ │ ├── application_controller.rb
│ │ │ │ └── articles_controller.rb
│ │ │ └── models/
│ │ │ ├── article.rb
│ │ │ ├── city.rb
│ │ │ ├── comment.rb
│ │ │ ├── tech_magazine.rb
│ │ │ └── vehicle/
│ │ │ ├── car.rb
│ │ │ ├── door.rb
│ │ │ └── engine.rb
│ │ ├── config/
│ │ │ ├── boot.rb
│ │ │ ├── database.yml
│ │ │ ├── environment.rb
│ │ │ ├── environments/
│ │ │ │ ├── development.rb
│ │ │ │ └── test.rb
│ │ │ ├── initializers/
│ │ │ │ └── new_rails_defaults.rb
│ │ │ └── routes.rb
│ │ ├── db/
│ │ │ ├── migrate/
│ │ │ │ └── 20090809061114_create_tables.rb
│ │ │ └── schema.rb
│ │ ├── public/
│ │ │ └── tmp/
│ │ │ └── response.txt
│ │ └── script/
│ │ ├── about
│ │ ├── console
│ │ ├── dbconsole
│ │ ├── destroy
│ │ ├── generate
│ │ ├── performance/
│ │ │ ├── benchmarker
│ │ │ └── profiler
│ │ ├── plugin
│ │ ├── runner
│ │ └── server
│ └── test_helper.rb
├── annotate_models/
│ ├── History.txt
│ ├── README.rdoc
│ ├── Rakefile
│ ├── VERSION.yml
│ ├── annotate.gemspec
│ ├── bin/
│ │ └── annotate
│ ├── lib/
│ │ ├── annotate/
│ │ │ ├── annotate_models.rb
│ │ │ ├── annotate_routes.rb
│ │ │ └── tasks/
│ │ │ ├── migrate.rake
│ │ │ └── migrate.rake~HEAD
│ │ └── annotate.rb
│ ├── spec/
│ │ ├── annotate/
│ │ │ ├── annotate_models_spec.rb
│ │ │ └── annotate_routes_spec.rb
│ │ ├── annotate_spec.rb
│ │ ├── spec.opts
│ │ └── spec_helper.rb
│ └── todo.txt
├── auto_complete/
│ ├── README
│ ├── Rakefile
│ ├── init.rb
│ ├── lib/
│ │ ├── auto_complete.rb
│ │ └── auto_complete_macros_helper.rb
│ └── test/
│ └── auto_complete_test.rb
├── awesome_nested_set/
│ ├── MIT-LICENSE
│ ├── README.rdoc
│ ├── Rakefile
│ ├── awesome_nested_set.gemspec
│ ├── init.rb
│ ├── lib/
│ │ ├── awesome_nested_set/
│ │ │ ├── compatability.rb
│ │ │ ├── helper.rb
│ │ │ └── named_scope.rb
│ │ └── awesome_nested_set.rb
│ ├── rails/
│ │ └── init.rb
│ └── test/
│ ├── awesome_nested_set/
│ │ └── helper_test.rb
│ ├── awesome_nested_set_test.rb
│ ├── db/
│ │ ├── database.yml
│ │ └── schema.rb
│ ├── fixtures/
│ │ ├── categories.yml
│ │ ├── category.rb
│ │ ├── departments.yml
│ │ └── notes.yml
│ └── test_helper.rb
├── classic_pagination/
│ ├── CHANGELOG
│ ├── README
│ ├── Rakefile
│ ├── init.rb
│ ├── install.rb
│ ├── lib/
│ │ ├── pagination.rb
│ │ └── pagination_helper.rb
│ └── test/
│ ├── fixtures/
│ │ ├── companies.yml
│ │ ├── company.rb
│ │ ├── developer.rb
│ │ ├── developers.yml
│ │ ├── developers_projects.yml
│ │ ├── project.rb
│ │ ├── projects.yml
│ │ ├── replies.yml
│ │ ├── reply.rb
│ │ ├── schema.sql
│ │ ├── topic.rb
│ │ └── topics.yml
│ ├── helper.rb
│ ├── pagination_helper_test.rb
│ └── pagination_test.rb
├── coderay-0.7.6.227/
│ ├── FOLDERS
│ ├── LICENSE
│ ├── README
│ ├── bin/
│ │ ├── coderay
│ │ └── coderay_stylesheet
│ └── lib/
│ ├── coderay/
│ │ ├── duo.rb
│ │ ├── encoder.rb
│ │ ├── encoders/
│ │ │ ├── _map.rb
│ │ │ ├── count.rb
│ │ │ ├── debug.rb
│ │ │ ├── div.rb
│ │ │ ├── html/
│ │ │ │ ├── css.rb
│ │ │ │ ├── numerization.rb
│ │ │ │ └── output.rb
│ │ │ ├── html.rb
│ │ │ ├── null.rb
│ │ │ ├── page.rb
│ │ │ ├── span.rb
│ │ │ ├── statistic.rb
│ │ │ ├── text.rb
│ │ │ ├── tokens.rb
│ │ │ ├── xml.rb
│ │ │ └── yaml.rb
│ │ ├── helpers/
│ │ │ ├── file_type.rb
│ │ │ ├── gzip_simple.rb
│ │ │ ├── plugin.rb
│ │ │ └── word_list.rb
│ │ ├── scanner.rb
│ │ ├── scanners/
│ │ │ ├── _map.rb
│ │ │ ├── c.rb
│ │ │ ├── debug.rb
│ │ │ ├── delphi.rb
│ │ │ ├── html.rb
│ │ │ ├── java.rb
│ │ │ ├── javascript.rb
│ │ │ ├── nitro_xhtml.rb
│ │ │ ├── php.rb
│ │ │ ├── plaintext.rb
│ │ │ ├── rhtml.rb
│ │ │ ├── ruby/
│ │ │ │ └── patterns.rb
│ │ │ ├── ruby.rb
│ │ │ ├── scheme.rb
│ │ │ └── xml.rb
│ │ ├── style.rb
│ │ ├── styles/
│ │ │ ├── _map.rb
│ │ │ ├── cycnus.rb
│ │ │ └── murphy.rb
│ │ ├── token_classes.rb
│ │ └── tokens.rb
│ └── coderay.rb
├── default_value_for/
│ ├── LICENSE.TXT
│ ├── README.rdoc
│ ├── Rakefile
│ ├── init.rb
│ └── test.rb
├── delayed_job/
│ ├── MIT-LICENSE
│ ├── README.textile
│ ├── Rakefile
│ ├── VERSION
│ ├── contrib/
│ │ └── delayed_job.monitrc
│ ├── delayed_job.gemspec
│ ├── generators/
│ │ └── delayed_job/
│ │ ├── delayed_job_generator.rb
│ │ └── templates/
│ │ ├── migration.rb
│ │ └── script
│ ├── init.rb
│ ├── lib/
│ │ ├── delayed/
│ │ │ ├── command.rb
│ │ │ ├── job.rb
│ │ │ ├── message_sending.rb
│ │ │ ├── performable_method.rb
│ │ │ ├── recipes.rb
│ │ │ ├── tasks.rb
│ │ │ └── worker.rb
│ │ └── delayed_job.rb
│ ├── recipes/
│ │ └── delayed_job.rb
│ ├── spec/
│ │ ├── delayed_method_spec.rb
│ │ ├── job_spec.rb
│ │ ├── sample_jobs.rb
│ │ ├── spec_helper.rb
│ │ ├── story_spec.rb
│ │ └── worker_spec.rb
│ └── tasks/
│ └── jobs.rake
├── engines/
│ ├── .gitignore
│ ├── CHANGELOG
│ ├── MIT-LICENSE
│ ├── README
│ ├── Rakefile
│ ├── about.yml
│ ├── boot.rb
│ ├── generators/
│ │ └── plugin_migration/
│ │ ├── USAGE
│ │ ├── plugin_migration_generator.rb
│ │ └── templates/
│ │ └── plugin_migration.erb
│ ├── init.rb
│ ├── lib/
│ │ ├── engines/
│ │ │ ├── assets.rb
│ │ │ ├── plugin/
│ │ │ │ ├── list.rb
│ │ │ │ ├── loader.rb
│ │ │ │ ├── locator.rb
│ │ │ │ └── migrator.rb
│ │ │ ├── plugin.rb
│ │ │ ├── rails_extensions/
│ │ │ │ ├── asset_helpers.rb
│ │ │ │ ├── dependencies.rb
│ │ │ │ ├── form_tag_helpers.rb
│ │ │ │ ├── migrations.rb
│ │ │ │ └── rails.rb
│ │ │ ├── tasks/
│ │ │ │ ├── engines.rake
│ │ │ │ └── engines.rake~HEAD
│ │ │ └── testing.rb
│ │ └── engines.rb
│ └── test/
│ ├── app/
│ │ ├── controllers/
│ │ │ ├── app_and_plugin_controller.rb
│ │ │ └── namespace/
│ │ │ └── app_and_plugin_controller.rb
│ │ ├── helpers/
│ │ │ └── mail_helper.rb
│ │ ├── models/
│ │ │ ├── app_and_plugin_model.rb
│ │ │ └── notify_mail.rb
│ │ ├── things/
│ │ │ └── thing.rb
│ │ └── views/
│ │ ├── app_and_plugin/
│ │ │ └── a_view.html.erb
│ │ ├── namespace/
│ │ │ └── app_and_plugin/
│ │ │ └── a_view.html.erb
│ │ ├── notify_mail/
│ │ │ ├── implicit_multipart.text.html.erb
│ │ │ ├── implicit_multipart.text.plain.erb
│ │ │ ├── multipart_html.html.erb
│ │ │ ├── multipart_plain.html.erb
│ │ │ └── signup.text.plain.erb
│ │ └── plugin_mail/
│ │ ├── mail_from_plugin_with_application_template.text.plain.erb
│ │ └── multipart_from_plugin_with_application_template_plain.html.erb
│ ├── functional/
│ │ ├── controller_loading_test.rb
│ │ ├── exception_notification_compatibility_test.rb
│ │ ├── locale_loading_test.rb
│ │ ├── routes_test.rb
│ │ ├── view_helpers_test.rb
│ │ └── view_loading_test.rb
│ ├── lib/
│ │ ├── app_and_plugin_lib_model.rb
│ │ ├── engines_test_helper.rb
│ │ └── render_information.rb
│ ├── plugins/
│ │ ├── alpha_plugin/
│ │ │ ├── app/
│ │ │ │ ├── controllers/
│ │ │ │ │ ├── alpha_plugin_controller.rb
│ │ │ │ │ ├── app_and_plugin_controller.rb
│ │ │ │ │ ├── namespace/
│ │ │ │ │ │ ├── alpha_plugin_controller.rb
│ │ │ │ │ │ ├── app_and_plugin_controller.rb
│ │ │ │ │ │ └── shared_plugin_controller.rb
│ │ │ │ │ └── shared_plugin_controller.rb
│ │ │ │ ├── models/
│ │ │ │ │ ├── alpha_plugin_model.rb
│ │ │ │ │ ├── app_and_plugin_model.rb
│ │ │ │ │ └── shared_plugin_model.rb
│ │ │ │ └── views/
│ │ │ │ ├── alpha_plugin/
│ │ │ │ │ └── a_view.html.erb
│ │ │ │ ├── app_and_plugin/
│ │ │ │ │ └── a_view.html.erb
│ │ │ │ ├── layouts/
│ │ │ │ │ └── plugin_layout.erb
│ │ │ │ ├── namespace/
│ │ │ │ │ ├── alpha_plugin/
│ │ │ │ │ │ └── a_view.html.erb
│ │ │ │ │ ├── app_and_plugin/
│ │ │ │ │ │ └── a_view.html.erb
│ │ │ │ │ └── shared_plugin/
│ │ │ │ │ └── a_view.html.erb
│ │ │ │ └── shared_plugin/
│ │ │ │ └── a_view.html.erb
│ │ │ ├── lib/
│ │ │ │ ├── alpha_plugin_lib_model.rb
│ │ │ │ └── app_and_plugin_lib_model.rb
│ │ │ └── locales/
│ │ │ └── en.yml
│ │ ├── beta_plugin/
│ │ │ ├── app/
│ │ │ │ ├── controllers/
│ │ │ │ │ ├── app_and_plugin_controller.rb
│ │ │ │ │ ├── namespace/
│ │ │ │ │ │ └── shared_plugin_controller.rb
│ │ │ │ │ └── shared_plugin_controller.rb
│ │ │ │ ├── models/
│ │ │ │ │ └── shared_plugin_model.rb
│ │ │ │ └── views/
│ │ │ │ ├── namespace/
│ │ │ │ │ └── shared_plugin/
│ │ │ │ │ └── a_view.html.erb
│ │ │ │ └── shared_plugin/
│ │ │ │ └── a_view.html.erb
│ │ │ ├── init.rb
│ │ │ └── locales/
│ │ │ └── en.yml
│ │ ├── not_a_plugin/
│ │ │ └── public/
│ │ │ └── should_not_be_copied.txt
│ │ ├── test_assets/
│ │ │ ├── app/
│ │ │ │ ├── controllers/
│ │ │ │ │ └── assets_controller.rb
│ │ │ │ └── views/
│ │ │ │ ├── assets/
│ │ │ │ │ └── index.html.erb
│ │ │ │ └── layouts/
│ │ │ │ └── assets.html.erb
│ │ │ ├── init.rb
│ │ │ └── public/
│ │ │ ├── file.txt
│ │ │ └── subfolder/
│ │ │ └── file_in_subfolder.txt
│ │ ├── test_assets_with_assets_directory/
│ │ │ ├── assets/
│ │ │ │ ├── file.txt
│ │ │ │ └── subfolder/
│ │ │ │ └── file_in_subfolder.txt
│ │ │ └── init.rb
│ │ ├── test_assets_with_no_subdirectory/
│ │ │ ├── assets/
│ │ │ │ └── file.txt
│ │ │ └── init.rb
│ │ ├── test_code_mixing/
│ │ │ ├── app/
│ │ │ │ └── things/
│ │ │ │ └── thing.rb
│ │ │ └── init.rb
│ │ ├── test_load_path/
│ │ │ └── init.rb
│ │ ├── test_migration/
│ │ │ ├── db/
│ │ │ │ └── migrate/
│ │ │ │ ├── 001_create_tests.rb
│ │ │ │ ├── 002_create_others.rb
│ │ │ │ └── 003_create_extras.rb
│ │ │ └── init.rb
│ │ ├── test_plugin_mailing/
│ │ │ ├── app/
│ │ │ │ ├── models/
│ │ │ │ │ └── plugin_mail.rb
│ │ │ │ └── views/
│ │ │ │ └── plugin_mail/
│ │ │ │ ├── mail_from_plugin.erb
│ │ │ │ ├── multipart_from_plugin_html.html.erb
│ │ │ │ ├── multipart_from_plugin_plain.html.erb
│ │ │ │ ├── multipart_from_plugin_with_application_template_html.html.erb
│ │ │ │ └── multipart_from_plugin_with_application_template_plain.html.erb
│ │ │ └── init.rb
│ │ ├── test_routing/
│ │ │ ├── app/
│ │ │ │ └── controllers/
│ │ │ │ ├── namespace/
│ │ │ │ │ └── test_routing_controller.rb
│ │ │ │ └── test_routing_controller.rb
│ │ │ ├── config/
│ │ │ │ └── routes.rb
│ │ │ └── init.rb
│ │ └── test_testing/
│ │ ├── app/
│ │ │ └── README.txt
│ │ ├── init.rb
│ │ └── test/
│ │ ├── fixtures/
│ │ │ └── testing_fixtures.yml
│ │ └── unit/
│ │ └── override_test.rb
│ └── unit/
│ ├── action_mailer_test.rb
│ ├── arbitrary_code_mixing_test.rb
│ ├── assets_test.rb
│ ├── backwards_compat_test.rb
│ ├── load_path_test.rb
│ ├── migration_test.rb
│ ├── model_and_lib_test.rb
│ ├── plugins_test.rb
│ ├── test_testing/
│ │ └── override_test.rb
│ └── testing_test.rb
├── exceptional/
│ ├── History.txt
│ ├── Manifest
│ ├── README
│ ├── Rakefile
│ ├── bin/
│ │ └── ginger
│ ├── exceptional.gemspec
│ ├── exceptional.yml
│ ├── ginger_scenarios.rb
│ ├── init.rb
│ ├── install.rb
│ ├── lib/
│ │ ├── exceptional/
│ │ │ ├── api.rb
│ │ │ ├── bootstrap.rb
│ │ │ ├── config.rb
│ │ │ ├── exception_data.rb
│ │ │ ├── integration/
│ │ │ │ └── rails.rb
│ │ │ ├── log.rb
│ │ │ ├── remote.rb
│ │ │ └── version.rb
│ │ └── exceptional.rb
│ └── spec/
│ ├── api_spec.rb
│ ├── bootstrap_spec.rb
│ ├── config_spec.rb
│ ├── exception_data_spec.rb
│ ├── exceptional_rescue_from_spec.rb
│ ├── exceptional_spec.rb
│ ├── log_spec.rb
│ ├── remote_spec.rb
│ └── spec_helper.rb
├── googlecharts/
│ ├── History.txt
│ ├── License.txt
│ ├── Manifest.txt
│ ├── README
│ ├── README.markdown
│ ├── README.txt
│ ├── Rakefile
│ ├── VERSION
│ ├── config/
│ │ ├── hoe.rb
│ │ └── requirements.rb
│ ├── lib/
│ │ ├── gchart/
│ │ │ ├── aliases.rb
│ │ │ ├── tasks/
│ │ │ │ ├── deployment.rake
│ │ │ │ ├── environment.rake
│ │ │ │ ├── rspec.rake
│ │ │ │ └── website.rake
│ │ │ ├── theme.rb
│ │ │ └── version.rb
│ │ ├── gchart.rb
│ │ ├── googlecharts.rb
│ │ └── themes.yml
│ ├── script/
│ │ ├── destroy
│ │ ├── generate
│ │ └── txt2html
│ ├── setup.rb
│ ├── spec/
│ │ ├── fixtures/
│ │ │ ├── another_test_theme.yml
│ │ │ └── test_theme.yml
│ │ ├── gchart_spec.rb
│ │ ├── spec_helper.rb
│ │ └── theme_spec.rb
│ └── website/
│ ├── index.html
│ ├── index.txt
│ ├── javascripts/
│ │ └── rounded_corners_lite.inc.js
│ ├── stylesheets/
│ │ └── screen.css
│ └── template.rhtml
├── gravatar/
│ ├── .gitignore
│ ├── MIT-LICENSE
│ ├── README.rdoc
│ ├── Rakefile
│ ├── about.yml
│ ├── init.rb
│ ├── lib/
│ │ └── gravatar.rb
│ └── spec/
│ └── gravatar_spec.rb
├── jrails/
│ ├── CHANGELOG
│ ├── LICENSE
│ ├── README.rdoc
│ ├── Rakefile
│ ├── VERSION.yml
│ ├── bin/
│ │ └── jrails
│ ├── init.rb
│ ├── install.rb
│ ├── javascripts/
│ │ ├── jquery-ui.js
│ │ ├── jquery.js
│ │ ├── jrails.js
│ │ └── sources/
│ │ └── jrails.js
│ ├── jrails.gemspec
│ ├── lib/
│ │ ├── jquery_selector_assertions.rb
│ │ ├── jrails.rb
│ │ └── tasks/
│ │ └── jrails.rake
│ └── rails/
│ └── init.rb
├── open_id_authentication/
│ ├── CHANGELOG
│ ├── README
│ ├── Rakefile
│ ├── generators/
│ │ ├── open_id_authentication_tables/
│ │ │ ├── open_id_authentication_tables_generator.rb
│ │ │ └── templates/
│ │ │ └── migration.rb
│ │ └── upgrade_open_id_authentication_tables/
│ │ ├── templates/
│ │ │ └── migration.rb
│ │ └── upgrade_open_id_authentication_tables_generator.rb
│ ├── init.rb
│ ├── lib/
│ │ ├── open_id_authentication/
│ │ │ ├── association.rb
│ │ │ ├── db_store.rb
│ │ │ ├── mem_cache_store.rb
│ │ │ ├── nonce.rb
│ │ │ ├── request.rb
│ │ │ ├── tasks/
│ │ │ │ └── open_id_authentication_tasks.rake
│ │ │ └── timeout_fixes.rb
│ │ └── open_id_authentication.rb
│ └── test/
│ ├── mem_cache_store_test.rb
│ ├── normalize_test.rb
│ ├── open_id_authentication_test.rb
│ ├── status_test.rb
│ └── test_helper.rb
├── pickle/
│ ├── History.txt
│ ├── License.txt
│ ├── README.rdoc
│ ├── Rakefile
│ ├── Todo.txt
│ ├── VERSION
│ ├── features/
│ │ ├── app/
│ │ │ ├── app.rb
│ │ │ ├── blueprints.rb
│ │ │ ├── factories.rb
│ │ │ └── views/
│ │ │ └── notifier/
│ │ │ ├── email.erb
│ │ │ └── user_email.erb
│ │ ├── email/
│ │ │ └── email.feature
│ │ ├── generator/
│ │ │ └── generators.feature
│ │ ├── path/
│ │ │ ├── models_page.feature
│ │ │ └── named_route_page.feature
│ │ ├── pickle/
│ │ │ ├── create_from_active_record.feature
│ │ │ ├── create_from_factory_girl.feature
│ │ │ └── create_from_machinist.feature
│ │ ├── step_definitions/
│ │ │ ├── email_steps.rb
│ │ │ ├── extra_email_steps.rb
│ │ │ ├── fork_steps.rb
│ │ │ ├── generator_steps.rb
│ │ │ ├── path_steps.rb
│ │ │ └── pickle_steps.rb
│ │ └── support/
│ │ ├── env.rb
│ │ └── paths.rb
│ ├── garlic.rb
│ ├── init.rb
│ ├── lib/
│ │ ├── pickle/
│ │ │ ├── adapter.rb
│ │ │ ├── config.rb
│ │ │ ├── email/
│ │ │ │ ├── parser.rb
│ │ │ │ └── world.rb
│ │ │ ├── email.rb
│ │ │ ├── parser/
│ │ │ │ └── matchers.rb
│ │ │ ├── parser.rb
│ │ │ ├── path/
│ │ │ │ └── world.rb
│ │ │ ├── path.rb
│ │ │ ├── session/
│ │ │ │ └── parser.rb
│ │ │ ├── session.rb
│ │ │ ├── version.rb
│ │ │ └── world.rb
│ │ └── pickle.rb
│ ├── pickle.gemspec
│ ├── rails_generators/
│ │ └── pickle/
│ │ ├── pickle_generator.rb
│ │ └── templates/
│ │ ├── email_steps.rb
│ │ ├── env.rb
│ │ ├── paths.rb
│ │ └── pickle_steps.rb
│ └── spec/
│ ├── lib/
│ │ ├── pickle_adapter_spec.rb
│ │ ├── pickle_config_spec.rb
│ │ ├── pickle_email_parser_spec.rb
│ │ ├── pickle_email_spec.rb
│ │ ├── pickle_parser_matchers_spec.rb
│ │ ├── pickle_parser_spec.rb
│ │ ├── pickle_path_spec.rb
│ │ ├── pickle_session_spec.rb
│ │ └── pickle_spec.rb
│ └── spec_helper.rb
├── prepend_engine_views/
│ └── init.rb
├── redmine_s3/
│ ├── README.rdoc
│ ├── config/
│ │ ├── locales/
│ │ │ └── en.yml
│ │ └── s3.yml.example
│ ├── init.rb
│ ├── lang/
│ │ └── en.yml
│ ├── lib/
│ │ ├── S3.rb
│ │ ├── redmine_s3/
│ │ │ └── connection.rb
│ │ └── s3_helper.rb
│ └── test/
│ └── test_helper.rb
├── rfpdf/
│ ├── CHANGELOG
│ ├── MIT-LICENSE
│ ├── README
│ ├── init.rb
│ ├── lib/
│ │ ├── rfpdf/
│ │ │ ├── bookmark.rb
│ │ │ ├── chinese.rb
│ │ │ ├── errors.rb
│ │ │ ├── fpdf.rb
│ │ │ ├── fpdf_eps.rb
│ │ │ ├── japanese.rb
│ │ │ ├── korean.rb
│ │ │ ├── makefont.rb
│ │ │ ├── rfpdf.rb
│ │ │ └── view.rb
│ │ └── rfpdf.rb
│ └── test/
│ └── test_helper.rb
├── ruby-net-ldap-0.0.4/
│ ├── COPYING
│ ├── ChangeLog
│ ├── LICENCE
│ ├── README
│ ├── lib/
│ │ └── net/
│ │ ├── ber.rb
│ │ ├── ldap/
│ │ │ ├── dataset.rb
│ │ │ ├── entry.rb
│ │ │ ├── filter.rb
│ │ │ ├── pdu.rb
│ │ │ └── psw.rb
│ │ ├── ldap.rb
│ │ └── ldif.rb
│ └── tests/
│ ├── testber.rb
│ ├── testdata.ldif
│ ├── testem.rb
│ ├── testfilter.rb
│ ├── testldap.rb
│ ├── testldif.rb
│ └── testpsw.rb
├── seed_dump/
│ ├── CHANGELOG.rdoc
│ ├── MIT-LICENSE
│ ├── README.rdoc
│ ├── Rakefile
│ ├── VERSION
│ ├── lib/
│ │ ├── seed_dump/
│ │ │ └── railtie.rb
│ │ ├── seed_dump.rb
│ │ └── tasks/
│ │ └── seed_dump.rake
│ ├── seed_dump.gemspec
│ └── test/
│ ├── seed_dump_test.rb
│ └── test_helper.rb
├── selenium-on-rails/
│ ├── CHANGELOG
│ ├── LICENSE-2.0.txt
│ ├── README.md
│ ├── Rakefile
│ ├── doc/
│ │ ├── classes/
│ │ │ ├── SeleniumController.html
│ │ │ ├── SeleniumHelper.html
│ │ │ ├── SeleniumOnRails/
│ │ │ │ ├── FixtureLoader.html
│ │ │ │ ├── PartialsSupport.html
│ │ │ │ ├── Paths.html
│ │ │ │ ├── RSelenese.html
│ │ │ │ ├── Renderer.html
│ │ │ │ ├── Selenese.html
│ │ │ │ ├── SuiteRenderer.html
│ │ │ │ ├── TestBuilder.html
│ │ │ │ ├── TestBuilderAccessors.html
│ │ │ │ ├── TestBuilderActions.html
│ │ │ │ ├── TestBuilderUserAccessors.html
│ │ │ │ └── TestBuilderUserActions.html
│ │ │ ├── SeleniumOnRails.html
│ │ │ └── SeleniumOnRailsConfig.html
│ │ ├── files/
│ │ │ ├── CHANGELOG.html
│ │ │ ├── README.html
│ │ │ └── lib/
│ │ │ ├── controllers/
│ │ │ │ └── selenium_controller_rb.html
│ │ │ ├── selenium_helper_rb.html
│ │ │ ├── selenium_on_rails/
│ │ │ │ ├── acceptance_test_runner_rb.html
│ │ │ │ ├── fixture_loader_rb.html
│ │ │ │ ├── partials_support_rb.html
│ │ │ │ ├── paths_rb.html
│ │ │ │ ├── renderer_rb.html
│ │ │ │ ├── rselenese_rb.html
│ │ │ │ ├── selenese_rb.html
│ │ │ │ ├── suite_renderer_rb.html
│ │ │ │ ├── test_builder_accessors_rb.html
│ │ │ │ ├── test_builder_actions_rb.html
│ │ │ │ └── test_builder_rb.html
│ │ │ ├── selenium_on_rails_config_rb.html
│ │ │ └── selenium_on_rails_rb.html
│ │ ├── fr_class_index.html
│ │ ├── fr_file_index.html
│ │ ├── fr_method_index.html
│ │ ├── index.html
│ │ └── rdoc-style.css
│ ├── generators/
│ │ └── selenium/
│ │ ├── USAGE
│ │ ├── selenium_generator.rb
│ │ └── templates/
│ │ ├── rhtml.html.erb
│ │ ├── rselenese.html.erb
│ │ └── selenese.html.erb
│ ├── init.rb
│ ├── lib/
│ │ ├── controllers/
│ │ │ ├── selenium_controller.rb
│ │ │ └── switch_environment_controller.rb
│ │ ├── selenium_helper.rb
│ │ ├── selenium_on_rails/
│ │ │ ├── acceptance_test_runner.rb
│ │ │ ├── fixture_loader.rb
│ │ │ ├── partials_support.rb
│ │ │ ├── paths.rb
│ │ │ ├── renderer.rb
│ │ │ ├── rselenese.rb
│ │ │ ├── selenese.rb
│ │ │ ├── suite_renderer.rb
│ │ │ ├── tasks/
│ │ │ │ └── test_acceptance.rake
│ │ │ ├── test_builder.rb
│ │ │ ├── test_builder_accessors.rb
│ │ │ ├── test_builder_actions.rb
│ │ │ ├── test_builder_user_accessors.rb.example
│ │ │ └── test_builder_user_actions.rb.example
│ │ ├── selenium_on_rails.rb
│ │ ├── selenium_on_rails_config.rb
│ │ └── views/
│ │ ├── layouts/
│ │ │ └── layout.html.erb
│ │ ├── record.html.erb
│ │ ├── selenium_helper.rb
│ │ ├── setup.html.erb
│ │ └── test_suite.html.erb
│ ├── log/
│ │ └── default.yml
│ ├── routes.rb
│ ├── selenium-core/
│ │ ├── Blank.html
│ │ ├── InjectedRemoteRunner.html
│ │ ├── RemoteRunner.html
│ │ ├── SeleniumLog.html
│ │ ├── TestPrompt.html
│ │ ├── TestRunner-splash.html
│ │ ├── TestRunner.hta
│ │ ├── TestRunner.html
│ │ ├── domviewer/
│ │ │ ├── domviewer.css
│ │ │ ├── domviewer.html
│ │ │ └── selenium-domviewer.js
│ │ ├── iedoc-core.xml
│ │ ├── iedoc.xml
│ │ ├── lib/
│ │ │ ├── cssQuery/
│ │ │ │ ├── cssQuery-p.js
│ │ │ │ └── src/
│ │ │ │ ├── cssQuery-level2.js
│ │ │ │ ├── cssQuery-level3.js
│ │ │ │ ├── cssQuery-standard.js
│ │ │ │ └── cssQuery.js
│ │ │ ├── prototype.js
│ │ │ ├── scriptaculous/
│ │ │ │ ├── builder.js
│ │ │ │ ├── controls.js
│ │ │ │ ├── dragdrop.js
│ │ │ │ ├── effects.js
│ │ │ │ ├── scriptaculous.js
│ │ │ │ ├── slider.js
│ │ │ │ └── unittest.js
│ │ │ └── snapsie.js
│ │ ├── scripts/
│ │ │ ├── find_matching_child.js
│ │ │ ├── htmlutils.js
│ │ │ ├── injection.html
│ │ │ ├── selenium-api.js
│ │ │ ├── selenium-browserbot.js
│ │ │ ├── selenium-browserdetect.js
│ │ │ ├── selenium-commandhandlers.js
│ │ │ ├── selenium-executionloop.js
│ │ │ ├── selenium-logging.js
│ │ │ ├── selenium-remoterunner.js
│ │ │ ├── selenium-testrunner.js
│ │ │ ├── selenium-version.js
│ │ │ ├── ui-doc.html
│ │ │ ├── ui-element.js
│ │ │ ├── ui-map-sample.js
│ │ │ ├── user-extensions.js
│ │ │ ├── user-extensions.js.sample
│ │ │ └── xmlextras.js
│ │ ├── selenium-test.css
│ │ ├── selenium.css
│ │ └── xpath/
│ │ ├── dom.js
│ │ ├── javascript-xpath-0.1.11.js
│ │ ├── util.js
│ │ ├── xmltoken.js
│ │ └── xpath.js
│ ├── selenium.yml
│ ├── test/
│ │ ├── fixtures/
│ │ │ ├── config.yml
│ │ │ └── selenium.yml
│ │ ├── paths_test.rb
│ │ ├── renderer_test.rb
│ │ ├── rselenese_test.rb
│ │ ├── selenese_test.rb
│ │ ├── selenium_controller_test.rb
│ │ ├── selenium_on_rails_config_test.rb
│ │ ├── selenium_support_test.rb
│ │ ├── setup_test.rb
│ │ ├── suite_renderer_test.rb
│ │ ├── switch_environment_controller_test.rb
│ │ ├── test_builder_functions_authortest.rb
│ │ └── test_helper.rb
│ └── test_data/
│ ├── _partial.rsel
│ ├── backup.html~
│ ├── own_layout.html
│ ├── partials/
│ │ ├── _html.html
│ │ ├── _nesting.rsel
│ │ ├── _rhtml.html.erb
│ │ ├── _rsel.rsel
│ │ ├── _sel.sel
│ │ └── all_partials.rsel
│ ├── rhtml.html.erb
│ ├── rselenese.rsel
│ ├── selenese.sel
│ ├── suite_one/
│ │ ├── subsuite/
│ │ │ └── suite_one_subsuite_testcase.sel
│ │ ├── suite_one_testcase1.sel
│ │ └── suite_one_testcase2.sel
│ └── suite_two/
│ └── suite_two_testcase.sel
├── simple-private-messages/
│ ├── MIT-LICENSE
│ ├── README.rdoc
│ ├── Rakefile
│ ├── generators/
│ │ ├── private_message_model/
│ │ │ ├── USAGE
│ │ │ ├── private_message_model_generator.rb
│ │ │ └── templates/
│ │ │ ├── migration.rb
│ │ │ └── model.rb
│ │ └── private_message_scaffold/
│ │ ├── USAGE
│ │ ├── private_message_scaffold_generator.rb
│ │ └── templates/
│ │ ├── controller.rb
│ │ ├── view_index.html.erb
│ │ ├── view_index_inbox.html.erb
│ │ ├── view_index_sent.html.erb
│ │ ├── view_new.html.erb
│ │ └── view_show.html.erb
│ ├── init.rb
│ ├── lib/
│ │ └── professionalnerd/
│ │ └── simple_private_messages/
│ │ ├── has_private_messages_extensions.rb
│ │ ├── private_message_extensions.rb
│ │ └── tasks/
│ │ └── simple_private_messages_tasks.rake
│ └── test/
│ ├── database.yml
│ ├── fixtures/
│ │ ├── message.rb
│ │ └── user.rb
│ ├── schema.rb
│ ├── test_helper.rb
│ └── unit/
│ ├── message_model.rb
│ └── user_model.rb
├── textile-editor-helper/
│ ├── CHANGELOG
│ ├── MIT-LICENSE
│ ├── README
│ ├── Rakefile
│ ├── assets/
│ │ ├── javascripts/
│ │ │ ├── textile-editor-config.js
│ │ │ └── textile-editor.js
│ │ └── stylesheets/
│ │ └── textile-editor.css
│ ├── init.rb
│ ├── install.rb
│ ├── lib/
│ │ ├── tasks/
│ │ │ └── textile_editor_helper_tasks.rake
│ │ └── textile_editor_helper.rb
│ └── test/
│ ├── abstract_unit.rb
│ └── textile_editor_helper_test.rb
└── yaml_db/
├── README
├── Rakefile
├── about.yml
├── init.rb
├── lib/
│ ├── tasks/
│ │ └── yaml_db_tasks.rake
│ └── yaml_db.rb
└── spec/
├── base.rb
├── yaml_dump_spec.rb
├── yaml_load_spec.rb
└── yaml_utils_spec.rb
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
/db/*.sqlite3
/db/pgdump_full.sql
/log/*.log
/tmp/**/*
/config/additional_environment.rb
/config/database.yml
/config/email.yml
/config/initializers/session_store.rb
/coverage
/db/*.db
/db/*.sqlite3
!/db/schema.rb
/files/*
/log/*.log*
/log/mongrel_debug
/public/dispatch.*
/public/plugin_assets
/tmp/*
/tmp/cache/*
/tmp/sessions/*
/tmp/sockets/*
/tmp/test/*
/vendor/rails
/config/database.yml
/nbproject
redmine.tmproj
serverlog
.DS_Store
*.swp
*.swo
.redcar/
.bundle
/bin
================================================
FILE: .gitmodules
================================================
================================================
FILE: .rspec
================================================
--colour
--format profile
--loadby mtime
--reverse
================================================
FILE: .rvmrc
================================================
#!/usr/bin/env bash
# This is an RVM Project .rvmrc file, used to automatically load the ruby
# development environment upon cd'ing into the directory
# First we specify our desired <ruby>[@<gemset>], the @gemset name is optional,
# Only full ruby name is supported here, for short names use:
# echo "rvm use 1.8.7" > .rvmrc
environment_id="ruby-1.8.7-p370@bettermeans"
# Uncomment the following lines if you want to verify rvm version per project
# rvmrc_rvm_version="1.14.1 (stable)" # 1.10.1 seams as a safe start
# eval "$(echo ${rvm_version}.${rvmrc_rvm_version} | awk -F. '{print "[[ "$1*65536+$2*256+$3" -ge "$4*65536+$5*256+$6" ]]"}' )" || {
# echo "This .rvmrc file requires at least RVM ${rvmrc_rvm_version}, aborting loading."
# return 1
# }
# First we attempt to load the desired environment directly from the environment
# file. This is very fast and efficient compared to running through the entire
# CLI and selector. If you want feedback on which environment was used then
# insert the word 'use' after --create as this triggers verbose mode.
if [[ -d "${rvm_path:-$HOME/.rvm}/environments"
&& -s "${rvm_path:-$HOME/.rvm}/environments/$environment_id" ]]
then
\. "${rvm_path:-$HOME/.rvm}/environments/$environment_id"
[[ -s "${rvm_path:-$HOME/.rvm}/hooks/after_use" ]] &&
\. "${rvm_path:-$HOME/.rvm}/hooks/after_use" || true
if [[ $- == *i* ]] # check for interactive shells
then echo "Using: $(tput setaf 2)$GEM_HOME$(tput sgr0)" # show the user the ruby and gemset they are using in green
else echo "Using: $GEM_HOME" # don't use colors in non-interactive shells
fi
else
# If the environment file has not yet been created, use the RVM CLI to select.
rvm --create use "$environment_id" || {
echo "Failed to create RVM environment '${environment_id}'."
return 1
}
fi
# If you use bundler, this might be useful to you:
# if [[ -s Gemfile ]] && {
# ! builtin command -v bundle >/dev/null ||
# builtin command -v bundle | GREP_OPTIONS= \grep $rvm_path/bin/bundle >/dev/null
# }
# then
# printf "%b" "The rubygem 'bundler' is not installed. Installing it now.\n"
# gem install bundler
# fi
# if [[ -s Gemfile ]] && builtin command -v bundle >/dev/null
# then
# bundle install | GREP_OPTIONS= \grep -vE '^Using|Your bundle is complete'
# fi
================================================
FILE: Gemfile
================================================
source :rubygems
gem 'rake', '0.8.7'
gem 'rails', '2.3.14'
gem 'ruby-debug', '0.10.4'
gem 'rubytree', '0.7.0'
gem 'rpx_now', '0.6.24'
gem 'recurly', '0.3.3'
gem 'fleximage', '1.0.4'
gem 'reportable', '1.1.2'
gem 'comma', :git => 'https://github.com/crafterm/comma.git', :ref => 'rails2'
gem 'fastercsv', '1.5.4'
gem 'SystemTimer', '1.2.2', :require => 'system_timer', :platforms => :ruby_18
gem 'rack-timeout', '0.0.1'
gem 'will_paginate', '2.3.15'
gem 'grosser-ssl_requirement', :require => 'ssl_requirement'
group :test do
gem 'shoulda'
gem 'webrat', '0.7.3'
gem 'rspec', '1.3.2'
gem 'rspec-rails', '1.3.4'
gem 'pickle', "0.3.4"
gem 'factory_girl', "1.3.3"
gem 'object_daddy', "0.4.3"
#gem 'capybara-webkit'
gem 'fakeweb'
end
group :development do
gem 'sqlite3-ruby', :require => 'sqlite3'
gem 'pg'
gem 'mysql2', '< 0.3'
gem 'guard-rspec'
gem 'spork', '0.8.5'
gem 'guard-spork'
#gem 'reek'
gem 'ruby2ruby', '1.2.2'
gem 'heckle'
end
group :development, :test do
gem 'capybara'
gem 'steak'
end
================================================
FILE: Guardfile
================================================
# A sample Guardfile
# More info at https://github.com/guard/guard#readme
guard 'spork', :rspec_env => { 'RAILS_ENV' => 'test' } do
watch('config/application.rb')
watch('config/environment.rb')
watch('config/environments/test.rb')
watch(%r{^config/initializers/.+\.rb$})
watch('Gemfile')
watch('Gemfile.lock')
watch('spec/spec_helper.rb') { :rspec }
watch('spec/factories.rb')
watch('db/seeds.rb')
watch(%r{features/support/}) { :cucumber }
watch(%r{^app/models/.+\.rb$})
watch(%r{^app/controllers/.+\.rb$})
end
guard 'rspec', :version => 1, :cli => '--drb --color' do
watch(%r{^spec/.+_spec\.rb$})
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
watch('spec/spec_helper.rb') { "spec" }
# Rails example
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
watch(%r{^app/(.*)(\.erb|\.haml)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
watch('config/routes.rb') { "spec/routing" }
watch('app/controllers/application_controller.rb') { "spec/controllers" }
# Capybara request specs
watch(%r{^app/views/(.+)/.*\.(erb|haml)$}) { |m| "spec/requests/#{m[1]}_spec.rb" }
# Turnip features and steps
watch(%r{^spec/acceptance/(.+)\.feature$})
watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
end
================================================
FILE: README.md
================================================
BetterMeans
-----------
BetterMeans is giving birth to a new kind of company. An Open Enterprise.
More details can be found at http://bettermeans.com and here http://bettermeans.org
Getting started
---------------
* `git clone git@github.com:Bettermeans/bettermeans.git`
* bundle install
* Rename `database.yml.example` to `database.yml`
* Run rake `db:create:all` and `rake db:schema:load`
That's it. Now you're ready to change the world. Here's to making a dent in things together!
Dev notes
---------
Platform workstream: http://bettermeans.com/projects/2/dashboard
IRC: #bettermeans irc.feenode.net
mailinglist: bettermeans@librelist.org (or build in workstream forum)
Testing
-------
capybara-webkit depends on a WebKit implementation from Qt as explained in https://github.com/thoughtbot/capybara-webkit/wiki/Installing-QT
Translating
-----------
You can find language specific translation groups at: https://www.transifex.net/projects/p/bettermeans
Known issues
------------
Attachments doesn't work in dev environment
Logging in via the janrain plugin (e.g. google, twitter...etc) won't work in dev environment (if you need to work with this, drop me a message, there's an involved workaround)
License and legalese
--------------------
Our codebase is based largely on an early fork of Redmine.
Redmine is open source and released under the terms of the GNU General Public License v2 (GPL).
All redmine code is Copyright (C) 2006-2011 Jean-Philippe Lang
All non-redmine code is Copyright (C) Shereef Bishay, and is dual-licensed: you may use either the GNU General Public License v2 (GPL), or the MIT License (see http://www.opensource.org/licenses/mit-license.php).
Thanks for joining us! May our work be used for the greater good of everyone.
================================================
FILE: Rakefile
================================================
# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/switchtower.rake, and they will automatically be available to Rake.
require(File.join(File.dirname(__FILE__), 'config', 'boot'))
require 'rake'
require 'rake/testtask'
require 'rake/rdoctask'
require 'tasks/rails'
================================================
FILE: app/controllers/account_controller.rb
================================================
# TODO: rename this to something like SessionsController after integration specs are done
class AccountController < ApplicationController
# RPX does not pass Rails form tokens...
skip_before_filter :verify_authenticity_token, :only => [ :rpx_token, :register ]
# prevents login action from being filtered by check_if_login_required application scope filter
skip_before_filter :check_if_login_required, :except => [ :cancel ]
ssl_required :all
# Login request and validation
def login
set_invitation_token
if request.get?
logout_user
session[:invitation_token] = @invitation_token
render :layout => 'static'
elsif open_id_authenticate?
open_id_authenticate(params[:openid_url])
else
password_authentication(@invitation_token)
end
end
def rpx_token
find_user_by_identifier || find_user_by_mail || create_new_user
message = reactivate_user
successful_authentication(@user, @invitation_token, message)
end
# Log out current user and redirect to welcome page
def logout
cookies.delete :autologin
current_user.delete_autologin_tokens
logout_user
redirect_to home_url
end
# Enable user to choose a new password
def lost_password
redirect_to(home_url) && return unless Setting.lost_password?
validate_token || create_token
end
# User self-registration
def register
redirect_to(home_url) && return unless check_registration
pick_plan
if request.get?
logout_and_invite
else
initialize_user_with_plan
return if register_user_with_auth_source || register_user
end
render :layout => 'static'
end
# Token based account activation
def activate
redirect_to(home_url) && return unless can_activate? && user = registered_user
user.activate
if user.save
@token.destroy
flash.now[:success] = l(:notice_account_activated)
successful_authentication(user)
else
render :action => 'login', :layout => 'static'
end
end
def cancel
current_user.cancel_account!
render_message(l(:notice_account_canceled))
end
private
def password_authentication(invitation_token=nil)
user = User.try_to_login(params[:username], params[:password])
if user.nil?
invalid_credentials
elsif user.new_record?
onthefly_creation_failed(user, {:login => user.login, :auth_source_id => user.auth_source_id })
elsif user.active?
successful_authentication(user,invitation_token)
else
inactive_user
end
end
def open_id_authenticate(openid_url)
authenticate_with_open_id(openid_url, :required => [:nickname, :fullname, :email], :return_to => signin_url) do |result, identity_url, registration|
if result.successful?
user = User.find_or_initialize_by_identity_url(identity_url)
if user.new_record?
# Self-registration off
redirect_to(home_url) && return unless Setting.self_registration?
# Create on the fly
user.login = registration['nickname'] unless registration['nickname'].nil?
user.mail = registration['email'] unless registration['email'].nil?
user.firstname, user.lastname = registration['fullname'].split(' ') unless registration['fullname'].nil?
user.random_password
user.status = User::STATUS_REGISTERED
case Setting.self_registration
when '1'
register_by_email_activation(user) do
onthefly_creation_failed(user)
end
when '3'
register_automatically(user) do
onthefly_creation_failed(user)
end
else
register_manually_by_administrator(user) do
onthefly_creation_failed(user)
end
end
else
# Existing record
if user.active?
successful_authentication(user)
else
account_pending
end
end
end
end
end
def successful_authentication(user, invitation_token = nil, msg=nil)
# Valid user
self.logged_user = user
Track.log(Track::LOGIN,session[:client_ip])
if invitation_token
invitation = Invitation.find_by_token(invitation_token)
invitation.accept(user) if invitation
end
# generate a key and set cookie if autologin
if params[:autologin] && Setting.autologin?
token = Token.create(:user => user, :action => 'autologin')
cookies[:autologin] = { :value => token.value, :expires => 1.year.from_now }
end
if msg
render_message(msg)
else
redirect_back_or_default :controller => 'welcome', :action => 'index'
end
end
# Onthefly creation failed, display the registration form to fill/fix attributes
def onthefly_creation_failed(user, auth_source_options = { })
@user = user
session[:auth_source_registration] = auth_source_options unless auth_source_options.empty?
render :action => 'register'
end
def invalid_credentials
# BUGBUG: "invalid_credentials", spelling
flash.now[:error] = l(:notice_account_invalid_creditentials)
render :layout => 'static'
end
def inactive_user
flash.now[:error] = l(:notice_account_inactive_user)
render_error(l(:notice_account_inactive_user))
end
# Register a user for email activation.
#
# Pass a block for behavior when a user fails to save
def register_by_email_activation(user, invitation_token = nil)
# BUGBUG: this should just be `invitation_token.blank?`
# when it's nil this throws an error
unless invitation_token.empty? || invitation_token.nil?
invitation = Invitation.find_by_token invitation_token
invitation.new_mail = user.mail
invitation.save
end
if invitation && invitation.mail == user.mail
return register_automatically(user)
end
token = Token.new(:user => user, :action => "register")
if user.save and token.save
Mailer.send_later(:deliver_register,token)
flash.now[:success] = l(:notice_account_register_done)
render :action => 'login', :layout => 'static'
return true
else
yield if block_given?
return false
end
end
# Automatically register a user
#
# Pass a block for behavior when a user fails to save
def register_automatically(user, &block)
# Automatic activation
user.status = User::STATUS_ACTIVE
user.last_login_on = Time.now
if user.save
self.logged_user = user
Track.log(Track::LOGIN,session[:client_ip])
redirect_with_flash :success, l(:notice_account_activated), :controller => 'welcome', :action => 'index'
return true
else
yield if block_given?
return false
end
end
# Manual activation by the administrator
#
# Pass a block for behavior when a user fails to save
def register_manually_by_administrator(user, &block)
if user.save
# Sends an email to the administrators
Mailer.send_later(:deliver_account_activation_request,user)
account_pending
else
yield if block_given?
end
end
def account_pending
flash.now[:notice] = l(:notice_account_pending)
render :action => 'login', :layout => 'static'
end
def random_email
"#{(0...8).map{65.+(rand(25)).chr}.join}_noemail@bettermeans.com"
end
def data
@data ||= RPXNow.user_data(params[:token])
raise "hackers?" unless @data
@data
end
def invitation
return @invitation if defined? @invitation
if session[:invitation_token]
@invitation = Invitation.find_by_token(session[:invitation_token])
@invitation_token = session[:invitation_token]
end
@invitation
end
def invitation_mail
invitation.mail if invitation
end
def update_invitation
invitation.update_attributes(:new_mail => @user.mail) if invitation
end
def find_user_by_identifier
if @user = User.find_by_identifier(data[:identifier])
update_invitation
true
end
end
def find_user_by_mail
if data[:email] && @user = User.find_by_mail(data[:email])
@user.update_attributes(:identifier => data[:identifier])
true
end
end
def create_new_user
@user = User.new(:firstname => name,
:mail => mail,
:identifier => data[:identifier])
@user.login = available_login
update_invitation
save_user_or_raise
end
def reactivate_user
unless @user.active?
@user.reactivate
return l(:notice_account_reactivated)
end
end
def save_user_or_raise
unless @user.save
session[:debug_user] = @user.inspect
session[:debug_data] = data.inspect
raise "Couldn't create new account"
end
end
def name
data[:name] || data[:username]
end
def mail
# twitter accounts don't give email so we generate a random one
# TODO: get a real email from the user, or don't require one
data[:email] || invitation_mail || random_email
end
def available_login
# BUGBUG: if data[:email] is nil this won't fail based on validations
# should probably use mail from up above
User.find_available_login([data[:username], name]) || data[:email]
end
def logout_user
self.logged_user = nil
end
def set_invitation_token
session[:invitation_token] = params[:invitation_token] || session[:invitation_token]
@invitation_token = session[:invitation_token]
end
def open_id_authenticate?
Setting.openid? && using_open_id?
end
def update_password
# BUGBUG: password confirmation isn't validated when nil
@user.password = params[:new_password]
@user.password_confirmation = params[:new_password_confirmation]
if @user.save
@token.destroy
flash.now[:success] = l(:notice_account_password_updated)
render :action => 'login', :layout => 'static'
true
end
end
def valid_user
user = User.find_by_mail(params[:mail])
if user.nil?
flash.now[:error] = l(:notice_account_unknown_email)
nil
elsif user.auth_source_id
flash.now[:error] = l(:notice_can_t_change_password)
nil
else
user
end
end
def valid_token
if token && !token.expired?
token
else
redirect_to(home_url)
nil
end
end
def token
find_token('recovery')
end
# TODO: should be able to somehow combine #token and #find_token
def find_token(action)
@token ||= if params[:token]
Token.find_by_action_and_value(action, params[:token])
end
end
def send_mail(token)
Mailer.send_later(:deliver_lost_password, token)
flash.now[:success] = l(:notice_account_lost_email_sent)
render :action => 'login', :layout => 'static'
end
def validate_token
if params[:token] && @token = valid_token
@user = @token.user
return true if request.post? && update_password
render :template => "account/password_recovery"
true
end
end
def create_token
if request.post? && user = valid_user
token = Token.new(:user => user, :action => "recovery")
token.save && send_mail(token)
end
end
def pick_plan
if params[:plan]
@plan_id = Plan.find_by_code(params[:plan]).id
elsif params[:plan_id]
@plan_id = params[:plan_id]
else
@plan_id = Plan.find_by_code(Plan::FREE_CODE).id
end
end
def register_user
@user.login = params[:user][:login]
@user.password = params[:password]
@user.password_confirmation = params[:password_confirmation]
case Setting.self_registration
when '1'
register_by_email_activation(@user,params[:invitation_token])
when '3'
register_automatically(@user)
false
else
register_manually_by_administrator(@user)
false
end
end
def invite_to_login
session[:invitation_token] = params[:invitation_token]
invitation = Invitation.find_by_token(params[:invitation_token])
@user.mail = invitation.mail if invitation
flash.now[:notice] = "Sign up below to activate your invitation." <<
"<br><br><a href='/login?invitation_token=" <<
"#{params[:invitation_token]}'>" <<
"Login here if you already have an account.</a>"
end
def initialize_user_with_plan
@user = User.new(params[:user])
@user.plan_id = @plan_id
# TODO: it shouldn't be possible for @user.plan_id to be nil here
@user.trial_expires_on = 30.days.from_now if @user.plan_id && !@user.plan.free?
# TODO: admin is attr_protected in the model, so it shouldn't be necessary here
@user.admin = false
@user.status = User::STATUS_REGISTERED
end
def register_user_with_auth_source
return false unless session[:auth_source_registration]
@user.status = User::STATUS_ACTIVE
@user.login = session[:auth_source_registration][:login]
@user.auth_source_id = session[:auth_source_registration][:auth_source_id]
if @user.save
# TODO: this isn't necessary, as the session gets cleared in logged_user=
session[:auth_source_registration] = nil
self.logged_user = @user
Track.log(Track::LOGIN,session[:client_ip])
redirect_with_flash :notice, l(:notice_account_activated), :controller => 'my', :action => 'account'
true
end
end
def logout_and_invite
# TODO: this isn't necessary, as the session gets cleared in logged_user=
session[:auth_source_registration] = nil
logout_user
@user = User.new(:language => Setting.default_language)
invite_to_login if params[:invitation_token]
end
def check_registration
Setting.self_registration? || session[:auth_source_registration]
end
def can_activate?
Setting.self_registration? && params[:token] && valid_register_token?
end
def valid_register_token?
find_token('register')
@token && !@token.expired?
end
def registered_user
# TODO: this is brittle, depending on @token being set earlier
user = @token.user
user if user.registered?
end
end
================================================
FILE: app/controllers/activity_stream_preferences_controller.rb
================================================
#--
# Copyright (c) 2008 Matson Systems, Inc.
# Released under the BSD license found in the file
# LICENSE included with this ActivityStreams plug-in.
#++
# Template to generate the controllers
class ActivityStreamPreferencesController < ApplicationController
include ActivityStreamPreferencesModule
before_filter :require_login, :except => :feed
end
================================================
FILE: app/controllers/activity_stream_preferences_module.rb
================================================
#--
# Copyright (c) 2008 Matson Systems, Inc.
# Released under the BSD license found in the file
# LICENSE included with this ActivityStreams plug-in.
#++
# activity_stream_preferences_module.rb provides ActivityStreamPreferencesModule
require 'digest/sha1'
# ActivityStreamPreferencesModule is included in your generated ActivityStreamPereference Controller and provides functionality for User to configure preferences as to where their activities are displayed
module ActivityStreamPreferencesModule
def index
get_user_id
@activity_stream_preferences = ActivityStreamPreference.find(:all,
:conditions => { ACTIVITY_STREAM_USER_MODEL_ID => @user_id })
build_activities_hash
klass = Object::const_get(ACTIVITY_STREAM_USER_MODEL)
@user = klass.find(@user_id)
if @user.activity_stream_token.blank?
@user.update_attribute(:activity_stream_token,
Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join ))
if @user.id == self.current_user.id
self.current_user.reload
end
end
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @activity_stream_preferences }
end
end
def create
get_user_id
@activity_stream_preferences = ActivityStreamPreference.find(:all,
:conditions => { ACTIVITY_STREAM_USER_MODEL_ID => @user_id })
build_activities_hash
locations = params[:locations] || []
all_locations = []
ACTIVITY_STREAM_LOCATIONS.each do |location|
ACTIVITY_STREAM_ACTIVITIES.each_key do |activity|
all_locations << "#{activity.to_s}.#{location[0]}"
end
end
(all_locations - locations).each do |location|
activity = @activities[location]
if activity
@activities.delete(location)
next
end
activity = ActivityStreamPreference.new
(activity_name,location_id) = location.split('.')
activity.activity = activity_name
activity.location = location_id
activity.send("#{ACTIVITY_STREAM_USER_MODEL_ID}=", @user_id)
activity.save!
end
@activities.each_value { |a| a.destroy }
respond_to do |format|
flash.now[:success] = 'Activity Stream Preferences were successfully updated.'
format.html do
if current_user.admin? && params[ACTIVITY_STREAM_USER_MODEL_ID.to_sym] != current_user.id.to_s
redirect_to(activity_stream_preferences_path(ACTIVITY_STREAM_USER_MODEL_ID => @user_id))
else
redirect_to(activity_stream_preferences_path)
end
end
format.xml { head :ok }
end
end
protected
def get_user_id
if User.current.admin? && params[ACTIVITY_STREAM_USER_MODEL_ID.to_sym]
@user_id = params[ACTIVITY_STREAM_USER_MODEL_ID.to_sym]
else
@user_id = User.current.id
end
end
def build_activities_hash
@activities = {}
@activity_stream_preferences.each do |a|
key = "#{a.activity}.#{a.location}"
@activities[key] = a
end
end
end
================================================
FILE: app/controllers/activity_streams_controller.rb
================================================
#--
# Copyright (c) 2008 Matson Systems, Inc.
# Released under the BSD license found in the file
# LICENSE included with this ActivityStreams plug-in.
#++
# Template to generate the controllers
class ActivityStreamsController < ApplicationController
include ActivityStreamsModule
before_filter :authorize, :except => [ :index, :feed]
ssl_required :all
def index
respond_to do |wants|
wants.js do
render :update do |page|
if params[:refresh]
page.replace "activity_stream_list", :partial => "activity_streams/activity_stream_list", :locals => {
:user_id => params[:user_id],
:project_id => params[:project_id],
:with_subprojects => params[:with_subprojects],
:limit => params[:limit],
:max_created_at => nil,
:show_refresh => true}
page.call "arm_fancybox" #attaches fancybox triggers to new issues
page.call "break_long_words"
else
page.replace "activity_stream_bottom", :partial => "activity_streams/activity_stream_list", :locals => {
:user_id => params[:user_id],
:project_id => params[:project_id],
:with_subprojects => params[:with_subprojects],
:limit => params[:limit],
:max_created_at => params[:max_created_at],
:show_refresh => false}
page.call "arm_fancybox" #attaches fancybox triggers to new issues
page.call "break_long_words"
end
end
end
end
end
end
================================================
FILE: app/controllers/activity_streams_module.rb
================================================
#--
# Copyright (c) 2008 Matson Systems, Inc.
# Released under the BSD license found in the file
# LICENSE included with this ActivityStreams plug-in.
#++
# activity_streams_module.rb provides ActivityStreamsModule
#
# ActivityStreamsModule is included in your generated ActivityStreams Controller and provides base functionality for the Activity Streams Plug-in
module ActivityStreamsModule
def index
@activity_streams = ActivityStream.find(:all, :limit => 200, :order => "updated_at DESC")
respond_to do |format|
format.html
format.xml { render :xml => @activity_streams }
end
end
def show
@activity_stream = ActivityStream.find(params[:id])
respond_to do |format|
format.html
format.xml { render :xml => @activity_stream }
end
end
def new
@activity_stream = ActivityStream.new
respond_to do |format|
format.html
format.xml { render :xml => @activity_stream }
end
end
def edit
@activity_stream = ActivityStream.find(params[:id])
end
def create
@activity_stream = ActivityStream.new(params[:activity_stream])
respond_to do |format|
if @activity_stream.save
flash.now[:success] = 'ActivityStream was successfully created.'
format.html { redirect_to(@activity_stream) }
format.xml { render :xml => @activity_stream, :status => :created, :location => @activity_stream }
else
format.html { render :action => "new" }
format.xml { render :xml => @activity_stream.errors, :status => :unprocessable_entity }
end
end
end
def update
@activity_stream = ActivityStream.find(params[:id])
respond_to do |format|
if @activity_stream.update_attributes(params[:activity_stream])
flash.now[:success] = 'ActivityStream was successfully updated.'
format.html { redirect_to(@activity_stream) }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @activity_stream.errors, :status => :unprocessable_entity }
end
end
end
def destroy
@activity_stream = ActivityStream.find(params[:id])
respond_to do |format|
if (current_user.admin? || (current_user.id == @activity_stream.actor_id && @activity_stream.actor_type == ACTIVITY_STREAM_USER_MODEL)) && @activity_stream.soft_destroy
flash.now[:success] = 'Activity Removed.'
format.html { redirect_to "#{request.protocol}#{request.host_with_port}#{params[:ref]}" }
format.xml { head :ok }
else
flash.now[:error] = 'Unexpected Error removing ActivityStream.'
format.html {redirect_to "#{request.protocol}#{request.host_with_port}#{params[:ref]}"}
format.xml { head :error }
end
end
end
end
================================================
FILE: app/controllers/admin_controller.rb
================================================
# BetterMeans - Work 2.0
# Copyright (C) 2006-2011 See readme for details and license#
class AdminController < ApplicationController
layout 'admin'
before_filter :require_admin, :except => :user_stats
ssl_required :all
helper :sort
include SortHelper
def index
@no_configuration_data = Redmine::DefaultData::Loader::no_data?
end
def projects
@status = params[:status] ? params[:status].to_i : 1
c = ARCondition.new(@status == 0 ? "status <> 0" : ["status = ?", @status])
unless params[:name].blank?
name = "%#{params[:name].strip.downcase}%"
c << ["LOWER(identifier) LIKE ? OR LOWER(name) LIKE ?", name, name]
end
@projects = Project.find :all, :order => 'lft',
:conditions => c.conditions
render :action => "projects", :layout => false if request.xhr?
end
def plugins
@plugins = Redmine::Plugin.all
end
# Loads the default configuration
# (roles, trackers, statuses, workflow, enumerations)
def default_configuration
if request.post?
begin
Redmine::DefaultData::Loader::load(params[:lang])
flash.now[:success] = l(:notice_default_data_loaded)
rescue Exception => e
flash.now[:error] = l(:error_can_t_load_default_data, e.message)
end
end
redirect_to :action => 'index'
end
def test_email
raise_delivery_errors = ActionMailer::Base.raise_delivery_errors
# Force ActionMailer to raise delivery errors so we can catch it
ActionMailer::Base.raise_delivery_errors = true
begin
@test = Mailer.deliver_test(User.current)
flash.now[:success] = l(:notice_email_sent, User.current.mail)
rescue Exception => e
flash.now[:error] = l(:notice_email_error, e.message)
end
ActionMailer::Base.raise_delivery_errors = raise_delivery_errors
redirect_to :controller => 'settings', :action => 'edit', :tab => 'notifications'
end
def user_data_dump
@users = User.find(:all, :conditions => {:status => 1})
render :csv => @users
end
def info
@db_adapter_name = ActiveRecord::Base.connection.adapter_name
@checklist = [
[:text_default_administrator_account_changed, User.find(:first, :conditions => ["login=? and hashed_password=?", 'admin', User.hash_password('admin')]).nil?],
[:text_file_repository_writable, File.writable?(Attachment.storage_path)],
[:text_plugin_assets_writable, File.writable?(Engines.public_directory)],
[:text_rmagick_available, Object.const_defined?(:Magick)]
]
end
end
================================================
FILE: app/controllers/application_controller.rb
================================================
# BetterMeans - Work 2.0
# Copyright (C) 2006-2011 See readme for details and license#
require 'uri'
require 'cgi'
require 'ruby-debug'
class ApplicationController < ActionController::Base
include Redmine::I18n
include LogActivityStreams
before_filter :set_user_ip
include SslRequirement
# don't require ssl in development
skip_before_filter :ensure_proper_protocol if Rails.env.development?
layout 'gooey'
# Remove broken cookie after upgrade from 0.8.x (#4292)
# See https://rails.lighthouseapp.com/projects/8994/tickets/3360
# TODO: remove it when Rails is fixed
before_filter :delete_broken_cookies
def delete_broken_cookies
if cookies['_redmine_session'] && cookies['_redmine_session'] !~ /--/
cookies.delete '_redmine_session'
redirect_to home_path
return false
end
end
before_filter :user_setup, :check_if_login_required, :set_localization
filter_parameter_logging :password
protect_from_forgery
rescue_from ActionController::InvalidAuthenticityToken, :with => :invalid_authenticity_token
include Redmine::Search::Controller
include Redmine::MenuManager::MenuController
helper Redmine::MenuManager::MenuHelper
def set_user_ip
session[:client_ip] = request.headers['X-Real-Ip'] unless session[:client_ip]
end
def user_setup
# Check the settings cache for each request
Setting.check_cache
# Find the current user
User.current = find_current_user
end
def redirect_with_flash(flash_type,msg,*params)
flash[flash_type] = msg
redirect_to(*params)
end
def current_user
User.current
end
# Returns the current user or nil if no user is logged in
# and starts a session if needed
def find_current_user
if session[:user_id]
# existing session
user = (User.active.find(session[:user_id]) rescue nil)
user
elsif cookies[:autologin] && Setting.autologin?
# auto-login feature starts a new session
user = User.try_to_autologin(cookies[:autologin])
session[:user_id] = user.id if user
Track.log(Track::LOGIN,session[:client_ip]) if user
user
elsif Setting.rest_api_enabled? && ['xml', 'json'].include?(params[:format]) && accept_key_auth_actions.include?(params[:action])
if params[:key].present?
# Use API key
User.find_by_api_key(params[:key])
else
# HTTP Basic, either username/password or API key/random
authenticate_with_http_basic do |username, password|
#TODO: track login here: Track.log(Track::LOGIN,session[:client_ip])
User.try_to_login(username, password) || User.find_by_api_key(username)
end
end
end
end
# Sets the logged in user
def logged_user=(user)
#resetting session, but keeping client_ip
ip = session[:client_ip] if session[:client_ip]
reset_session
session[:client_ip] = ip
if user && user.is_a?(User)
User.current = user
session[:user_id] = user.id
else
User.current = User.anonymous
end
end
# check if login is globally required to access the application
def check_if_login_required
# no check needed if user is already logged in
return true if User.current.logged?
require_login if Setting.login_required?
end
def set_localization
lang = nil
if User.current.logged?
lang = find_language(User.current.language)
end
lang ||= Setting.default_language
set_language_if_valid(lang)
end
def data_admin_logged_in?
return true if User.current == User.find_by_login("shereef") || User.current == User.find_by_login("adelegb") || User.current == User.find_by_login("crabari")
return false
end
def require_login
if !User.current.logged?
# Extract only the basic url parameters on non-GET requests
if request.get?
url = url_for(params)
else
url = url_for(:controller => params[:controller], :action => params[:action], :id => params[:id], :project_id => params[:project_id])
end
respond_to do |format|
format.html { redirect_to :controller => "account", :action => "login", :back_url => url }
format.xml { head :unauthorized }
format.json { head :unauthorized }
end
return false
end
true
end
def require_admin
return unless require_login
if !User.current.admin?
render_403
return false
end
true
end
def deny_access
User.current.logged? ? render_403 : require_login
end
# Authorize the user for the requested action
def authorize(ctrl = params[:controller], action = params[:action], global = false)
return true if params[:format] == "png"
allowed = User.current.allowed_to?({:controller => ctrl, :action => action}, @project, :global => global)
allowed ? true : deny_access
end
# Authorize the user for the requested action outside a project
def authorize_global(ctrl = params[:controller], action = params[:action], global = true)
authorize(ctrl, action, global)
end
# make sure that the user is a member of the project (or admin) if project is private
# used as a before_filter for actions that do not require any particular permission on the project
def check_project_privacy
if @project && @project.active?
if @project.is_public? || User.current.allowed_to_see_project?(@project) || User.current.admin?
true
else
User.current.logged? ? render_403 : require_login
end
else
@project = nil
render_404
false
end
end
def redirect_back_or_default(default)
back_url = CGI.unescape(params[:back_url].to_s)
if !back_url.blank? && !back_url.include?("/home/") && !back_url.include?("/front/")
begin
uri = URI.parse(back_url)
# do not redirect user to another host or to the login or register page
if (uri.relative? || (uri.host == request.host)) && !uri.path.match(%r{/(login|account/register)})
redirect_to(back_url)
return
end
rescue URI::InvalidURIError
# redirect to default
end
end
redirect_to default
end
def render_403
@project = nil
render :template => "common/403", :layout => (request.xhr? ? false : 'gooey'), :status => 403
return false
end
def render_404
render :template => "common/404", :layout => !request.xhr?, :status => 404
return false
end
def render_error(msg)
flash.now[:error] = msg
render :text => '', :layout => !request.xhr?, :status => 500
end
def render_message(msg)
flash.now[:notice] = msg
render :text => '', :layout => !request.xhr?
end
def invalid_authenticity_token
redirect_back_or_default(home_path)
end
def render_feed(items, options={})
@items = items || []
@items.sort! {|x,y| y.event_datetime <=> x.event_datetime }
@items = @items.slice(0, Setting.feeds_limit.to_i)
@title = options[:title] || Setting.app_title
render :template => "common/feed.atom.rxml", :layout => false, :content_type => 'application/atom+xml'
end
def self.accept_key_auth(*actions)
actions = actions.flatten.map(&:to_s)
write_inheritable_attribute('accept_key_auth_actions', actions)
end
def accept_key_auth_actions
self.class.read_inheritable_attribute('accept_key_auth_actions') || []
end
def attach_files_for_new_issue(issue,attachment_ids)
if attachment_ids
Attachment.update_all("container_id = #{issue.id}" , "id in (#{attachment_ids}) and container_id = 0" )
end
end
# TODO: move to model
def attach_files(obj, attachments)
attached = []
unsaved = []
if attachments && attachments.is_a?(Hash)
attachments.each_value do |attachment|
file = attachment['file']
next unless file && file.size > 0
a = Attachment.create(:container => obj,
:file => file,
:description => attachment['description'].to_s.strip,
:author => User.current)
a.new_record? ? (unsaved << a) : (attached << a)
end
if unsaved.any?
flash.now[:error] = l(:warning_attachments_not_saved, unsaved.size)
end
end
attached
end
def attach_temp_files(obj, attachments)
attached = []
unsaved = []
logger.info { "attaching temp #{attachments.inspect}" }
if attachments && attachments.is_a?(Hash)
attachments.each_value do |attachment|
logger.info { "atatchment #{attachment}" }
file = Tempfile.open(attachment)
next unless file && file.size > 0
a = Attachment.create(:container => obj,
:file => file,
:description => '',
:author => User.current)
a.new_record? ? (unsaved << a) : (attached << a)
end
if unsaved.any?
flash.now[:error] = l(:warning_attachments_not_saved, unsaved.size)
end
end
attached
end
#replaces newline characters with more binary-compatible ones
def cleanup_newline(text)
return text unless text and !text.empty?
text.gsub(/\r?\n/, "\r\n")
end
# Same as Rails' simple_format helper without using paragraphs
def simple_format_without_paragraph(text)
text.to_s.
gsub(/\r\n?/, "\n"). # \r\n and \r -> \n
gsub(/\n\n+/, "<br /><br />"). # 2+ newline -> 2 br
gsub(/([^\n]\n)(?=[^\n])/, '\1<br />') # 1 newline -> br
end
# Returns the number of objects that should be displayed
# on the paginated list
def per_page_option
per_page = nil
if params[:per_page] && Setting.per_page_options_array.include?(params[:per_page].to_s.to_i)
per_page = params[:per_page].to_s.to_i
session[:per_page] = per_page
elsif session[:per_page]
per_page = session[:per_page]
else
per_page = Setting.per_page_options_array.first || 25
end
per_page
end
# qvalues http header parser
# code taken from webrick
def parse_qvalues(value)
tmp = []
if value
parts = value.split(/,\s*/)
parts.each {|part|
if m = %r{^([^\s,]+?)(?:;\s*q=(\d+(?:\.\d+)?))?$}.match(part)
val = m[1]
q = (m[2] or 1).to_f
tmp.push([val, q])
end
}
tmp = tmp.sort_by{|val, q| -q}
tmp.collect!{|val, q| val}
end
return tmp
rescue
nil
end
# Returns a string that can be used as filename value in Content-Disposition header
def filename_for_content_disposition(name)
request.env['HTTP_USER_AGENT'] =~ %r{MSIE} ? ERB::Util.url_encode(name) : name
end
#breakpoint
def bp
debugger if ENV['RAILS_ENV'] == 'development'
end
end
================================================
FILE: app/controllers/attachments_controller.rb
================================================
# Redmine - project management software
# Copyright (C) 2006-2011 See readme for details and license
#
class AttachmentsController < ApplicationController
before_filter :find_project, :except => :create
before_filter :read_authorize, :except => [:destroy, :create]
before_filter :delete_authorize, :only => :destroy
ssl_required :all
verify :method => :post, :only => :destroy
unloadable # Send unloadable so it will not be unloaded in development
before_filter :redirect_to_s3, :except => [:destroy, :create]
def create
logger.info { "params #{params.inspect}" }
if params[:file]
file = params[:file]
logger.info { "file #{file.inspect}" }
a = Attachment.create(:container_id => params[:container_id],
:container_type => params[:container_type],
:file => file,
:author => User.current)
logger.info { "created attachment #{a.inspect}" }
end
logger.info {"done with create" }
render :json => a.to_json
end
def redirect_to_s3
if @attachment.container.is_a?(Project)
@attachment.increment_download
end
redirect_to("#{RedmineS3::Connection.uri}/#{@attachment.disk_filename}")
end
def show
if @attachment.is_diff?
@diff = File.new(@attachment.diskfile, "rb").read
render :action => 'diff'
elsif @attachment.is_text? && @attachment.filesize <= Setting.file_max_size_displayed.to_i.kilobyte
@content = File.new(@attachment.diskfile, "rb").read
render :action => 'file'
else
download
end
end
def download
if @attachment.container.is_a?(Project)
@attachment.increment_download
end
# images are sent inline
send_file @attachment.diskfile, :filename => filename_for_content_disposition(@attachment.filename),
:type => @attachment.content_type,
:disposition => (@attachment.image? ? 'inline' : 'attachment')
end
def destroy
# Make sure association callbacks are called
@attachment.container.attachments.delete(@attachment)
redirect_to :back
rescue ::ActionController::RedirectBackError
redirect_to :controller => 'projects', :action => 'show', :id => @project
end
private
def find_project
@attachment = Attachment.find(params[:id])
# Show 404 if the filename in the url is wrong
raise ActiveRecord::RecordNotFound if params[:filename] && params[:filename] != @attachment.filename
@project = @attachment.project
rescue ActiveRecord::RecordNotFound
render_404
end
# Checks that the file exists and is readable
def file_readable
@attachment.readable? ? true : render_404
end
def read_authorize
@attachment.visible? ? true : deny_access
end
def delete_authorize
@attachment.deletable? ? true : deny_access
end
end
================================================
FILE: app/controllers/auth_sources_controller.rb
================================================
# BetterMeans - Work 2.0
# Copyright (C) 2006-2011 See readme for details and license#
class AuthSourcesController < ApplicationController
layout 'admin'
before_filter :require_admin
ssl_required :all
def index
list
render :action => 'list' unless request.xhr?
end
# GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
verify :method => :post, :only => [ :destroy, :create, :update ],
:redirect_to => { :action => :list }
def list
@auth_source_pages, @auth_sources = paginate :auth_sources, :per_page => 10
render :action => "list", :layout => false if request.xhr?
end
def new
@auth_source = AuthSourceLdap.new
end
def create
@auth_source = AuthSourceLdap.new(params[:auth_source])
if @auth_source.save
flash.now[:success] = l(:notice_successful_create)
redirect_to :action => 'list'
else
render :action => 'new'
end
end
def edit
@auth_source = AuthSource.find(params[:id])
end
def update
@auth_source = AuthSource.find(params[:id])
if @auth_source.update_attributes(params[:auth_source])
flash.now[:success] = l(:notice_successful_update)
redirect_to :action => 'list'
else
render :action => 'edit'
end
end
def test_connection
@auth_method = AuthSource.find(params[:id])
begin
@auth_method.test_connection
flash.now[:success] = l(:notice_successful_connection)
rescue => text
flash.now[:error] = "Unable to connect (#{text})"
end
redirect_to :action => 'list'
end
def destroy
@auth_source = AuthSource.find(params[:id])
unless @auth_source.users.find(:first)
@auth_source.destroy
flash.now[:success] = l(:notice_successful_delete)
end
redirect_to :action => 'list'
end
end
================================================
FILE: app/controllers/boards_controller.rb
================================================
# BetterMeans - Work 2.0
# Copyright (C) 2006-2011 See readme for details and license#
class BoardsController < ApplicationController
default_search_scope :messages
before_filter :find_project, :authorize
ssl_required :all
helper :messages
include MessagesHelper
helper :sort
include SortHelper
helper :watchers
include WatchersHelper
def index
@boards = @project.boards
# show the board if there is only one
if @boards.size == 1
@board = @boards.first
show
end
end
def show
respond_to do |format|
format.html {
sort_init 'updated_at', 'desc'
sort_update 'created_at' => "#{Message.table_name}.created_at",
'replies' => "#{Message.table_name}.replies_count",
'updated_at' => "#{Message.table_name}.updated_at"
@topic_count = @board.topics.count
@topic_pages = Paginator.new self, @topic_count, per_page_option, params['page']
@topics = @board.topics.find :all, :order => ["#{Message.table_name}.sticky DESC", sort_clause].compact.join(', '),
:include => [:author, {:last_reply => :author}],
:limit => @topic_pages.items_per_page,
:offset => @topic_pages.current.offset
@message = Message.new
render :action => 'show', :layout => !request.xhr?
}
end
end
verify :method => :post, :only => [ :destroy ], :redirect_to => { :action => :index }
def new
@board = Board.new(params[:board])
@board.project = @project
if request.post? && @board.save
flash.now[:success] = l(:notice_successful_create)
redirect_to :controller => 'projects', :action => 'settings', :id => @project, :tab => 'boards'
end
end
def edit
if request.post? && @board.update_attributes(params[:board])
redirect_to :controller => 'projects', :action => 'settings', :id => @project, :tab => 'boards'
end
end
def destroy
@board.destroy
redirect_to :controller => 'projects', :action => 'settings', :id => @project, :tab => 'boards'
end
private
def find_project
@project = Project.find(params[:project_id])
render_message l(:text_project_locked) if @project.locked?
@board = @project.boards.find(params[:id]) if params[:id]
rescue ActiveRecord::RecordNotFound
render_404
end
end
================================================
FILE: app/controllers/comments_controller.rb
================================================
class CommentsController < ApplicationController
unloadable
before_filter :find_issue, :only => [:index, :create ]
before_filter :find_project, :authorize
ssl_required :all
log_activity_streams :current_user, :name, :updated, :@issue, :subject, :create, :issues, {
:object_description_method => :description,
:indirect_object => :@journal,
:indirect_object_description_method => :notes,
:indirect_object_phrase => '' }
def index
@journals = @issue.journals.find(:all,
:include => [:user, :details],
:order => "#{Journal.table_name}.created_at DESC",
:conditions => "notes!=''")
end
def create
@journal = @issue.init_journal(User.current, params[:comment])
@journal.save!
@journal.reload
@issue.reload
render :json => @issue.to_dashboard
end
private
def find_issue
@issue = Issue.find(params[:issue_id])
end
def find_project
@project = @issue.project
end
end
================================================
FILE: app/controllers/credit_distributions_controller.rb
================================================
class CreditDistributionsController < ApplicationController
before_filter :require_admin
ssl_required :all
def index
@credit_distributions = CreditDistribution.all
respond_to do |format|
format.html
format.xml { render :xml => @credit_distributions }
end
end
def show
@credit_distribution = CreditDistribution.find(params[:id])
respond_to do |format|
format.html
format.xml { render :xml => @credit_distribution }
end
end
def new
@credit_distribution = CreditDistribution.new
respond_to do |format|
format.html
format.xml { render :xml => @credit_distribution }
end
end
def edit
@credit_distribution = CreditDistribution.find(params[:id])
end
def create
@credit_distribution = CreditDistribution.new(params[:credit_distribution])
respond_to do |format|
if @credit_distribution.save
flash.now[:success] = 'CreditDistribution was successfully created.'
format.html { redirect_to(@credit_distribution) }
format.xml { render :xml => @credit_distribution, :status => :created, :location => @credit_distribution }
else
format.html { render :action => "new" }
format.xml { render :xml => @credit_distribution.errors, :status => :unprocessable_entity }
end
end
end
def update
@credit_distribution = CreditDistribution.find(params[:id])
respond_to do |format|
if @credit_distribution.update_attributes(params[:credit_distribution])
flash.now[:success] = 'CreditDistribution was successfully updated.'
format.html { redirect_to(@credit_distribution) }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @credit_distribution.errors, :status => :unprocessable_entity }
end
end
end
def destroy
@credit_distribution = CreditDistribution.find(params[:id])
@credit_distribution.destroy
respond_to do |format|
format.html { redirect_to(credit_distributions_url) }
format.xml { head :ok }
end
end
end
================================================
FILE: app/controllers/credit_transfers_controller.rb
================================================
# BetterMeans - Work 2.0
# Copyright (C) 2006-2011 See readme for details and license
#
class CreditTransfersController < ApplicationController
ssl_required :all
before_filter :authorize_global, :except => :eligible_recipients
def index
@credit_transfers = CreditTransfer.find(:all, :conditions => "sender_id = #{User.current.id} or recipient_id = #{User.current.id}", :include => [:sender, :recipient, :project],:order => "created_at DESC")
project_id_array = Credit.find(:all,:conditions => {:settled_on => nil, :owner_id => User.current.id}).group_by(&:project_id).collect{|p| p[0]}
if project_id_array.empty?
else
@project_list = Project.find(:all, :conditions => "id IN (#{project_id_array.join(",")})").sort! {|x,y| x.name <=> y.name }
if params[:selected_project_id]
@selected_project_id = Integer(params[:selected_project_id])
@project = Project.find(@selected_project_id)
@total_credits = Credit.round(Credit.sum(:amount, :conditions => {:settled_on => nil, :owner_id => User.current.id, :project_id => @project.id}))
@user_list = @project.root.all_members
#remove current user from list
@user_list.delete_if { |a| a.user_id == User.current.id}
end
end
end
def create
recipient = User.find(params[:credit_transfer][:recipient_id])
project = Project.find(params[:credit_transfer][:project_id])
total_transferred = Credit.transfer User.current, recipient, project, Float(params[:amount]), params[:note]
respond_to do |format|
flash.now[:success] = "Successfully transferred #{total_transferred} credits to #{recipient.name}"
format.html { redirect_to :action => "index" }
flash.keep
end
rescue Exception => e
flash.now[:error] = l(:text_failed_to_transfer) + e.message
redirect_to :action => "index"
flash.keep
end
def eligible_recipients
@project = Project.find(params[:project_id])
@total_credits = Credit.round(Credit.sum(:amount, :conditions => {:settled_on => nil, :owner_id => User.current.id, :project_id => @project.id}))
@user_list = ""
@user_list = @project.root.all_members
#remove current user from list
@user_list.delete_if { |a| a.user_id == User.current.id}
render :partial => "eligible_recipients"
end
end
================================================
FILE: app/controllers/credits_controller.rb
================================================
class CreditsController < ApplicationController
before_filter :require_admin, :except => [:disable, :enable]
before_filter :find_credit, :only => [:disable, :enable]
before_filter :self_authorize, :only => [:disable, :enable]
ssl_required :all
def index
@project = Project.find(params[:project_id]) unless params[:project_id].nil?
@credits = @project.credits
@active_credits = @credits.find_all{|credit| credit.enabled == true }.group_by{|credit| credit.owner_id}
respond_to do |format|
format.html
format.xml { render :xml => @credits }
end
end
def show
@credit = Credit.find(params[:id])
respond_to do |format|
format.html
format.xml { render :xml => @credit }
end
end
def new
@credit = Credit.new
respond_to do |format|
format.html
format.xml { render :xml => @credit }
end
end
def edit
@credit = Credit.find(params[:id])
end
def create
@credit = Credit.new(params[:credit])
respond_to do |format|
if @credit.save
flash.now[:success] = 'Credit was successfully created.'
format.html { redirect_to :controller => :projects, :id => @credit.project_id, :action => "credits" }
format.xml { render :xml => @credit, :status => :created, :location => @credit }
else
format.html { render :action => "new" }
format.xml { render :xml => @credit.errors, :status => :unprocessable_entity }
end
end
end
def update
@credit = Credit.find(params[:id])
respond_to do |format|
if @credit.update_attributes(params[:credit])
flash.now[:success] = 'Credit was successfully updated.'
format.html { redirect_to :controller => :projects, :id => @credit.project_id, :action => "credits" }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @credit.errors, :status => :unprocessable_entity }
end
end
end
def disable
respond_to do |format|
if @credit.disable
format.html { redirect_to :controller => :projects, :id => @credit.project_id, :action => "credits" }
format.js do
update_credit_partials
end
else
format.html { redirect_to :controller => :projects, :id => @credit.project_id, :action => "credits" }
format.js do
render :update do |page|
page.call '$.jGrowl', 'Something went wrong. Couldn\'t update record.'
end
end
end
end
end
def enable
respond_to do |format|
if @credit.enable
format.html { redirect_to :controller => :projects, :id => @credit.project_id, :action => "credits" }
format.js do
update_credit_partials
end
else
format.html { redirect_to :controller => :projects, :id => @credit.project_id, :action => "credits" }
format.js do
render :update do |page|
page.call '$.jGrowl', 'Something went wrong. Couldn\'t update record.'
end
end
end
end
end
def update_credit_partials
@project = Project.find(params[:project_id])
@credits = @project.fetch_credits(params[:with_subprojects])
@active_credits = @credits.find_all{|credit| credit.enabled == true && credit.settled_on.nil? == true }.group_by{|credit| credit.owner_id}
render :update do |page|
page.replace_html "my_credits_partial", :partial => 'credits/my_credits'
page.replace_html "credit_queue_partial", :partial => 'credits/credit_queue'
page.replace_html "credit_history_partial", :partial => 'credits/credit_history'
page.replace_html "active_credits_partial", :partial => 'credits/credit_breakdown', :locals => {:group_credits => @active_credits, :title => l(:label_active_credits)}
page.visual_effect :highlight, "q_#{@credit.id}", :duration => 2
page.visual_effect :highlight, "h_#{@credit.id}", :duration => 2
page.visual_effect :highlight, "m_#{@credit.id}", :duration => 3
end
end
def destroy
@credit = Credit.find(params[:id])
@credit.destroy
respond_to do |format|
format.html { redirect_to :controller => :projects, :id => @credit.project_id, :action => "credits" }
format.xml { head :ok }
end
end
private
def find_credit
@credit = Credit.find(params[:id])
rescue ActiveRecord::RecordNotFound
render_404
end
def self_authorize
if User.current.id != @credit.owner_id
render_403
return false
end
end
end
================================================
FILE: app/controllers/documents_controller.rb
================================================
# BetterMeans - Work 2.0
# Copyright (C) 2006-2011 See readme for details and license#
class DocumentsController < ApplicationController
default_search_scope :documents
before_filter :find_project, :only => [:index, :new]
before_filter :find_document, :except => [:index, :new]
before_filter :authorize
ssl_required :all
helper :attachments
log_activity_streams :current_user, :name, :added, :@document, :title, :new, :documents, {:object_description_method => :description}
log_activity_streams :current_user, :name, :updated, :@document, :title, :edit, :documents, {:object_description_method => :description}
log_activity_streams :current_user, :name, :deleted, :@document, :title, :destroy, :documents, {:object_description_method => :description}
def index
@sort_by = %w(catego»ry date title author).include?(params[:sort_by]) ? params[:sort_by] : 'title'
documents = @project.documents.find :all, :include => [:attachments]
case @sort_by
when 'date'
@grouped = documents.group_by {|d| d.updated_at.to_date }
when 'title'
@grouped = documents.group_by {|d| d.title.first.upcase}
when 'author'
@grouped = documents.select{|d| d.attachments.any?}.group_by {|d| d.attachments.last.author}
else
@grouped = documents.group_by {|d| d.updated_at.to_date }
end
@document = @project.documents.build
render :layout => false if request.xhr?
end
def show
@attachments = @document.attachments.find(:all, :order => "created_at DESC")
end
def new
@document = @project.documents.build(params[:document])
if request.post? and @document.save
attach_files(@document, params[:attachments])
flash.now[:success] = l(:notice_successful_create)
redirect_to :action => 'index', :project_id => @project
end
end
def edit
if request.post? and @document.update_attributes(params[:document])
flash.now[:success] = l(:notice_successful_update)
redirect_to :action => 'show', :id => @document
end
end
def destroy
@document.destroy
redirect_to :controller => 'documents', :action => 'index', :project_id => @project
end
def add_attachment
attachments = attach_files(@document, params[:attachments])
Mailer.deliver_attachments_added(attachments) if !attachments.empty? && Setting.notified_events.include?('document_added')
redirect_to :action => 'show', :id => @document
end
private
def find_project
@project = Project.find(params[:project_id])
render_message l(:text_project_locked) if @project.locked?
rescue ActiveRecord::RecordNotFound
render_404
end
def find_document
@document = Document.find(params[:id])
@project = @document.project
rescue ActiveRecord::RecordNotFound
render_404
end
end
================================================
FILE: app/controllers/email_updates_controller.rb
================================================
class EmailUpdatesController < ApplicationController
before_filter :require_login
ssl_required :all
def new
@email_update = EmailUpdate.new
respond_to do |format|
format.html
format.xml { render :xml => @invitation }
end
end
def create
@email_update = EmailUpdate.new(params[:email_update])
@email_update.user = User.current
respond_to do |format|
if @email_update.save
@email_update.send_activation
format.html { redirect_with_flash :success, "Please check #{@email_update.mail} for the activation email", {:controller => :my, :action => "account"} }
else
flash.now[:error] = "Couldn't create email update"
format.html { render :action => "new" }
end
end
end
def activate
@email_update = EmailUpdate.find_by_token(params[:token])
if @email_update.nil?
redirect_with_flash :error, l(:error_bad_email_update), :controller => :my, :action => :account
return
end
@email_update.accept
redirect_with_flash :success, l(:text_email_updated), :controller => :my, :action => :account
return
rescue ActiveRecord::RecordNotFound
redirect_with_flash :error, l(:error_bad_email_update), :controller => :my, :action => :account
end
end
================================================
FILE: app/controllers/enterprises_controller.rb
================================================
class EnterprisesController < ApplicationController
ssl_required :all
def index
@enterprises = Enterprise.all
respond_to do |format|
format.html
format.xml { render :xml => @enterprises }
end
end
def show
@enterprise = Enterprise.find(params[:id])
respond_to do |format|
format.html
format.xml { render :xml => @enterprise }
end
end
def new
@enterprise = Enterprise.new
respond_to do |format|
format.html
format.xml { render :xml => @enterprise }
end
end
def edit
@enterprise = Enterprise.find(params[:id])
end
def create
@enterprise = Enterprise.new(params[:enterprise])
respond_to do |format|
if @enterprise.save
flash.now[:success] = 'Enterprise was successfully created.'
format.html { redirect_to(@enterprise) }
format.xml { render :xml => @enterprise, :status => :created, :location => @enterprise }
else
format.html { render :action => "new" }
format.xml { render :xml => @enterprise.errors, :status => :unprocessable_entity }
end
end
end
def update
@enterprise = Enterprise.find(params[:id])
respond_to do |format|
if @enterprise.update_attributes(params[:enterprise])
flash.now[:success] = 'Enterprise was successfully updated.'
format.html { redirect_to(@enterprise) }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @enterprise.errors, :status => :unprocessable_entity }
end
end
end
def destroy
@enterprise = Enterprise.find(params[:id])
@enterprise.destroy
respond_to do |format|
format.html { redirect_to(enterprises_url) }
format.xml { head :ok }
end
end
end
================================================
FILE: app/controllers/enumerations_controller.rb
================================================
# BetterMeans - Work 2.0
# Copyright (C) 2006-2011 See readme for details and license#
class EnumerationsController < ApplicationController
layout 'admin'
before_filter :require_admin
ssl_required :all
def index
list
render :action => 'list'
end
# GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
verify :method => :post, :only => [ :destroy, :create, :update ],
:redirect_to => { :action => :list }
def list
end
def new
begin
@enumeration = params[:type].constantize.new
rescue NameError
@enumeration = Enumeration.new
end
end
def create
@enumeration = Enumeration.new(params[:enumeration])
@enumeration.type = params[:enumeration][:type]
if @enumeration.save
flash.now[:success] = l(:notice_successful_create)
redirect_to :action => 'list', :type => @enumeration.type
else
render :action => 'new'
end
end
def edit
@enumeration = Enumeration.find(params[:id])
end
def update
@enumeration = Enumeration.find(params[:id])
@enumeration.type = params[:enumeration][:type] if params[:enumeration][:type]
if @enumeration.update_attributes(params[:enumeration])
flash.now[:success] = l(:notice_successful_update)
redirect_to :action => 'list', :type => @enumeration.type
else
render :action => 'edit'
end
end
def destroy
@enumeration = Enumeration.find(params[:id])
if !@enumeration.in_use?
# No associated objects
@enumeration.destroy
redirect_to :action => 'index'
elsif params[:reassign_to_id]
if reassign_to = Enumeration.find_by_type_and_id(@enumeration.type, params[:reassign_to_id])
@enumeration.destroy(reassign_to)
redirect_to :action => 'index'
end
end
@enumerations = Enumeration.find(:all, :conditions => ['type = (?)', @enumeration.type]) - [@enumeration]
end
end
================================================
FILE: app/controllers/help_controller.rb
================================================
class HelpController < ApplicationController
def show
@help_key = params[:key]
end
end
================================================
FILE: app/controllers/help_sections_controller.rb
================================================
class HelpSectionsController < ApplicationController
before_filter :authorize, :except => :dont_show
ssl_required :all
def show
respond_to do |format|
if @help_section.show
format.html
format.xml { render :xml => @help_section }
else
format.html { render :nothing => true}
end
end
end
def dont_show
@help_section = HelpSection.find(params[:id])
@help_section.show = false
@help_section.save
respond_to do |wants|
wants.js { render :update do |page|
page.replace "help_section", ""
end
}
end
end
def new
@help_section = HelpSection.new
respond_to do |format|
format.html
format.xml { render :xml => @help_section }
end
end
def edit
@help_section = HelpSection.find(params[:id])
end
def create
@help_section = HelpSection.new(params[:help_section])
respond_to do |format|
if @help_section.save
flash.now[:success] = 'HelpSection was successfully created.'
format.html { redirect_to(@help_section) }
format.xml { render :xml => @help_section, :status => :created, :location => @help_section }
else
format.html { render :action => "new" }
format.xml { render :xml => @help_section.errors, :status => :unprocessable_entity }
end
end
end
def update
@help_section = HelpSection.find(params[:id])
respond_to do |format|
if @help_section.update_attributes(params[:help_section])
flash.now[:success] = 'HelpSection was successfully updated.'
format.html { redirect_to(@help_section) }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @help_section.errors, :status => :unprocessable_entity }
end
end
end
def destroy
@help_section = HelpSection.find(params[:id])
@help_section.destroy
respond_to do |format|
format.html { redirect_to(help_sections_url) }
format.xml { head :ok }
end
end
end
================================================
FILE: app/controllers/home_controller.rb
================================================
class HomeController < ApplicationController
ssl_required :index
layout 'static'
def index
if User.current.logged?
redirect_to :controller => 'welcome', :action => 'index'
else
redirect_to "/front/index.html"
end
end
def show
render :action => params[:page]
end
def robots
@projects = Project.all_public.active
render :layout => false, :content_type => 'text/plain'
end
end
================================================
FILE: app/controllers/hourly_types_controller.rb
================================================
class HourlyTypesController < ApplicationController
before_filter :find_project
ssl_required :all
def new
@hourly_type = HourlyType.new(params[:hourly_type])
@hourly_type.project = @project
if request.post? && @hourly_type.save
flash.now[:success] = l(:notice_successful_create)
redirect_to :controller => 'projects', :action => 'settings', :id => @project, :tab => 'hourly_types'
end
end
def edit
if request.post? && @hourly_type.update_attributes(params[:hourly_type])
redirect_to :controller => 'projects', :action => 'settings', :id => @project, :tab => 'hourly_types'
end
end
def destroy
@hourly_type.destroy
redirect_to :controller => 'projects', :action => 'settings', :id => @project, :tab => 'hourly_types'
end
private
def find_project
@project = Project.find(params[:project_id])
@hourly_type = @project.hourly_types.find(params[:id]) if params[:id]
rescue ActiveRecord::RecordNotFound
render_404
end
end
================================================
FILE: app/controllers/invitations_controller.rb
================================================
class InvitationsController < ApplicationController
before_filter :find_project, :except => :accept
before_filter :authorize, :except => :accept
ssl_required :all
def index
@all_invites, @invitations = paginate :invitations,
:per_page => 30,
:conditions => {:user_id => User.current.id, :project_id => @project.id},
:order => "created_at DESC"
respond_to do |format|
format.html { render :layout => false if request.xhr? }
format.xml { render :xml => @invitations.to_xml }
format.json { render :json => @invitation.to_json }
end
end
def show
@invitation = Invitation.find(params[:id])
respond_to do |format|
format.html
format.xml { render :xml => @invitation }
end
end
def new
unless @project.root?
render_error("Project is not root. No invitations needed here.")
return
end
@note = l(:text_invitation_note_default, {:user => User.current.name, :project => @project.name})
respond_to do |format|
format.html
format.xml { render :xml => @invitation }
end
end
def edit
@invitation = Invitation.find(params[:id])
end
def create
#can't invite someone to anything other than contributor if you're not admin
if params[:invitation][:role_id] != Role.contributor.id.to_s && !User.current.admin_of?(@project)
render_403
return
end
success = false
@emails = params[:emails]
@email_array = @emails.gsub(/\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b/i) {|s| s}.collect
@email_array.uniq!
@email_array.each do |email|
@email_array.delete email unless valid_email?(email)
end
@email_array.each do |email|
@invitation = Invitation.new(params[:invitation])
@invitation.mail = TMail::Address.parse(email).to_s
@invitation.project_id = @project.id
@invitation.user_id = User.current.id
if @invitation.save
@invitation.deliver(simple_format_without_paragraph(params[:note]))
success = true
end
end
respond_to do |format|
if success
@emails = nil
@note = params[:note]
@roles = Role.find(:all, :conditions => {:level => 1}, :order => "position DESC")
flash.now[:success] = "#{@email_array.length} invitation(s) successfully sent to<br>" + @email_array.join(", ")
format.html { render :action => "new" }
format.xml { render :xml => @invitation, :status => :created, :location => @invitation }
else
flash.now[:error] = "Failed to send invitations. Make sure emails are properly formatted, and are each on a seperate line"
format.html { render :action => "new" }
format.xml { render :xml => @invitation.errors, :status => :unprocessable_entity }
end
end
end
def accept
@invitation = Invitation.find(params[:id])
if @invitation.token != params[:token] || @invitation.status != Invitation::PENDING
redirect_with_flash :error, l(:error_old_invite), :controller => :projects, :action => :show, :id => @invitation.project_id
return
end
if @invitation.new_mail && !@invitation.new_mail.empty?
@user = User.find_by_mail(@invitation.new_mail)
else
@user = User.find_by_mail(@invitation.mail)
end
respond_to do |wants|
wants.html {
if @user && !@user.anonymous?
self.logged_user = @user
Track.log(Track::LOGIN,request.env['REMOTE_ADDR'])
@invitation.accept
msg = "Invitation accepted. You are now a #{@invitation.role.name} of #{@invitation.project.name}."
redirect_with_flash :success, msg, :controller => :projects, :action => :show, :id => @invitation.project_id
return
else
session[:invitation] = @invitation.token
redirect_to :controller => :account, :action => :register, :invitation_token => @invitation.token
end
}
end
end
def resend
@invitation = Invitation.find(params[:id])
respond_to do |format|
if @invitation.resend(params[:note])
logger.info { "1" }
format.js do
logger.info { "format" }
render :update do |page|
logger.info { "ID BABY #{@invitation.id}" }
page.visual_effect :highlight, "row-#{@invitation.id}", :duration => 3
page.replace "resend-#{@invitation.id}", "Resent!"
page.call '$.jGrowl', l(:notice_successful_update)
end
end
else
format.js do
render :update do |page|
page.parent.call '$.jGrowl', l(:error_general)
end
end
end
end
end
def destroy
@invitation = Invitation.find(params[:id])
@invitation.destroy
respond_to do |format|
format.js do
render :update do |page|
page.visual_effect :highlight, "row-#{@invitation.id}", :duration => 3
page.remove "row-#{@invitation.id}"
page.call '$.jGrowl', l(:notice_successful_delete)
end
end
end
end
private
def find_project
@project = Project.find(params[:project_id])
render_message l(:text_project_locked) if @project.locked?
rescue ActiveRecord::RecordNotFound
render_404
end
def valid_email?(email)
TMail::Address.parse(email)
return true
rescue
return false
end
end
================================================
FILE: app/controllers/issue_invitations_controller.rb
================================================
# BetterMeans - Work 2.0
# Copyright (C) 2006-2011 See readme for details and license#
class IssueInvitationsController < ApplicationController
def new
@quote = Quote.new
respond_to do |format|
format.html
format.xml { render :xml => @quote }
end
end
def create
@quote = Quote.new(params[:quote])
@quote.user_id = User.current.id
respond_to do |format|
flash.now[:success] = 'Invitation was successfully created and sent'
format.html { redirect_to(@quote) }
format.xml { render :xml => @quote, :status => :created, :location => @quote }
end
end
end
================================================
FILE: app/controllers/issue_relations_controller.rb
================================================
# Redmine - project management software
# Copyright (C) 2006-2011 See readme for details and license
#
class IssueRelationsController < ApplicationController
before_filter :find_project, :authorize
ssl_required :all
def new
@relation = IssueRelation.new(params[:relation])
@relation.issue_from = @issue
if params[:relation] && !params[:relation][:issue_to_id].blank?
@relation.issue_to = Issue.visible.find_by_id(params[:relation][:issue_to_id])
end
@relation.save if request.post?
respond_to do |format|
format.html { redirect_to :controller => 'issues', :action => 'show', :id => @issue }
format.js do
render :update do |page|
page.replace_html "relations", :partial => 'issues/relations'
if @relation.errors.empty?
page << "$('relation_delay').value = ''"
page << "$('relation_issue_to_id').value = ''"
end
end
end
end
end
def destroy
relation = IssueRelation.find(params[:id])
if request.post? && @issue.relations.include?(relation)
relation.destroy
@issue.reload
end
respond_to do |format|
format.html { redirect_to :controller => 'issues', :action => 'show', :id => @issue }
format.js { render(:update) {|page| page.replace_html "relations", :partial => 'issues/relations'} }
end
end
private
def find_project
@issue = Issue.find(params[:issue_id])
@project = @issue.project
rescue ActiveRecord::RecordNotFound
render_404
end
end
================================================
FILE: app/controllers/issue_statuses_controller.rb
================================================
# BetterMeans - Work 2.0
# Copyright (C) 2006-2011 See readme for details and license#
class IssueStatusesController < ApplicationController
layout 'admin'
before_filter :require_admin
ssl_required :all
verify :method => :post, :only => [ :destroy, :create, :update, :move ],
:redirect_to => { :action => :list }
def index
list
render :action => 'list' unless request.xhr?
end
def list
@issue_status_pages, @issue_statuses = paginate :issue_statuses, :per_page => 25, :order => "position"
render :action => "list", :layout => false if request.xhr?
end
def new
@issue_status = IssueStatus.new
end
def create
@issue_status = IssueStatus.new(params[:issue_status])
if @issue_status.save
flash.now[:success] = l(:notice_successful_create)
redirect_to :action => 'list'
else
render :action => 'new'
end
end
def edit
@issue_status = IssueStatus.find(params[:id])
end
def update
@issue_status = IssueStatus.find(params[:id])
if @issue_status.update_attributes(params[:issue_status])
flash.now[:success] = l(:notice_successful_update)
redirect_to :action => 'list'
else
render :action => 'edit'
end
end
def destroy
IssueStatus.find(params[:id]).destroy
redirect_to :action => 'list'
rescue
flash.now[:error] = "Unable to delete issue status"
redirect_to :action => 'list'
end
end
================================================
FILE: app/controllers/issue_votes_controller.rb
================================================
class IssueVotesController < ApplicationController
ssl_required :all
def index
@issue_votes = IssueVote.all
respond_to do |format|
format.html
format.xml { render :xml => @issue_votes }
end
end
def show
@issue_vote = IssueVote.find(params[:id])
respond_to do |format|
format.html
format.xml { render :xml => @issue_vote }
end
end
def new
@issue_vote = IssueVote.new
respond_to do |format|
format.html
format.xml { render :xml => @issue_vote }
end
end
def edit
@issue_vote = IssueVote.find(params[:id])
end
def create
@issue_vote = IssueVote.new(params[:issue_vote])
respond_to do |format|
if @issue_vote.save
flash.now[:success] = 'IssueVote was successfully created.'
format.html { redirect_to(@issue_vote) }
format.xml { render :xml => @issue_vote, :status => :created, :location => @issue_vote }
else
format.html { render :action => "new" }
format.xml { render :xml => @issue_vote.errors, :status => :unprocessable_entity }
end
end
end
def update
@issue_vote = IssueVote.find(params[:id])
respond_to do |format|
if @issue_vote.update_attributes(params[:issue_vote])
flash.now[:success] = 'IssueVote was successfully updated.'
format.html { redirect_to(@issue_vote) }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @issue_vote.errors, :status => :unprocessable_entity }
end
end
end
def destroy
@issue_vote = IssueVote.find(params[:id])
@issue_vote.destroy
respond_to do |format|
format.html { redirect_to(issue_votes_url) }
format.xml { head :ok }
end
end
end
================================================
FILE: app/controllers/issues_controller.rb
================================================
# BetterMeans - Work 2.0
# Copyright (C) 2006-2011 See readme for details and license#
class IssuesController < ApplicationController
menu_item :new_issue, :only => :new
default_search_scope :issues
ssl_required :all
# BUGBUG: :disagree and :reject don't seem to be used anymore
before_filter :find_issue, :only => [:show, :edit, :reply, :start, :finish, :release, :cancel, :restart, :prioritize, :agree, :disagree, :accept, :reject, :estimate, :join, :leave, :add_team_member, :remove_team_member, :move, :update_tags]
before_filter :find_issues, :only => [:bulk_edit, :move, :destroy]
before_filter :find_project, :only => [:new, :update_form, :preview]
before_filter :authorize, :except => [:index, :changes, :gantt, :calendar, :preview, :context_menu, :datadump, :temp]
before_filter :find_optional_project, :only => [:index, :changes, :gantt, :calendar]
accept_key_auth :index, :show, :changes
rescue_from Query::StatementInvalid, :with => :query_statement_invalid
helper :journals
helper :projects
include ProjectsHelper
helper :issue_relations
include IssueRelationsHelper
helper :watchers
include WatchersHelper
helper :attachments
include AttachmentsHelper
helper :queries
helper :sort
include SortHelper
include IssuesHelper
include Redmine::Export::PDF
verify :method => :post,
:only => :destroy,
:render => { :nothing => true, :status => :method_not_allowed}
log_activity_streams :current_user, :name, :added, :@issue, :subject, :new, :issues, {:object_description_method => :description}
log_activity_streams :current_user, :name, :finished, :@issue, :subject, :finish, :issues, {
:object_description_method => :description,
:indirect_object => :@journal,
:indirect_object_description_method => :notes,
:indirect_object_phrase => '' }
log_activity_streams :current_user, :name, :started, :@issue, :subject, :start, :issues, {:object_description_method => :description}
log_activity_streams :current_user, :name, :gave_up_on, :@issue, :subject, :release, :issues, {:object_description_method => :description}
log_activity_streams :current_user, :name, :canceled, :@issue, :subject, :cancel, :issues, {
:object_description_method => :description,
:indirect_object => :@journal,
:indirect_object_description_method => :notes,
:indirect_object_phrase => '' }
log_activity_streams :current_user, :name, :joined, :@issue, :subject, :join, :issues, {:object_description_method => :description}
log_activity_streams :current_user, :name, :left, :@issue, :subject, :leave, :issues, {:object_description_method => :description}
log_activity_streams :current_user, :name, :updated, :@issue, :subject, :edit, :issues,{
:object_description_method => :description,
:indirect_object => :@journal,
:indirect_object_description_method => :notes,
:indirect_object_phrase => 'GENERATEDETAILS' } #special value generates details for each property change
log_activity_streams :current_user, :name, :restarted, :@issue, :subject, :restart, :issues, {}
def index
retrieve_query
sort_init(@query.sort_criteria.empty? ? [['id', 'desc']] : @query.sort_criteria)
sort_update({'id' => "#{Issue.table_name}.id"}.merge(@query.available_columns.inject({}) {|h, c| h[c.name.to_s] = c.sortable; h}))
if @query.valid?
limit = per_page_option
respond_to do |format|
format.html { }
format.csv { limit = Setting.issues_export_limit.to_i }
format.pdf { limit = Setting.issues_export_limit.to_i }
end
@issue_count = @query.issue_count
@issue_pages = Paginator.new self, @issue_count, limit, params['page']
@issues = @query.issues(:include => [:assigned_to, :tracker],
:order => sort_clause,
:offset => @issue_pages.current.offset,
:limit => limit)
@issue_count_by_group = @query.issue_count_by_group
respond_to do |format|
format.html { render :template => 'issues/index.html.erb', :layout => !request.xhr? }
format.csv { send_data(issues_to_csv(@issues, @project), :type => 'text/csv; header=present', :filename => 'export.csv') }
format.pdf { send_data(issues_to_pdf(@issues, @project, @query), :type => 'application/pdf', :filename => 'export.pdf') }
end
else
# Send html if the query is not valid
render(:template => 'issues/index.html.erb', :layout => !request.xhr?)
end
rescue ActiveRecord::RecordNotFound
render_404
end
def show
@journals = @issue.journals.find(:all, :include => [:user, :details], :order => "#{Journal.table_name}.created_at ASC")
@journals.each_with_index {|j,i| j.indice = i+1}
@journals.reverse! if User.current.wants_comments_in_reverse_order?
@edit_allowed = true
@edit_allowed = @issue.editable? && User.current.allowed_to?(:edit_issues, @project)
respond_to do |format|
format.html { render :template => 'issues/show.html.erb', :layout => 'issue_blank' }
format.pdf { send_data(issue_to_pdf(@issue), :type => 'application/pdf', :filename => "#{@project.identifier}-#{@issue.id}.pdf") }
end
end
# Add a new issue
# The new issue will be created from an existing one if copy_from parameter is given
def new
@issue = Issue.new
@issue.copy_from(params[:copy_from]) if params[:copy_from]
@issue.project = @project
@issue.tracker ||= Tracker.find(params[:tracker_id] || :first || params[:issue][:tracker_id])
if @issue.tracker.nil?
render_error l(:error_no_tracker_in_project)
return
end
if params[:issue].is_a?(Hash)
@issue.attributes = params[:issue]
@issue.watcher_user_ids = params[:issue]['watcher_user_ids'] if User.current.allowed_to?(:add_issue_watchers, @project)
end
@issue.author = User.current
default_status = IssueStatus.default
unless default_status
render_error l(:error_no_default_issue_status)
return
end
@issue.status = default_status
@allowed_statuses = ([default_status] + default_status.find_new_statuses_allowed_to(User.current.roles_for_project(@project), @issue.tracker)).uniq
if request.get?
@issue.start_date ||= Date.today
else
if params[:issue].nil? || params[:issue][:status_id].nil?
requested_status = default_status
else
requested_status = IssueStatus.find_by_id(params[:issue][:status_id])
end
@issue.status = requested_status
@issue.tag_list = @issue.tags_copy if @issue.tags_copy
if @issue.save
Mention.parse(@issue, User.current.id)
attach_files_for_new_issue(@issue, params[:attachments])
#adding self-agree vote
@iv = IssueVote.create :issue_id => @issue.id, :user_id => User.current.id, :points => 1, :vote_type => IssueVote::AGREE_VOTE_TYPE
@issue.update_agree_total @iv.isbinding
#dealing with the estimate
if params[:estimate] && params[:estimate] != "" #-2 means that nothing was chosen
@iv = IssueVote.create :issue_id => @issue.id, :user_id => User.current.id, :points => params[:estimate].to_i, :vote_type => IssueVote::ESTIMATE_VOTE_TYPE
@issue.update_estimate_total @iv.isbinding
end
#dealing with prioritizing
if params[:prioritize] == "true"
@iv = IssueVote.create :issue_id => @issue.id, :user_id => User.current.id, :points => 1, :vote_type => IssueVote::PRI_VOTE_TYPE
@issue.update_pri_total @iv.isbinding
end
@issue.save if !@issue.update_status
@issue.reload
respond_to do |format|
format.js {render :json => @issue.to_dashboard}
format.html {redirect_to(params[:continue] ? { :action => 'new', :tracker_id => @issue.tracker } :
{ :action => 'show', :id => @issue })}
end
return
else
respond_to do |format|
format.js {render :text => nil}
format.html { render :action => "new" }
end
return
end
end
render :layout => !request.xhr?
end
# Attributes that can be updated on workflow transition (without :edit permission)
# TODO: make it configurable (at least per role)
UPDATABLE_ATTRS_ON_TRANSITION = %w(status_id assigned_to_id done_ratio) unless const_defined?(:UPDATABLE_ATTRS_ON_TRANSITION)
def edit
@allowed_statuses = @issue.new_statuses_allowed_to(User.current)
@edit_allowed = @issue.editable? && User.current.allowed_to?(:edit_issues, @project)
@notes = params[:notes]
@journal = @issue.init_journal(User.current, @notes)
# User can change issue attributes only if he has :edit permission or if a workflow transition is allowed
if (@edit_allowed || !@allowed_statuses.empty?) && params[:issue]
attrs = params[:issue].dup
attrs.delete_if {|k,v| !UPDATABLE_ATTRS_ON_TRANSITION.include?(k) } unless @edit_allowed
attrs.delete(:status_id) unless @allowed_statuses.detect {|s| s.id.to_s == attrs[:status_id].to_s}
@issue.attributes = attrs
end
if request.post?
attachments = attach_files(@issue, params[:attachments])
attachments.each {|a| @journal.details << JournalDetail.new(:property => 'attachment', :prop_key => a.id, :value => a.filename)}
if @issue.save
Mention.parse(@issue, User.current.id)
@issue.reload
respond_to do |format|
format.js {render :json => @issue.to_dashboard}
format.html {redirect_to(params[:back_to] || {:action => 'show', :id => @issue})}
end
end
end
rescue ActiveRecord::StaleObjectError
# Optimistic locking exception
flash.now[:error] = l(:notice_locking_conflict)
# Remove the previously added attachments if issue was not updated
attachments.each(&:destroy)
end
def start
@in_progress = Issue.count(:conditions => {:assigned_to_id => User.current.id, :status_id => IssueStatus.assigned.id, :project_id => @issue.project_id})
if @in_progress >= Setting::MAXIMUM_CONCURRENT_REQUESTS
render_error "Maximum issues owned by this user already"
return false;
else
IssueVote.create :user_id => User.current.id, :issue_id => params[:id], :vote_type => IssueVote::JOIN_VOTE_TYPE, :points => 1 #Joins as first person on the team
IssueVote.delete_all :issue_id => params[:id], :vote_type => IssueVote::ACCEPT_VOTE_TYPE
params[:issue] = {:status_id => IssueStatus.assigned.id, :assigned_to_id => User.current.id}
change_status
end
end
def finish
params[:issue] = {:status_id => IssueStatus.done.id}
@iv = IssueVote.create :user_id => User.current.id, :issue_id => @issue.id, :vote_type => IssueVote::ACCEPT_VOTE_TYPE, :points => 1 #adding accept vote for user who finished the issue
@issue.update_accept_total @iv.isbinding
@issue.clone_recurring if @issue.tracker.recurring?
@issue.set_points_from_hourly if @issue.is_hourly? #an hourly item is done, we set the
change_status
end
def release
if(@issue.is_hourly?)
params[:issue] = {:status_id => IssueStatus.newstatus.id, :assigned_to_id => ''}
else
#Deleting current user from issue
IssueVote.delete_all(["user_id = ? AND issue_id = ? AND vote_type = ?", User.current.id, params[:id], IssueVote::JOIN_VOTE_TYPE])
#Check to see if anybody else is on the issue, if they are assign the issue to them
next_team_member = @issue.team_members.first
if next_team_member.nil?
new_status_id = IssueStatus.open.id
params[:issue] = {:status_id => IssueStatus.open.id, :assigned_to_id => ''}
else
params[:issue] = {:assigned_to_id => next_team_member.id}
end
end
change_status
end
def cancel
params[:issue] = {:status_id => IssueStatus.canceled.id}
change_status
end
def restart
params[:issue] = {:status_id => IssueStatus.newstatus.id}
change_status
end
def change_status
@notes = params[:notes]
@journal = @issue.init_journal(User.current, @notes)
attrs = params[:issue].dup
@issue.attributes = attrs
if @issue.save
respond_to do |format|
@issue.reload
format.js {render :json => @issue.to_dashboard}
format.html {redirect_to(params[:back_to] || {:action => 'show', :id => @issue})}
end
end
rescue ActiveRecord::StaleObjectError
# Optimistic locking exception
flash.now[:error] = l(:notice_locking_conflict)
end
def prioritize
@iv = IssueVote.create :user_id => User.current.id, :issue_id => params[:id], :vote_type => IssueVote::PRI_VOTE_TYPE, :points => params[:points]
@issue.update_pri_total @iv.isbinding
@issue.save
@issue.reload
respond_to do |format|
format.js {render :json => @issue.to_dashboard}
format.html {redirect_to(params[:back_to] || {:action => 'show', :id => @issue})}
end
end
def update_tags
@issue.send_later(:update_tags,params[:tags])
respond_to do |format|
format.js {render :nothing => true}
format.html {redirect_to(params[:back_to] || {:action => 'show', :id => @issue})}
end
end
def estimate
if(@issue.is_hourly?)
render_error 'Can not estimate hourly items'
return false;
end
@journal = @issue.init_journal(User.current, params["notes"])
@iv = IssueVote.create :user_id => User.current.id, :issue_id => params[:id], :vote_type => IssueVote::ESTIMATE_VOTE_TYPE, :points => params[:points]
logger.info { "before update #{@issue.inspect}" }
@issue.update_estimate_total @iv.isbinding
logger.info { "after update #{@issue.inspect}" }
logger.info { "start saving" }
@issue.save if !@issue.update_status
logger.info { "done saving #{@issue.inspect}" }
@issue.reload
respond_to do |format|
format.js {render :json => @issue.to_dashboard}
format.html {redirect_to(params[:back_to] || {:action => 'show', :id => @issue})}
end
end
def agree
@iv = IssueVote.create :user_id => User.current.id, :issue_id => params[:id], :vote_type => IssueVote::AGREE_VOTE_TYPE, :points => params[:points]
journal = @issue.init_journal(User.current, params[:notes]) if params[:notes]
@issue.update_agree_total @iv.isbinding
@issue.save if !@issue.update_status
@issue.reload
if params[:notes]
action = :updated
logger.info { "action is #{params[:points]}" }
case params[:points]
when "-1"
action = "voted against"
when "-9999"
action = :blocked
end
LogActivityStreams.write_single_activity_stream(User.current,:name,@issue,:subject,action,:issues, 0, journal,{
:indirect_object_description_method => :notes,
:indirect_object_phrase => 'GENERATEDETAILS' })
end
respond_to do |format|
format.js {render :json => @issue.to_dashboard}
format.html {redirect_to(params[:back_to] || {:action => 'show', :id => @issue})}
end
end
def accept
@iv = IssueVote.create :user_id => User.current.id, :issue_id => params[:id], :vote_type => IssueVote::ACCEPT_VOTE_TYPE, :points => params[:points]
journal = @issue.init_journal(User.current, params[:notes]) if params[:notes]
@issue.update_accept_total @iv.isbinding
@issue.save if !@issue.update_status
@issue.reload
if params[:notes]
action = :updated
logger.info { "action is #{params[:points]}" }
case params[:points]
when "-1"
action = :rejected
when "-9999"
action = "blocked acceptance of"
end
LogActivityStreams.write_single_activity_stream(User.current,:name,@issue,:subject,action,:issues, 0, journal,{
:indirect_object_description_method => :notes,
:indirect_object_phrase => 'GENERATEDETAILS' })
end
respond_to do |format|
format.js {render :json => @issue.to_dashboard}
format.html {redirect_to(params[:back_to] || {:action => 'show', :id => @issue})}
end
end
def join
IssueVote.create :user_id => User.current.id, :issue_id => params[:id], :vote_type => IssueVote::JOIN_VOTE_TYPE, :points => 1
@issue.save
@issue.reload
Notification.create :recipient_id => @issue.assigned_to_id,
:variation => 'issue_joined',
:params => {:issue_id => @issue.id},
:sender_id => User.current.id,
:source_id => @issue.id,
:source_type => "Issue"
respond_to do |format|
format.js {render :json => @issue.to_dashboard}
format.html {redirect_to(params[:back_to] || {:action => 'show', :id => @issue})}
end
end
def add_team_member
IssueVote.create :user_id => params[:issue_vote][:user_id], :issue_id => params[:id], :vote_type => IssueVote::JOIN_VOTE_TYPE, :points => 1
@issue.save
@issue.reload
Notification.create :recipient_id => params[:issue_vote][:user_id],
:variation => 'issue_team_member_added',
:params => {:issue_id => @issue.id, :joiner_id => params[:issue_vote][:user_id]},
:sender_id => User.current.id,
:source_id => @issue.id,
:source_type => "Issue"
respond_to do |format|
format.js do
render :update do |page|
page.replace "joined_by_partial", :partial => 'issues/joined_by'
page.visual_effect :highlight, "joined_by_partial"
end
end
end
end
def remove_team_member
IssueVote.delete_all :user_id => params[:user_id], :issue_id => params[:id], :vote_type => IssueVote::JOIN_VOTE_TYPE
Notification.create :recipient_id => params[:user_id],
:variation => 'issue_team_member_removed',
:params => {:issue_id => @issue.id, :joiner_id => params[:user_id]},
:sender_id => User.current.id,
:source_id => @issue.id,
:source_type => "Issue"
respond_to do |format|
format.js do
render :update do |page|
page.replace "joined_by_partial", :partial => 'issues/joined_by'
page.visual_effect :highlight, "joined_by_partial"
end
end
end
end
def leave
IssueVote.delete_all(["user_id = ? AND issue_id = ? AND vote_type = ?", User.current.id, params[:id], IssueVote::JOIN_VOTE_TYPE])
@issue.save
@issue.reload
admin = User.sysadmin
Notification.create :recipient_id => @issue.assigned_to_id,
:variation => 'issue_left',
:params => {:issue => @issue, :joiner => User.current},
:sender_id => User.current.id,
:source_id => @issue.id,
:source_type => "Issue"
respond_to do |format|
format.js {render :json => @issue.to_dashboard}
format.html {redirect_to(params[:back_to] || {:action => 'show', :id => @issue})}
end
end
def reply
journal = Journal.find(params[:journal_id]) if params[:journal_id]
if journal
user = journal.user
text = journal.notes
else
user = @issue.author
text = @issue.description
end
content = "#{ll(Setting.default_language, :text_user_wrote, user)}\\n> "
content << text.to_s.strip.gsub(%r{<pre>((.|\s)*?)</pre>}m, '[...]').gsub('"', '\"').gsub(/(\r?\n|\r\n?)/, "\\n> ") + "\\n\\n"
render(:update) { |page|
page.<< "$('notes').value = \"#{content}\";"
page.show 'update'
page << "$('#notes').focus();"
page << "$('body').scrollTo('#update');"
}
end
# Bulk edit a set of issues
def bulk_edit
if request.post?
tracker = params[:tracker_id].blank? ? nil : @project.trackers.find_by_id(params[:tracker_id])
status = params[:status_id].blank? ? nil : IssueStatus.find_by_id(params[:status_id])
assigned_to = (params[:assigned_to_id].blank? || params[:assigned_to_id] == 'none') ? nil : User.find_by_id(params[:assigned_to_id])
unsaved_issue_ids = []
@issues.each do |issue|
journal = issue.init_journal(User.current, params[:notes])
issue.tracker = tracker if tracker
issue.assigned_to = assigned_to if assigned_to || params[:assigned_to_id] == 'none'
issue.start_date = params[:start_date] unless params[:start_date].blank?
issue.due_date = params[:due_date] unless params[:due_date].blank?
issue.done_ratio = params[:done_ratio] unless params[:done_ratio].blank?
# Don't save any change to the issue if the user is not authorized to apply the requested status
unless (status.nil? || (issue.new_statuses_allowed_to(User.current).include?(status) && issue.status = status)) && issue.save
# Keep unsaved issue ids to display them in flash error
unsaved_issue_ids << issue.id
end
end
if unsaved_issue_ids.empty?
flash.now[:success] = l(:notice_successful_update) unless @issues.empty?
else
flash.now[:error] = l(:notice_failed_to_save_issues, :count => unsaved_issue_ids.size,
:total => @issues.size,
:ids => '#' + unsaved_issue_ids.join(', #'))
end
redirect_to(params[:back_to] || {:controller => 'issues', :action => 'index', :project_id => @project})
return
end
@available_statuses = Workflow.available_statuses(@project)
end
def move
@copy = params[:copy_options] && params[:copy_options][:copy]
@allowed_projects = []
# find projects to which the user is allowed to move the issue
if User.current.admin?
# admin is allowed to move issues to any active (visible) project
@allowed_projects = Project.find(:all, :conditions => Project.visible_by(User.current))
else
@issue.project.root.self_and_descendants.each {|p| @allowed_projects << p if p.visible_to(User.current)}
end
@target_project = @allowed_projects.detect {|p| p.id.to_s == params[:new_project_id]} if params[:new_project_id]
@target_project ||= @project
@trackers = @target_project.trackers
@available_statuses = Workflow.available_statuses(@project)
if request.post?
new_tracker = params[:new_tracker_id].blank? ? nil : @target_project.trackers.find_by_id(params[:new_tracker_id])
unsaved_issue_ids = []
moved_issues = []
@issues.each do |issue|
changed_attributes = {}
[:assigned_to_id, :status_id, :start_date, :due_date].each do |valid_attribute|
unless params[valid_attribute].blank?
changed_attributes[valid_attribute] = (params[valid_attribute] == 'none' ? nil : params[valid_attribute])
end
end
issue.init_journal(User.current)
if r = issue.move_to(@target_project, new_tracker, {:copy => @copy, :attributes => changed_attributes})
LogActivityStreams.write_single_activity_stream(User.current,:name,issue,:subject,:moved,:move, 0, @target_project, {
:indirect_object_name_method => :name,
:indirect_object_description_method => :name,
:indirect_object_phrase => 'to ' })
moved_issues << r
else
unsaved_issue_ids << issue.id
end
end
@project.project.send_later :refresh_issue_count
if unsaved_issue_ids.empty?
else
flash.now[:error] = l(:notice_failed_to_save_issues, :count => unsaved_issue_ids.size,
:total => @issues.size,
:ids => '#' + unsaved_issue_ids.join(', #'))
end
if params[:follow]
if @issues.size == 1 && moved_issues.size == 1
redirect_to :controller => 'projects', :action => 'dashboard', :id => (@target_project || @project), :show_issue_id => moved_issues.first
else
redirect_to :controller => 'projects', :action => 'dashboard', :id => (@target_project || @project)
end
else
redirect_to :controller => 'projects', :action => 'dashboard', :id => @project
end
return
end
render :layout => false if request.xhr?
end
def destroy
@issues.each(&:destroy)
redirect_to :action => 'index', :project_id => @project
end
def gantt
@gantt = Redmine::Helpers::Gantt.new(params)
retrieve_query
if @query.valid?
events = []
# Issues that have start and due dates
events += @query.issues(:include => [:tracker, :assigned_to],
:order => "start_date, due_date",
:conditions => ["(((start_date>=? and start_date<=?) or (due_date>=? and due_date<=?) or (start_date<? and due_date>?)) and start_date is not null and due_date is not null)", @gantt.date_from, @gantt.date_to, @gantt.date_from, @gantt.date_to, @gantt.date_from, @gantt.date_to]
)
# Issues that don't have a due date but that are assigned to a version with a date
events += @query.issues(:include => [:tracker, :assigned_to],
:order => "start_date, effective_date",
:conditions => ["(((start_date>=? and start_date<=?) or (effective_date>=? and effective_date<=?) or (start_date<? and effective_date>?)) and start_date is not null and due_date is null and effective_date is not null)", @gantt.date_from, @gantt.date_to, @gantt.date_from, @gantt.date_to, @gantt.date_from, @gantt.date_to]
)
@gantt.events = events
end
basename = (@project ? "#{@project.identifier}-" : '') + 'gantt'
respond_to do |format|
format.html { render :template => "issues/gantt.html.erb", :layout => !request.xhr? }
format.png { send_data(@gantt.to_image, :disposition => 'inline', :type => 'image/png', :filename => "#{basename}.png") } if @gantt.respond_to?('to_image')
format.pdf { send_data(gantt_to_pdf(@gantt, @project), :type => 'application/pdf', :filename => "#{basename}.pdf") }
end
end
def calendar
if params[:year] and params[:year].to_i > 1900
@year = params[:year].to_i
if params[:month] and params[:month].to_i > 0 and params[:month].to_i < 13
@month = params[:month].to_i
end
end
@year ||= Date.today.year
@month ||= Date.today.month
@calendar = Redmine::Helpers::Calendar.new(Date.civil(@year, @month, 1), current_language, :month)
retrieve_query
if @query.valid?
events = []
events += @query.issues(:include => [:tracker, :assigned_to],
:conditions => ["((start_date BETWEEN ? AND ?) OR (due_date BETWEEN ? AND ?))", @calendar.startdt, @calendar.enddt, @calendar.startdt, @calendar.enddt]
)
@calendar.events = events
end
render :layout => false if request.xhr?
end
def context_menu
@issues = Issue.find_all_by_id(params[:ids], :include => :project)
if (@issues.size == 1)
@issue = @issues.first
@allowed_statuses = @issue.new_statuses_allowed_to(User.current)
end
projects = @issues.collect(&:project).compact.uniq
@project = projects.first if projects.size == 1
@can = {:edit => (@project && User.current.allowed_to?(:edit_issues, @project)),
:update => (@project && (User.current.allowed_to?(:edit_issues, @project) || (User.current.allowed_to?(:change_status, @project) && @allowed_statuses && !@allowed_statuses.empty?))),
:move => (@project && User.current.allowed_to?(:move_issues, @project)),
:copy => (@issue && @project.trackers.include?(@issue.tracker) && User.current.allowed_to?(:add_issues, @project)),
:delete => (@project && User.current.allowed_to?(:delete_issues, @project))
}
if @project
@assignables = @project.assignable_users
@assignables << @issue.assigned_to if @issue && @issue.assigned_to && !@assignables.include?(@issue.assigned_to)
@trackers = @project.trackers
end
@statuses = IssueStatus.find(:all, :order => 'position')
@back = params[:back_url] || request.env['HTTP_REFERER']
render :layout => false
end
def update_form
if params[:id].blank?
@issue = Issue.new
@issue.project = @project
else
@issue = @project.issues.visible.find(params[:id])
end
@issue.attributes = params[:issue]
@allowed_statuses = ([@issue.status] + @issue.status.find_new_statuses_allowed_to(User.current.roles_for_project(@project), @issue.tracker)).uniq
render :partial => 'attributes'
end
def preview
@issue = @project.issues.find_by_id(params[:id]) unless params[:id].blank?
@attachements = @issue.attachments if @issue
@text = params[:notes] || (params[:issue] ? params[:issue][:description] : nil)
render :partial => 'common/preview'
end
def datadump
@issues = Issue.find(:all, :conditions => "project_id IN (#{User.current.owned_projects.collect {|p| p.id}.join(",")})")
render :csv => @issues
end
private
def find_issue
@issue = Issue.find(params[:id], :include => [:project, :tracker, :status, :author])
@project = @issue.project
render_message l(:text_project_locked) if @project.locked?
render_404 if @issue.is_gift? && @issue.assigned_to_id == User.current.id
rescue ActiveRecord::RecordNotFound
render_404
end
# Filter for bulk operations
def find_issues
@issues = Issue.find_all_by_id(params[:id] || params[:ids])
raise ActiveRecord::RecordNotFound if @issues.empty?
projects = @issues.collect(&:project).compact.uniq
if projects.size == 1
@project = projects.first
else
# TODO: let users bulk edit/move/destroy issues from different projects
render_error 'Can not bulk edit/move/destroy issues from different projects'
return false
end
rescue ActiveRecord::RecordNotFound
render_404
end
def find_project
@project = Project.find(params[:project_id])
render_message l(:text_project_locked) if @project.locked?
rescue ActiveRecord::RecordNotFound
render_404
end
def find_optional_project
@project = Project.find(params[:project_id]) unless params[:project_id].blank?
allowed = User.current.allowed_to?({:controller => params[:controller], :action => params[:action]}, @project, :global => true)
allowed ? true : deny_access
rescue ActiveRecord::RecordNotFound
render_404
end
# Retrieve query from session or build a new query
def retrieve_query
if !params[:query_id].blank?
cond = "project_id IS NULL"
cond << " OR project_id = #{@project.id}" if @project
@query = Query.find(params[:query_id], :conditions => cond)
@query.project = @project
session[:query] = {:id => @query.id, :project_id => @query.project_id}
sort_clear
else
if params[:set_filter] || session[:query].nil? || session[:query][:project_id] != (@project ? @project.id : nil)
# Give it a name, required to be valid
@query = Query.new(:name => "_")
@query.project = @project
if params[:fields] and params[:fields].is_a? Array
params[:fields].each do |field|
@query.add_filter(field, params[:operators][field], params[:values][field])
end
else
@query.available_filters.keys.each do |field|
@query.add_short_filter(field, params[field]) if params[field]
end
end
@query.group_by = params[:group_by]
@query.column_names = params[:query] && params[:query][:column_names]
session[:query] = {:project_id => @query.project_id, :filters => @query.filters, :group_by => @query.group_by, :column_names => @query.column_names}
else
@query = Query.find_by_id(session[:query][:id]) if session[:query][:id]
@query ||= Query.new(:name => "_", :project => @project, :filters => session[:query][:filters], :group_by => session[:query][:group_by], :column_names => session[:query][:column_names])
@query.project = @project
end
end
end
# Rescues an invalid query statement. Just in case...
def query_statement_invalid(exception)
logger.error "Query::StatementInvalid: #{exception.message}" if logger
session.delete(:query)
sort_clear
render_error "An error occurred while executing the query and has been logged. Please report this error to your Redmine administrator."
end
end
================================================
FILE: app/controllers/journals_controller.rb
================================================
# BetterMeans - Work 2.0
# Copyright (C) 2006-2011 See readme for details and license
#
class JournalsController < ApplicationController
before_filter :find_journal
ssl_required :all
def edit
if request.post?
@journal.update_attributes(:notes => params[:notes]) if params[:notes]
if @journal.details.empty? && @journal.notes.blank?
@journal.destroy
else
update_activity_stream(params[:notes]) if params[:notes]
end
respond_to do |format|
format.html { redirect_to :controller => 'issues', :action => 'show', :id => @journal.journalized_id }
format.js { render :action => 'update' }
end
end
end
def edit_from_dashboard
if @journal.update_attributes(params[:journal])
update_activity_stream(params[:journal][:notes])
end
respond_to do |format|
format.js {render :json => @journal.issue.to_dashboard}
end
end
private
def update_activity_stream(notes)
ActivityStream.update_all(["indirect_object_description = ?", notes], {:indirect_object_id => @journal.id,
:indirect_object_type => "Journal",
:object_type => "Issue",
:actor_id => User.current.id},
:order => 'created_at DESC', :limit => 1)
end
def find_journal
@journal = Journal.find(params[:id])
(render_403; return false) unless @journal.editable_by?(User.current)
@project = @journal.journalized.project
rescue ActiveRecord::RecordNotFound
render_404
end
end
================================================
FILE: app/controllers/mail_handler_controller.rb
================================================
# BetterMeans - Work 2.0
# Copyright (C) 2006-2011 See readme for details and license
#
class MailHandlerController < ActionController::Base
before_filter :check_credential
verify :method => :post,
:only => :index,
:render => { :nothing => true, :status => 405 }
# Submits an incoming email to MailHandler
def index
options = params.dup
email = options.delete(:email)
if MailHandler.receive(email, options)
render :nothing => true, :status => :created
else
render :nothing => true, :status => :unprocessable_entity
end
end
# Submits an incoming email from sendgrid to MailHandler
def sendgrid
@email = TMail::Mail.new
@email.subject = params[:subject]
@email.body = params[:text].to_s.gsub(/"/,'\"')
@email.to = params[:to]
@email.from = params[:from]
@email.subject = params[:subject]
logger.info { "email coming up" }
logger.info(@email.inspect)
# attachments - Number of attachments included in email
# *
# attachment1, attachment2, …, attachmentN - File upload names. The numbers are sequence numbers starting from 1 and ending on the number specified by the attachments parameter. If attachments is 0, there will be no attachment files. If attachments is 3, parameters attachment1, attachment2, and attachment3 will have file uploads.
if MailHandler.receive_from_api(@email)
render :nothing => true, :status => :created
else
render :nothing => true, :status => :unprocessable_entity
end
end
private
def check_credential
User.current = nil
unless Setting.mail_handler_api_enabled? && params[:key].to_s == Setting.mail_handler_api_key
render :text => 'Access denied. Incoming emails WS is disabled or key is invalid.', :status => 403
end
end
end
================================================
FILE: app/controllers/mails_controller.rb
================================================
class MailsController < ApplicationController
before_filter :set_user
def index
if params[:mailbox] == "sent"
@mails = @user.sent_messages
else
@mails = @user.received_messages
end
end
def show
@mail = Mail.read_and_get(params[:id], User.current)
end
def new
@mail = Mail.new
if params[:reply_to]
@reply_to = @user.received_messages.find(params[:reply_to])
unless @reply_to.nil?
@mail.to = @reply_to.sender.login
@mail.subject = "Re: #{@reply_to.subject}"
@mail.body = "\n\n*Original message*\n\n #{@reply_to.body}"
end
end
end
def create
@mail = Mail.new(params[:mail])
@mail.sender = @user
@mail.recipient = User.find_by_login(params[:mail][:to])
if @mail.save
flash.now[:success] = "Message sent"
redirect_to user_mails_path(@user)
else
render :action => :new
end
end
def delete_selected
if request.post?
if params[:delete]
params[:delete].each { |id|
@mail = Mail.find(:first, :conditions => ["mails.id = ? AND (sender_id = ? OR recipient_id = ?)", id, @user, @user])
@mail.mark_deleted(@user) unless @mail.nil?
}
flash.now[:success] = "Messages deleted"
end
redirect_to user_mail_path(@user, @mails)
end
end
private
def set_user
@user = User.current
end
end
================================================
FILE: app/controllers/members_controller.rb
================================================
# BetterMeans - Work 2.0
# Copyright (C) 2006-2011 See readme for details and license#
class MembersController < ApplicationController
before_filter :find_member, :except => [:new, :autocomplete_for_member]
before_filter :find_project, :only => [:new, :autocomplete_for_member]
before_filter :authorize
ssl_required :all
def new
members = []
if params[:member] && request.post?
attrs = params[:member].dup
if (user_ids = attrs.delete(:user_ids))
user_ids.each do |user_id|
members << Member.new(attrs.merge(:user_id => user_id))
end
else
members << Member.new(attrs)
end
result = @project.all_members << members
end
respond_to do |format|
format.html { redirect_to :controller => 'projects', :action => 'settings', :tab => 'members', :id => @project }
format.js {
render(:update) {|page|
page.replace_html "tab-content-members", :partial => 'projects/settings/members'
members.each {|member| page.visual_effect(:highlight, "member-#{member.id}") }
}
}
end
end
def edit
if request.post? and @member.update_attributes(params[:member])
respond_to do |format|
format.html { redirect_to :controller => 'projects', :action => 'settings', :tab => 'members', :id => @project }
format.js {
render(:update) {|page|
page.replace_html "tab-content-members", :partial => 'projects/settings/members'
page.visual_effect(:highlight, "member-#{@member.id}")
}
}
end
end
end
def destroy
if request.post? && @member.deletable?
@member.destroy
end
respond_to do |format|
format.html { redirect_to :controller => 'projects', :action => 'settings', :tab => 'members', :id => @project }
format.js { render(:update) {|page| page.replace_html "tab-content-members", :partial => 'projects/settings/members'} }
end
end
def autocomplete_for_member
@users = User.active.like(params[:q]).find(:all, :limit => 100) - @project.users
render :layout => false
end
private
def find_project
@project = Project.find(params[:id])
rescue ActiveRecord::RecordNotFound
render_404
end
def find_member
@member = Member.find(params[:id])
@project = @member.project
rescue ActiveRecord::RecordNotFound
render_404
end
end
================================================
FILE: app/controllers/messages_controller.rb
================================================
# BetterMeans - Work 2.0
# Copyright (C) 2006-2011 See readme for details and license#
class MessagesController < ApplicationController
menu_item :boards
default_search_scope :messages
before_filter :find_board, :only => [:new, :preview]
before_filter :find_message, :except => [:new, :preview, :motion_reply]
before_filter :authorize, :except => [:preview, :edit, :destroy]
ssl_required :all
verify :method => :post, :only => [ :reply, :destroy ], :redirect_to => { :action => :show }
verify :xhr => true, :only => :quote
helper :watchers
helper :attachments
include AttachmentsHelper
log_activity_streams :current_user, :name, :created, :@message, :subject, :new, :messages, {:object_description_method => :content}
log_activity_streams :current_user, :name, :edited, :@message, :subject, :edit, :messages, {:object_description_method => :content}
log_activity_streams :current_user, :name, :replied_to, :@topic, :subject, :reply, :messages, {
:object_description_method => :content,
:indirect_object => :@reply,
:indirect_object_description_method => :content,
:indirect_object_phrase => '' }
# Show a topic and its replies
def show
@replies = @topic.children.find(:all, :include => [:author, :attachments, {:board => :project}])
@replies.reverse! if User.current.wants_comments_in_reverse_order?
@reply = Message.new(:subject => "RE: #{@message.subject}")
render :action => "show", :layout => false if request.xhr?
end
# Create a new topic
def new
@message = Message.new(params[:message])
@message.author = User.current
@message.board = @board
if params[:message] && User.current.allowed_to?(:edit_messages, @project)
@message.locked = params[:message]['locked']
@message.sticky = params[:message]['sticky']
end
if request.post? && @message.save
attach_files(@message, params[:attachments])
redirect_to :action => 'show', :id => @message
end
end
# Reply to a topic
def reply
@reply = Message.new(params[:reply])
@reply.subject = @message.subject if @reply.subject == ""
@reply.author = User.current
@reply.board = @board
@topic.children << @reply
if !@reply.new_record?
attach_files(@reply, params[:attachments])
end
respond_to do |wants|
wants.html { redirect_to :action => 'show', :id => @topic }
wants.js { render :nothing => :true}
end
end
# Edit a message
def edit
(render_403; return false) unless @message.editable_by?(User.current)
if params[:message]
@message.locked = params[:message]['locked']
@message.sticky = params[:message]['sticky']
end
if request.post? && @message.update_attributes(params[:message])
attach_files(@message, params[:attachments])
flash.now[:success] = l(:notice_successful_update)
@message.reload
redirect_to :action => 'show', :board_id => @message.board, :id => @message.root
end
end
# Delete a messages
def destroy
(render_403; return false) unless @message.destroyable_by?(User.current)
@message.destroy
redirect_to @message.parent.nil? ?
{ :controller => 'boards', :action => 'show', :project_id => @project, :id => @board } :
{ :action => 'show', :id => @message.parent }
end
def quote
user = @message.author
text = @message.content
subject = @message.subject.gsub('"', '\"')
subject = "RE: #{subject}" unless subject.starts_with?('RE:')
content = "#{ll(Setting.default_language, :text_user_wrote, user)}\\n> "
content << text.to_s.strip.gsub(%r{<pre>((.|\s)*?)</pre>}m, '[...]').gsub('"', '\"').gsub(/(\r?\n|\r\n?)/, "\\n> ") + "\\n\\n"
render(:update) { |page|
page << "$('reply_subject').value = \"#{subject}\";"
page.<< "$('message_content').value = \"#{content}\";"
page.show 'reply'
page << "$('#message_content').focus();"
page << "$('body').scrollTo('#reply');"
}
end
def preview
message = @board.messages.find_by_id(params[:id])
@attachements = message.attachments if message
@text = (params[:message] || params[:reply])[:content]
render :partial => 'common/preview'
end
private
def find_message
if params[:board_id] == 'guess'
logger.info { "guessing board" }
guess_board
else
find_board
@message = @board.messages.find(params[:id], :include => :parent)
end
@topic = @message.root unless @message.nil?
rescue ActiveRecord::RecordNotFound
render_404
end
#This function is used to redirect links coming from the activity stream
#To save queries on the database, we don't try to load the board id in the link to a message
def guess_board
@message = Message.find(params[:id], :include => :parent)
@board = @message.board
@project = @board.project
logger.info { "guessed board #{@board.inspect}" }
rescue ActiveRecord::RecordNotFound
render_404
end
def find_board
@board = Board.find(params[:board_id], :include => :project)
@project = @board.project
rescue ActiveRecord::RecordNotFound
render_404
end
end
================================================
FILE: app/controllers/motion_votes_controller.rb
================================================
class MotionVotesController < ApplicationController
ssl_required :all
def index
@motion_votes = MotionVote.all
respond_to do |format|
format.html
format.xml { render :xml => @motion_votes }
end
end
def show
@motion_vote = MotionVote.find(params[:id])
respond_to do |format|
format.html
format.xml { render :xml => @motion_vote }
end
end
def new
@motion_vote = MotionVote.new
respond_to do |format|
format.html
format.xml { render :xml => @motion_vote }
end
end
def edit
@motion_vote = MotionVote.find(params[:id])
end
def create
@motion_vote = MotionVote.new(params[:motion_vote])
@motion_vote.motion_id = params[:motion_id]
@motion_vote.user_id = User.current.id
if @motion_vote.motion.motion_type == Motion::TYPE_SHARE
sum = @motion_vote.user.shares.for_project(@motion_vote.motion.project_id).sum(:amount).to_i
@motion_vote.points = params[:points].to_i * sum
else
@motion_vote.points = params[:points]
end
respond_to do |format|
if @motion_vote.save
format.js { render :action => "cast_vote", :motion => @motion_vote.motion}
else
format.js { render :action => "error"}
format.html { render :action => "new" }
format.xml { render :xml => @motion_vote.errors, :status => :unprocessable_entity }
end
end
end
def update
@motion_vote = MotionVote.find(params[:id])
respond_to do |format|
if @motion_vote.update_attributes(params[:motion_vote])
flash.now[:success] = 'MotionVote was successfully updated.'
format.html { redirect_to(@motion_vote) }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @motion_vote.errors, :status => :unprocessable_entity }
end
end
end
def destroy
@motion_vote = MotionVote.find(params[:id])
@motion_vote.destroy
respond_to do |format|
format.html { redirect_to(motion_votes_url) }
format.xml { head :ok }
end
end
end
================================================
FILE: app/controllers/motions_controller.rb
================================================
class MotionsController < ApplicationController
before_filter :find_project, :only => [:new,:index,:create,:show, :edit, :eligible_users]
before_filter :find_motion, :only => [:show, :edit, :destroy, :update, :reply]
before_filter :check_visibility_permission, :only => [:show]
before_filter :require_admin, :only => [:edit, :update, :destroy]
before_filter :authorize, :except => [:check_visibility_permission]
ssl_required :all
def index
@motions = @project.motions
respond_to do |format|
format.html
format.xml { render :xml => @motions }
end
end
def show
if @motion.concerned_user_id == User.current.id
render_403
return false
end
@motion.create_forum_topic if @motion.topic.nil?
@topic = @motion.topic
@board = @topic.board
@replies = @topic.children.find(:all, :include => [:author, :attachments, {:board => :project}])
@replies.reverse! if User.current.wants_comments_in_reverse_order?
@reply = Message.new(:subject => "RE: #{@topic.subject}")
respond_to do |format|
format.html
format.xml { render :xml => @motion }
end
end
def new
@motion = Motion.new(params[:motion])
@concerned_user_list = Motion.eligible_users(@motion.variation, @project.id)
respond_to do |format|
format.html
format.xml { render :xml => @motion }
end
end
def eligible_users
@concerned_user_list = ""
@variation = params[:variation].to_i
case @variation
when Motion::VARIATION_NEW_MEMBER
@concerned_user_list = @project.contributor_list
when Motion::VARIATION_NEW_CORE
@concerned_user_list = @project.member_list
when Motion::VARIATION_FIRE_MEMBER
@concerned_user_list = @project.member_list
when Motion::VARIATION_FIRE_CORE
@concerned_user_list = @project.core_member_list
end
@concerned_user_list = [] if @concerned_user_list == ""
#remove current user from list
@concerned_user_list.delete_if {|a| a.user_id == User.current.id}
render :layout => false
end
def edit
end
def create
@motion = Motion.new(params[:motion])
@motion.project_id = @project.id
@motion.author_id = User.current.id
@motion.params = params[:param]
respond_to do |format|
if @motion.concerned_user == User.current
format.html { redirect_with_flash :error, 'Cannot create a motion concerning yourself', :action => 'index' }
format.xml { render :xml => @motion.errors, :status => :unprocessable_entity }
elsif !@motion.concerned_user && @motion.concerns_someone?
format.html { redirect_with_flash :error, 'Who does this motion apply to? You need to select the user that this motion is concerned with.', :action => 'index' }
format.xml { render :xml => @motion.errors, :status => :unprocessable_entity }
elsif @motion.save
format.html { redirect_with_flash :success, 'Motion was successfully created', :action => "show", :id => @motion }
format.xml { render :xml => @motion, :status => :created, :location => @motion }
else
format.html { render :action => "new" }
format.xml { render :xml => @motion.errors, :status => :unprocessable_entity }
end
end
end
def update
respond_to do |format|
if @motion.update_attributes(params[:motion])
flash.now[:success] = 'Motion was successfully updated.'
format.html { redirect_to(@motion) }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @motion.errors, :status => :unprocessable_entity }
end
end
end
def destroy
@motion.destroy
respond_to do |format|
format.html { redirect_to(motions_url) }
format.xml { head :ok }
end
end
# Reply to a motion discussion
def reply
@topic = @motion.topic
@reply = Message.new(params[:reply])
@reply.author = User.current
@reply.board = @topic.board
@topic.children << @reply
if !@reply.new_record?
attach_files(@reply, params[:attachments])
end
redirect_to :action => 'show', :id => @motion, :project_id => @motion.project_id
rescue
404
end
private
def find_project
@project = Project.find(params[:project_id]).root
render_message l(:text_project_locked) if @project.locked?
rescue ActiveRecord::RecordNotFound
render_404
end
def find_motion
@motion = Motion.find(params[:id])
@project = @motion.project
render_message l(:text_project_locked) if @project.locked?
rescue ActiveRecord::RecordNotFound
render_404
end
def check_visibility_permission
if !User.current.allowed_to_see_motion?(@motion)
render_403
return false
end
return true
end
end
================================================
FILE: app/controllers/my_controller.rb
================================================
# Redmine - project management software
# Copyright (C) 2006-2011 See readme for details and license#
class MyController < ApplicationController
before_filter :require_login
ssl_required :all
helper :issues
BLOCKS = { 'issuesassignedtome' => :label_assigned_to_me_issues,
'issuesreportedbyme' => :label_reported_issues,
'issueswatched' => :label_watched_issues,
'news' => :label_news_latest,
'calendar' => :label_calendar,
'documents' => :label_document_plural
}.merge(Redmine::Views::MyPage::Block.additional_blocks).freeze
DEFAULT_LAYOUT = { 'left' => ['issuesassignedtome'],
'right' => ['issuesreportedbyme']
}.freeze
verify :xhr => true,
:only => [:add_block, :remove_block, :order_blocks]
def index
page
render :action => 'page'
end
# Show user's page
def page
@user = User.current
@blocks = @user.pref[:my_page_layout] || DEFAULT_LAYOUT
end
def projects
project_ids = User.current.projects.collect{|p| p.id}.join(",")
@all_projects = project_ids.any? ? Project.find(:all, :conditions => "(parent_id in (#{project_ids}) OR id in (#{project_ids})) AND (status=#{Project::STATUS_ACTIVE})") : []
@my_projects = User.current.owned_projects
@belong_to_projects = User.current.belongs_to_projects
@active_projects = User.current.active_memberships.collect(&:project)
end
def issues
@assigned_issues = Issue.visible.open.find(:all,
:conditions => {:assigned_to_id => User.current.id},
:include => [:project, :tracker ],
:order => "#{Issue.table_name}.subject ASC")
@watched_issues = Issue.visible.find(:all,
:include => [:project, :tracker, :watchers],
:conditions => ["#{Watcher.table_name}.user_id = ?", User.current.id],
:order => "#{Issue.table_name}.subject ASC")
@joined_issues = Issue.visible.find(:all,
:include => [:project, :tracker, :issue_votes],
:conditions => ["#{IssueVote.table_name}.user_id = ? AND #{IssueVote.table_name}.vote_type = ? AND #{Issue.table_name}.assigned_to_id != ? AND #{Issue.table_name}.status_id = ?", User.current.id, IssueVote::JOIN_VOTE_TYPE, User.current.id, IssueStatus.assigned.id],
:order => "#{Issue.table_name}.subject ASC")
@added_issues = Issue.visible.open.find(:all,
:conditions => {:author_id => User.current.id},
:include => [:project, :tracker ],
:order => "#{Issue.table_name}.created_at DESC")
@recent_issues = User.current.recent_items(30)
end
# Edit user's account
def account
@user = User.current
@pref = @user.pref
if request.post?
cc = params[:user][:b_cc_last_four]
if cc && cc.length > 14
cc.gsub!(/[^0-9]/,'')
params[:user][:b_cc_last_four] = ("XXXX-") + params[:user][:b_cc_last_four][cc.length-4,cc.length-1] if cc.length > 14
end
@user.attributes = params[:user]
@user.login = params[:user][:login]
logger.info { "@user.attributes #{@user.attributes.inspect}" }
@user.mail_notification = (params[:notification_option] == 'all')
logger.info { "params[:pref] #{params[:pref].inspect}" }
@user.pref.attributes = params[:pref]
logger.info { "@user.pref.attributes #{@user.pref.inspect}" }
logger.info { "params[:active_only_jumps] #{params[:active_only_jumps]} and boolean #{params[:active_only_jumps] == '1'}" }
@user.pref[:no_self_notified] = (params[:no_self_notified] == '1')
@user.pref[:daily_digest] = (params[:daily_digest] == '1')
@user.pref[:no_emails] = (params[:no_emails] == '1')
@user.pref[:hide_mail] = (params[:pref][:hide_mail] == '1')
@user.pref[:active_only_jumps] = (params[:pref][:active_only_jumps] == '1')
logger.info { "user pref #{@user.pref.inspect}" }
if @user.save
@user.pref.save
@user.reload
@user.save_billing cc, params[:ccverify], request.remote_ip
@user.notified_project_ids = (params[:notification_option] == 'selected' ? params[:notified_project_ids] : [])
set_language_if_valid @user.language
redirect_with_flash :notice, l(:notice_account_updated), :action => 'account'
return
end
end
@notification_options = [[l(:label_user_mail_option_all), 'all'],
[l(:label_user_mail_option_none), 'none']]
@notification_option = @user.mail_notification? ? 'all' : (@user.notified_projects_ids.empty? ? 'none' : 'selected')
end
def upgrade
@user = User.current
@plans = Plan.all
@selected_plan = @user.plan
if request.post?
cc = params[:user][:b_cc_last_four]
cc.gsub!(/[^0-9]/,'')
logger.info { "length #{cc.length} #{cc}" }
if cc.length > 14
params[:user][:b_cc_last_four] = ("XXXX-") + params[:user][:b_cc_last_four][cc.length-4,cc.length-1]
else
params[:user].delete :b_cc_last_four
end
logger.info { "inspect #{params.inspect}" }
@new_plan = Plan.find(params[:user][:plan_id])
@user.attributes = params[:user]
@user.plan_id = @user.plan.id #not upgrading yet
account = User.update_recurly_billing @user.id, cc, params[:ccverify], request.remote_ip
@user.save
if defined? account.billing_info && defined? account.billing_info.errors
if account.billing_info.errors.length > 0
flash.now[:error] = account.billing_info.errors[:base].collect {|v| "#{v}"}.join('<br>')
return
end
end
if @new_plan.code == Plan::FREE_CODE && @new_plan.code != @selected_plan.code
begin
sub = Recurly::Subscription.find(@user.id.to_s)
sub.cancel(@user.id.to_s)
rescue Exception => e
flash.now[:error] = e.message
return
else
@user.trial_expires_on = nil
@user.trial_expired_at = nil
@user.plan_id = @new_plan.id
@user.save
@user.update_usage_over
@user.update_trial_expiration
@user.lock_workstreams
flash.now[:success] = "Your plan was successfully canceled"
@user.reload
return
end
elsif @new_plan.code != @selected_plan.code
begin
sub = Recurly::Subscription.find(@user.id.to_s)
begin
sub.change('now', :plan_code => @new_plan.code, :quantity => 1)
rescue Exception => e
flash.now[:error] = e.message
@user.reload
return
end
rescue ActiveResource::ResourceNotFound
begin
trial_expiration = @user.trial_expires_on || -1.days.from_now
logger.info { "trial #{trial_expiration}" }
sub = Recurly::Subscription.create(
:account_code => account.account_code,
:plan_code => @new_plan.code,
:quantity => 1,
:account => account
)
rescue Exception => e
flash.now[:error] = e.message
@user.reload
return
end
else
@user.trial_expires_on = nil
@user.trial_expired_at = nil
end
if sub.errors && sub.errors.any?
flash.now[:error] = sub.errors.collect {|k, v| "#{v}"}.join('<br>')
@user.reload
return
else
@user.plan_id = @new_plan.id
@user.save
@user.update_usage_over
@user.update_trial_expiration
@user.unlock_workstreams
flash.now[:success] = "Plan successfully changed to #{@new_plan.name}"
end
else
flash.now[:success] = l(:notice_account_updated) + " No changes were made to your plan"
end
@user.reload
return
end
end
# Manage user's password
def password
@user = User.current
if @user.auth_source_id
flash.now[:error] = l(:notice_can_t_change_password)
redirect_to :action => 'account'
return
end
if request.post?
if @user.check_password?(params[:password])
@user.password, @user.password_confirmation = params[:new_password], params[:new_password_confirmation]
if @user.save
flash.now[:success] = l(:notice_account_password_updated)
redirect_to :action => 'account'
end
else
flash.now[:error] = l(:notice_account_wrong_password)
end
end
end
# Create a new feeds key
def reset_rss_key
if request.post?
if User.current.rss_token
User.current.rss_token.destroy
User.current.reload
end
User.current.rss_key
flash.now[:success] = l(:notice_feeds_access_key_reseted)
end
redirect_to :action => 'account'
end
# Create a new API key
def reset_api_key
if request.post?
if User.current.api_token
User.current.api_token.destroy
User.current.reload
end
User.current.api_key
flash.now[:success] = l(:notice_api_access_key_reseted)
end
redirect_to :action => 'account'
end
# User's page layout configuration
def page_layout
@user = User.current
@blocks = @user.pref[:my_page_layout] || DEFAULT_LAYOUT.dup
@block_options = []
BLOCKS.each {|k, v| @block_options << [l("my.blocks.#{v}", :default => [v, v.to_s.humanize]), k.dasherize]}
end
# Add a block to user's page
# The block is added on top of the page
# params[:block] : id of the block to add
def add_block
block = params[:block].to_s.underscore
(render :nothing => true; return) unless block && (BLOCKS.keys.include? block)
@user = User.current
layout = @user.pref[:my_page_layout] || {}
# remove if already present in a group
%w(top left right).each {|f| (layout[f] ||= []).delete block }
# add it on top
layout['top'].unshift block
@user.pref[:my_page_layout] = layout
@user.pref.save
render :partial => "block", :locals => {:user => @user, :block_name => block}
end
# Remove a block to user's page
# params[:block] : id of the block to remove
def remove_block
block = params[:block].to_s.underscore
@user = User.current
# remove block in all groups
layout = @user.pref[:my_page_layout] || {}
%w(top left right).each {|f| (layout[f] ||= []).delete block }
@user.pref[:my_page_layout] = layout
@user.pref.save
render :nothing => true
end
# Change blocks order on user's page
# params[:group] : group to order (top, left or right)
# params[:list-(top|left|right)] : array of block ids of the group
def order_blocks
group = params[:group]
@user = User.current
if group.is_a?(String)
group_items = (params["list-#{group}"] || []).collect(&:underscore)
if group_items and group_items.is_a? Array
layout = @user.pref[:my_page_layout] || {}
# remove group blocks if they are presents in other groups
%w(top left right).each {|f|
layout[f] = (layout[f] || []) - group_items
}
layout[group] = group_items
@user.pref[:my_page_layout] = layout
@user.pref.save
end
end
render :nothing => true
end
end
================================================
FILE: app/controllers/news_controller.rb
================================================
# BetterMeans - Work 2.0
# Copyright (C) 2006-2011 See readme for details and license#
class NewsController < ApplicationController
default_search_scope :news
before_filter :find_news, :except => [:new, :index, :preview]
before_filter :find_project, :only => [:new, :preview]
before_filter :authorize, :except => [:index, :preview]
before_filter :find_optional_project, :only => :index
accept_key_auth :index
ssl_required :all
log_activity_streams :current_user, :name, :announced, :@news, :title, :new, :news, {:object_description_method => :summary}
log_activity_streams :current_user, :name, :edited, :@news, :title, :edit, :news, {:object_description_method => :summary}
log_activity_streams :current_user, :name, :commented_on, :@news, :title, :add_comment, :news, {
:object_description_method => :summary,
:indirect_object => :@comment,
:indirect_object_description_method => :comments,
:indirect_object_phrase => '' }
def index
@news_pages, @newss = paginate :news,
:per_page => 10,
:conditions => Project.allowed_to_condition(User.current, :view_news, :project => @project),
:include => [:author, :project],
:order => "#{News.table_name}.created_at DESC"
respond_to do |format|
format.html { render :layout => false if request.xhr? }
format.xml { render :xml => @newss.to_xml }
format.json { render :json => @newss.to_json }
end
end
def show
@comments = @news.comments
@comments.reverse! if User.current.wants_comments_in_reverse_order?
end
def new
@news = News.new(:project => @project, :author => User.current)
if request.post?
@news.attributes = params[:news]
if @news.save
flash.now[:success] = l(:notice_successful_create)
redirect_to :controller => 'news', :action => 'index', :project_id => @project
end
end
end
def edit
if request.post? and @news.update_attributes(params[:news])
flash.now[:success] = l(:notice_successful_update)
redirect_to :action => 'show', :id => @news
end
end
def add_comment
@comment = Comment.new(params[:comment])
@comment.author = User.current
if @news.comments << @comment
flash.now[:success] = l(:label_comment_added)
redirect_to :action => 'show', :id => @news
else
show
render :action => 'show'
end
end
def destroy_comment
@news.comments.find(params[:comment_id]).destroy
redirect_to :action => 'show', :id => @news
end
def destroy
@news.destroy
redirect_to :action => 'index', :project_id => @project
end
def preview
@text = (params[:news] ? params[:news][:description] : nil)
render :partial => 'common/preview'
end
private
def find_news
@news = News.find(params[:id])
@project = @news.project
render_message l(:text_project_locked) if @project.locked?
rescue ActiveRecord::RecordNotFound
render_404
end
def find_project
@project = Project.find(params[:project_id])
render_message l(:text_project_locked) if @project.locked?
rescue ActiveRecord::RecordNotFound
render_404
end
def find_optional_project
return true unless params[:project_id]
@project = Project.find(params[:project_id])
render_message l(:text_project_locked) if @project.locked?
authorize
rescue ActiveRecord::RecordNotFound
render_404
end
end
================================================
FILE: app/controllers/notifications_controller.rb
================================================
class NotificationsController < ApplicationController
ssl_required :all
def index
@notifications = Notification.unresponded
@mentions = @notifications.select {|n| n.mention?}
@notifications = @notifications.select {|n| !n.mention?}
respond_to do |format|
format.html
format.xml { render :xml => @notifications }
end
end
def show
@notification = Notification.find(params[:id])
respond_to do |format|
format.html
format.xml { render :xml => @notification }
end
end
def new
@notification = Notification.new
respond_to do |format|
format.html
format.xml { render :xml => @notification }
end
end
def edit
@notification = Notification.find(params[:id])
end
def create
@notification = Notification.new(params[:notification])
respond_to do |format|
if @notification.save
flash.now[:success] = 'Notification was successfully created.'
format.html { redirect_to(@notification) }
format.xml { render :xml => @notification, :status => :created, :location => @notification }
else
format.html { render :action => "new" }
format.xml { render :xml => @notification.errors, :status => :unprocessable_entity }
end
end
end
def update
@notification = Notification.find(params[:id])
respond_to do |format|
if @notification.update_attributes(params[:notification])
format.html { redirect_to(@notification) }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @notification.errors, :status => :unprocessable_entity }
end
end
end
def hide
@notification = Notification.find(params[:notification_id])
respond_to do |format|
if @notification.mark_as_responded
format.js {render :action => "hide"}
format.xml { head :ok }
else
flash.now[:success] = 'Error ignoring notification'
format.js {render :action => "error"}
format.xml { render :xml => @notification.errors, :status => :unprocessable_entity }
end
end
end
def destroy
@notification = Notification.find(params[:id])
@notification.destroy
respond_to do |format|
format.html { redirect_to(notifications_url) }
format.xml { head :ok }
end
end
end
================================================
FILE: app/controllers/projects_controller.rb
================================================
# BetterMeans - Work 2.0
# Copyright (C) 2006-2011 See readme for details and license#
class ProjectsController < ApplicationController
menu_item :overview
menu_item :activity, :only => :activity
menu_item :dashboard, :only => :dashboard
menu_item :files, :only => [:list_files, :add_file]
menu_item :settings, :only => :settings
menu_item :team, :only => :team
menu_item :credits, :only => :credits
ssl_required :all
before_filter :find_project, :except => [ :index, :list, :copy, :activity, :update_scale, :add, :index_active, :index_latest ]
before_filter :find_optional_project, :only => [:activity, :add]
#BUGBUG: why aren't these actions being authorized!!! archive can be removed, unarchive doesn't seem to work when removed from here
before_filter :authorize, :except => [ :index, :index_latest, :index_active, :list, :add, :copy, :archive, :unarchive, :destroy, :activity, :dashboard, :dashdata, :new_dashdata, :mypris, :update_scale, :community_members, :community_members_array, :issue_search, :hourly_types, :join]
before_filter :authorize_global, :only => :add
before_filter :require_admin, :only => [ :copy ]
accept_key_auth :activity
after_filter :only => [:add, :edit, :archive, :unarchive, :destroy] do |controller|
if controller.request.post?
controller.send :expire_action, :controller => 'welcome', :action => 'robots.txt'
end
end
helper :sort
include SortHelper
helper :issues
helper IssuesHelper
helper :queries
include QueriesHelper
include ProjectsHelper
log_activity_streams :current_user, :name, :edited, :@project, :name, :edit, :workstreams, {:object_description_method => :description}
def index
@latest_enterprises = Project.latest_public
@active_enterprises = Project.most_active_public
end
def index_latest
limit = 10
@latest_enterprises = Project.latest_public(limit, params[:offset].to_i)
respond_to do |wants|
wants.js do
render :update do |page|
page.replace "project_index_bottom_latest", :partial => "project_list", :locals => {
:projects => @latest_enterprises,
:offset => Integer(params[:offset]) + limit,
:index_type => 'latest'}
page.call "display_sparks"
end
end
end
end
def index_active
limit = 10
@active_enterprises = Project.most_active_public(limit, params[:offset].to_i)
respond_to do |wants|
wants.js do
render :update do |page|
page.replace "project_index_bottom_active", :partial => "project_list", :locals => {
:projects => @active_enterprises,
:offset => Integer(params[:offset]) + limit,
:index_type => 'active'}
page.call "display_sparks"
end
end
end
end
def map
end
# Add a new project
#TODO too much logic here, needs to move to model somehow
def add
@project = Project.new(params[:project])
@parent = Project.find(params[:parent_id]) unless params[:parent_id] == "" || params[:parent_id].nil?
if request.get?
@project.enabled_module_names = Setting.default_projects_modules
@project.dpp = 100
if @parent
@project.is_public = @parent.is_public
@project.volunteer = @parent.volunteer
end
else
@project.enabled_module_names = params[:enabled_modules]
@project.is_public = params[:project][:is_public] || false
@project.volunteer = params[:project][:volunteer] || false
@project.homepage = url_for(:controller => 'projects', :action => 'wiki', :id => @project)
if validate_parent_id && @project.save
LogActivityStreams.write_single_activity_stream(User.current, :name, @project, :name, :created, :workstreams, 0, nil,{:object_description_method => :description})
if @parent.nil?
# Add current user as a admin and core team member
r = Role.core_member
r2 = Role.administrator
m = Member.new(:user => User.current, :roles => [r,r2])
@project.all_members << m
@project.update_attribute(:owner_id, User.current.id)
else
@project.set_parent!(@parent.id)
@project.set_owner
@project.refresh_active_members
User.current.add_to_project(@project, Role.active)
end
flash.now[:success] = l(:notice_successful_create)
redirect_to :controller => 'projects', :action => 'dashboard', :id => @project.id
else
redirect_with_flash :error, "Couldn't create project", :controller => "my", :action => "projects"
end
end
end
def copy
@trackers = Tracker.all
@root_projects = Project.find(:all,
:conditions => "parent_id IS NULL AND status = #{Project::STATUS_ACTIVE}",
:order => 'name')
@source_project = Project.find(params[:id])
if request.get?
@project = Project.copy_from(@source_project)
if @project
@project.identifier = Project.next_identifier if Setting.sequential_project_identifiers?
else
redirect_to :controller => 'admin', :action => 'projects'
end
else
@project = Project.new(params[:project])
@project.enabled_module_names = params[:enabled_modules]
if validate_parent_id && @project.copy(@source_project, :only => params[:only])
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
flash.now[:success] = l(:notice_successful_create)
redirect_to :controller => 'admin', :action => 'projects'
end
end
rescue ActiveRecord::RecordNotFound
redirect_to :controller => 'admin', :action => 'projects'
end
def reset_invitation_token
@project.invitation_token = Token.generate_token_value
@project.save
respond_to do |wants|
wants.js do
render :update do |page|
page.replace "generic-invitation", :partial => 'invitations/generic_invitation', :locals => {:project => @project}
page.visual_effect :highlight, "generic-link", :duration => 6
page.visual_effect :highlight, "generic-invitation", :duration => 2
page.call '$.jGrowl', l(:notice_successful_update)
end
end
end
end
def join
#check token
if params[:token] != @project.invitation_token
render_error(l(:error_old_invite))
return
else
#add as contributor
if @project.root?
unless User.current.community_member_of? @project
User.current.add_to_project @project, Role.contributor
msg = "Invitation accepted. You are now a contributor of #{@project.name}"
redirect_with_flash :success, msg, :controller => :projects, :action => :show, :id => @project.id
else
msg = "You're already on the #{@project.name} team. Invitation ignored"
redirect_with_flash :error, msg, :controller => :projects, :action => :show, :id => @project.id
end
end
end
end
# Show @project
def overview
if params[:jump]
# try to redirect to the requested menu item
redirect_to_project_menu_item(@project, params[:jump]) && return
end
@subprojects = @project.descendants.active
@news = @project.news.find(:all, :conditions => " (created_at > '#{Time.now.advance :days => (Setting::DAYS_FOR_LATEST_NEWS * -1)}')", :limit => 5, :include => [ :author, :project ], :order => "#{News.table_name}.created_at DESC")
@trackers = @project.rolled_up_trackers
cond = @project.project_condition(Setting.display_subprojects_issues?)
@open_issues_by_tracker = Issue.visible.count(:group => :tracker,
:include => [:project, :status, :tracker],
:conditions => ["(#{cond}) AND #{IssueStatus.table_name}.is_closed=?", false])
@total_issues_by_tracker = Issue.visible.count(:group => :tracker,
:include => [:project, :status, :tracker],
:conditions => cond)
@key = User.current.rss_key
@motions = @project.motions.viewable_by(User.current.position_for(@project)).allactive
end
def hourly_types
render :json => @project.hourly_types.inject({}) { |hash, hourly_type|
hash[hourly_type.id] = hourly_type.name
hash
}.to_json
end
def community_members
render :json => @project.root.all_members.inject({}) { |hash, member|
hash[member.user_id] = member.name
hash
}.to_json
end
def community_members_array
array = []
@project.root.member_users.each {|m| array.push({:label => "#{m.user.name} (@#{m.user.login})", :value => m.user.login, :mail_hash => m.user.mail_hash })}
@project.member_users.each {|m| array.push({:label => "#{m.user.name} (@#{m.user.login})", :value => m.user.login, :mail_hash => m.user.mail_hash }) }
render :json => array.sort{|x,y| x[:label] <=> y[:label]}.uniq.to_json
end
def issue_search
term = params[:searchTerm]
render :json => Issue.find(:all, :conditions => "project_id = #{@project.id} AND (subject ilike '%#{term}%' OR CAST(id as varchar) ilike '%#{term}%')").to_json(:only => [:id, :subject, :description])
end
def all_tags
render :json => @project.all_tags(params[:term]).to_json
end
def dashboard
@credit_base = @project.dpp
@show_issue_id = params[:show_issue_id] #Optional parameter to start the dashboard off showing an issue
@show_retro_id = params[:show_retro_id] #Optional parameter to start the dashboard off showing a retrospective
end
#TODO: optimize this query, it's WAY too heavy, and we need fewer columns, and it's executing hundreds of queries!
def dashdata
if params[:include_subworkstreams]
project_ids = [@project.sub_project_array_visible_to(User.current).join(",")]
else
project_ids = [@project.id]
end
if params[:status_ids]
conditions = "project_id in (#{project_ids}) AND (retro_id < 0 OR retro_id is null) AND status_id in (#{params[:status_ids]})"
else
conditions = "project_id in (#{project_ids}) AND (retro_id < 0 OR retro_id is null)"
end
render :json => Issue.find(:all, :conditions => conditions) \
.to_json(:include => { :journals => { :only => [:id, :notes, :created_at, :user_id], :include => {:user => { :only => [:firstname, :lastname, :login] }}},
:issue_votes => { :include => {:user => { :only => [:firstname, :lastname, :login] }}},
:status => { :only => :name },
:attachments => { :only => [:id, :filename]},
:todos => { :only => [:id, :subject, :completed_on, :owner_login] },
:tracker => { :only => [:name,:id] },
:author => { :only => [:firstname, :lastname, :login, :mail_hash] },
:assigned_to => { :only => [:firstname, :lastname, :login] }
},
:except => :tags)
end
# Checks to see if any items have changed in this project (in the last params[:seconds]).
# If it has, returns only items that have changed
def new_dashdata
if @project.last_item_updated_on.nil?
@project.last_item_updated_on = DateTime.now
@project.save
end
if params[:include_subworkstreams]
if @project.last_item_sub_updated_on.nil?
@project.last_item_sub_updated_on = DateTime.now
@project.save
end
project_ids = [@project.sub_project_array_visible_to(User.current).join(",")]
total_count = (@project.issue_count + @project.issue_count_sub).to_s
last_update = @project.last_item_sub_updated_on
else
project_ids = [@project.id]
total_count = @project.issue_count.to_s
last_update = @project.last_item_updated_on
end
seconds_ago = params[:seconds].to_f.round
if (last_update.advance(:seconds => seconds_ago) > DateTime.now)
conditions = "project_id in (#{project_ids}) AND " +
"updated_at >= '#{@project.last_item_updated_on.advance(:seconds => -1 * seconds_ago)}'"
render :json => Issue.find(:all, :conditions => conditions).to_json(
:include => {
:journals => {
:only => [:id, :notes, :created_at, :user_id],
:include => {
:user => { :only => [:firstname, :lastname, :login] }
}
},
:issue_votes => { :include => {:user => { :only => [:firstname, :lastname, :login] }}},
:status => { :only => :name },
:attachments => { :only => [:id, :filename]},
:todos => { :only => [:id, :subject, :completed_on, :owner_login] },
:tracker => { :only => [:name,:id] },
:author => { :only => [:firstname, :lastname, :login, :mail_hash] },
:assigned_to => { :only => [:firstname, :lastname, :login] }
},
:except => :tags
)
elsif params[:issuecount] != total_count
render :json => Issue.find(:all,
:conditions => "project_id in (#{project_ids}) AND (retro_id < 0 OR retro_id is null)"
).collect {|i| i.id}
else
render :text => 'no'
end
end
def update_scale
render :update do |page|
page.replace 'point_scale', :partial => 'point_scale', :locals => {:dpp => params[:dpp] }
page["point_scale"].visual_effect :highlight
end
end
#TODO: remove this function, we're no longer using it??
#Returns my priorities for issues belonging to this project
def mypris
render :json => Issue.find(:all, :conditions => "project_id = #{@project.id} AND id IN (SELECT DISTINCT issue_id FROM #{Pri.table_name} where user_id = #{User.current.id})", :select => "id").to_json
end
def settings
@member ||= @project.all_members.new
@trackers = Tracker.all
@wiki ||= @project.wiki
@allow_logo_selection = true
end
# Edit @project
def edit
if request.post?
old_attributes = @project.attributes
@project.attributes = params[:project]
@project.is_public = params[:project][:is_public] || false
@project.volunteer = params[:project][:volunteer] || false
if (old_attributes["is_public"] != (params[:project]["is_public"] == "1"))
description = (params[:project]["is_public"] == "1") ? "publicised" : "privatized"
LogActivityStreams.write_single_activity_stream(User.current, :name, @project, :name, description, :workstreams, 0, nil,{})
end
if validate_parent_id && @project.save
@project.set_allowed_parent!(params[:project]['parent_id']) if params[:project].has_key?('parent_id')
@project.refresh_active_members
flash.now[:success] = l(:notice_successful_update)
redirect_to :action => 'settings', :id => @project
else
settings
render :action => 'settings'
end
end
end
def modules
@project.enabled_module_names = params[:enabled_modules]
@project.attributes = params[:project]
@project.save
redirect_with_flash :notice, l(:notice_successful_update), :action => 'settings', :id => @project, :tab => 'modules'
end
def archive
if @project.active? && request.post? && @project.archive
project_id_override = @project.parent ? @project.parent.id : @project.id #archived projects don't show up in activity stream, so we log the activity to its parent if it exists
LogActivityStreams.write_single_activity_stream(User.current, :name, @project, :name, l(:label_archived), :workstreams, 0, nil,{:project_id => project_id_override})
redirect_with_flash :notice, l(:notice_successful_update), :controller => "my", :action => 'projects'
else
render_error(l(:error_general))
end
end
def unarchive
if !@project.active? && request.post? && @project.unarchive
LogActivityStreams.write_single_activity_stream(User.current, :name, @project, :name, l(:label_unarchived), :workstreams, 0, nil,{})
respond_to do |wants|
wants.js do
@my_projects = User.current.owned_projects
render :update do |page|
page.replace params[:table_id], :partial => 'my/my_projects', :locals => {:my_projects => @my_projects, :table_id => params[:table_id]}
page.call '$.jGrowl', l(:notice_successful_update)
page.call 'display_sparks'
end
end
end
else
respond_to do |wants|
wants.js do
render :update do |page|
page.call '$.jGrowl', l(:error_general)
end
end
end
end
end
# Delete @project
def destroy
@project_to_destroy = @project
if request.post?
project_id_override = @project.parent ? @project.parent.id : @project.id #deleted projects don't show up in activity stream, so we log the activity to its parent if it exists
LogActivityStreams.write_single_activity_stream(User.current, :name, @project, :name, l(:label_deleted), :workstreams, 0, nil,{:project_id => project_id_override})
if @project_to_destroy.destroy
redirect_with_flash :notice, l(:notice_successful_delete), :controller => "welcome", :action => 'index'
else
render_error(l(:error_general))
end
end
# hide project in layout
@project = nil
end
#move project
def move
redirect_to(:action => 'settings') and return if @project.root?
#TODO @project.allowed_parents should be used but it isn't working correctly currently
@allowed_projects = []
disallowed_projects = @project.self_and_descendants
@project.root.self_and_descendants.each {|p| @allowed_projects << p if p.visible_to(User.current) && !disallowed_projects.include?(p) }
if request.post?
if (parent = Project.find params[:parent_id]) && @allowed_projects.include?(parent)
@project.move_to_child_of(parent)
flash[:success] = l(:notice_successful_update)
LogActivityStreams.write_single_activity_stream(User.current, :name, @project, :name, l(:label_moved), :workstreams, 0, nil,{:project_id => @project.id})
redirect_to @project
else
render_403 and return
end
end
end
def add_file
if request.post?
container = @project
attachments = attach_files(container, params[:attachments])
if !attachments.empty? && Setting.notified_events.include?('file_added')
Mailer.deliver_attachments_added(attachments)
end
redirect_to :controller => 'projects', :action => 'list_files', :id => @project
return
end
end
def list_files
sort_init 'filename', 'asc'
sort_update 'filename' => "#{Attachment.table_name}.filename",
'created_at' => "#{Attachment.table_name}.created_at",
'size' => "#{Attachment.table_name}.filesize",
'downloads' => "#{Attachment.table_name}.downloads"
@containers = [ Project.find(@project.id, :include => :attachments, :order => sort_clause)]
render :layout => !request.xhr?
end
def team
@days = Setting.activity_days_default.to_i
@hide_view_team_link = true #hides the link to this page from the active box
end
def credits
@credits = @project.fetch_credits(params[:with_subprojects])
@credits_pages, @creditss = @project.fetch_credits(params[:with_subprojects])
@active_credits = @credits.find_all{|credit| credit.enabled == true && credit.settled_on.nil? == true }.group_by{|credit| credit.owner_id}
@oustanding_credits = @credits.find_all{|credit| credit.settled_on.nil? == true }.group_by{|credit| credit.owner_id}
@total_credits = @credits.group_by{|credit| credit.owner_id}
end
#params that can be passed: length, with_subprojects, and author
def activity
rescue ActiveRecord::RecordNotFound
render_404
end
private
def find_project
if (params[:show_issue_id])
@project = Issue.find(params[:show_issue_id]).project
else
@project = Project.find(params[:id])
end
render_message l(:text_project_locked) if @project.locked?
rescue ActiveRecord::RecordNotFound
render_404
end
def find_optional_project
return true unless params[:id]
@project = Project.find(params[:id])
authorize
rescue ActiveRecord::RecordNotFound
render_404
end
def retrieve_selected_tracker_ids(selectable_trackers, default_trackers=nil)
if ids = params[:tracker_ids]
@selected_tracker_ids = (ids.is_a? Array) ? ids.collect { |id| id.to_i.to_s } : ids.split('/').collect { |id| id.to_i.to_s }
else
@selected_tracker_ids = (default_trackers || selectable_trackers).collect {|t| t.id.to_s }
end
end
# Validates parent_id param according to user's permissions
# TODO: move it to Project model in a validation that depends on User.current
def validate_parent_id
return true if User.current.admin?
parent_id = params[:project] && params[:project][:parent_id]
if parent_id || @project.new_record?
parent = parent_id.blank? ? nil : Project.find_by_id(parent_id.to_i)
unless @project.allowed_parents.include?(parent)
@project.errors.add :parent_id, :invalid
return false
end
end
true
end
end
================================================
FILE: app/controllers/queries_controller.rb
================================================
# BetterMeans - Work 2.0
# Copyright (C) 2006-2011 See readme for details and license#
class QueriesController < ApplicationController
menu_item :issues
before_filter :find_query, :except => :new
before_filter :find_optional_project, :only => :new
def new
@query = Query.new(params[:query])
@query.project = params[:query_is_for_all] ? nil : @project
@query.user = User.current
@query.is_public = false unless User.current.allowed_to?(:manage_public_queries, @project) || User.current.admin?
@query.column_names = nil if params[:default_columns]
params[:fields].each do |field|
@query.add_filter(field, params[:operators][field], params[:values][field])
end if params[:fields]
@query.group_by ||= params[:group_by]
if request.post? && params[:confirm] && @query.save
flash.now[:success] = l(:notice_successful_create)
redirect_to :controller => 'issues', :action => 'index', :project_id => @project, :query_id => @query
return
end
render :layout => false if request.xhr?
end
def edit
if request.post?
@query.filters = {}
params[:fields].each do |field|
@query.add_filter(field, params[:operators][field], params[:values][field])
end if params[:fields]
@query.attributes = params[:query]
@query.project = nil if params[:query_is_for_all]
@query.is_public = false unless User.current.allowed_to?(:manage_public_queries, @project) || User.current.admin?
@query.column_names = nil if params[:default_columns]
if @query.save
flash.now[:success] = l(:notice_successful_update)
redirect_to :controller => 'issues', :action => 'index', :project_id => @project, :query_id => @query
end
end
end
def destroy
@query.destroy if request.post?
redirect_to :controller => 'issues', :action => 'index', :project_id => @project, :set_filter => 1
end
private
def find_query
@query = Query.find(params[:id])
@project = @query.project
render_403 unless @query.editable_by?(User.current)
rescue ActiveRecord::RecordNotFound
render_404
end
def find_optional_project
@project = Project.find(params[:project_id]) if params[:project_id]
User.current.allowed_to?(:save_queries, @project, :global => true)
rescue ActiveRecord::RecordNotFound
render_404
end
end
================================================
FILE: app/controllers/quotes_controller.rb
================================================
class QuotesController < ApplicationController
ssl_required :all
def index
@quotes = Quote.all
respond_to do |format|
format.html
format.xml { render :xml => @quotes }
end
end
def show
@quote = Quote.find(params[:id])
respond_to do |format|
format.html
format.xml { render :xml => @quote }
end
end
def new
@quote = Quote.new
respond_to do |format|
format.html
format.xml { render :xml => @quote }
end
end
def edit
@quote = Quote.find(params[:id])
end
def create
@quote = Quote.new(params[:quote])
@quote.user_id = User.current.id
respond_to do |format|
if @quote.save
flash.now[:success] = 'Quote was successfully created.'
format.html { redirect_to(@quote) }
format.xml { render :xml => @quote, :status => :created, :location => @quote }
else
format.html { render :action => "new" }
format.xml { render :xml => @quote.errors, :status => :unprocessable_entity }
end
end
end
def update
@quote = Quote.find(params[:id])
respond_to do |format|
if @quote.update_attributes(params[:quote])
flash.now[:success] = 'Quote was successfully updated.'
format.html { redirect_to(@quote) }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @quote.errors, :status => :unprocessable_entity }
end
end
end
def destroy
@quote = Quote.find(params[:id])
@quote.destroy
respond_to do |format|
format.html { redirect_to(quotes_url) }
format.xml { head :ok }
end
end
end
================================================
FILE: app/controllers/recurly_notifications_controller.rb
================================================
# BetterMeans - Work 2.0
# Copyright (C) 2006-2011 See readme for details and license#
class RecurlyNotificationsController < ApplicationController
def listen
logger.info { "params #{params.inspect}" }
if params[:updated_subscription_notification]
update_subscription(params[:updated_subscription_notification],true)
end
if params[:new_subscription_notification]
update_subscription(params[:new_subscription_notification],true)
end
if params[:expired_subscription_notification]
update_subscription(params[:expired_subscription_notification],false)
end
render :nothing => true
end
private
def update_subscription(params,active_subscription)
account = params["account"]
subscription = params["subscription"]
begin
user = User.find(account["account_code"])
if active_subscription
user.plan_id = Plan.find_by_code(subscription["plan"]["plan_code"]).id
user.active_subscription = true
else
user.plan_id = Plan.find(Plan::FREE_CODE).id
user.active_subscription = false
end
user.save
logger.info { "saved for user #{user.name} new plan #{user.plan_id}" }
rescue Exception => e
logger.info { e.inspect }
end
end
end
================================================
FILE: app/controllers/reports_controller.rb
================================================
# BetterMeans - Work 2.0
# Copyright (C) 2006-2011 See readme for details and license#
class ReportsController < ApplicationController
menu_item :issues
before_filter :find_project, :authorize
def issue_report
@statuses = IssueStatus.find(:all, :order => 'position')
case params[:detail]
when "tracker"
@field = "tracker_id"
@rows = @project.trackers
@data = issues_by_tracker
@report_title = l(:field_tracker)
render :template => "reports/issue_report_details"
when "assigned_to"
@field = "assigned_to_id"
@rows = @project.all_members.collect { |m| m.user }
@data = issues_by_assigned_to
@report_title = l(:field_assigned_to)
render :template => "reports/issue_report_details"
when "author"
@field = "author_id"
@rows = @project.all_members.collect { |m| m.user }
@data = issues_by_author
@report_title = l(:field_author)
render :template => "reports/issue_report_details"
when "subproject"
@field = "project_id"
@rows = @project.descendants.active
@data = issues_by_subproject
@report_title = l(:field_subproject)
render :template => "reports/issue_report_details"
else
@trackers = @project.trackers
@categories = @project.issue_categories
@assignees = @project.all_members.collect { |m| m.user }
@authors = @project.all_members.collect { |m| m.user }
@subprojects = @project.descendants.active
issues_by_tracker
issues_by_assigned_to
issues_by_author
issues_by_subproject
render :template => "reports/issue_report"
end
end
private
# Find project of id params[:id]
def find_project
@project = Project.find(params[:id])
rescue ActiveRecord::RecordNotFound
render_404
end
def issues_by_tracker
@issues_by_tracker ||=
ActiveRecord::Base.connection.select_all("select s.id as status_id,
s.is_closed as closed,
t.id as tracker_id,
count(i.id) as total
from
#{Issue.table_name} i, #{IssueStatus.table_name} s, #{Tracker.table_name} t
where
i.status_id=s.id
and i.tracker_id=t.id
and i.project_id=#{@project.id}
group by s.id, s.is_closed, t.id")
end
def issues_by_assigned_to
@issues_by_assigned_to ||=
ActiveRecord::Base.connection.select_all("select s.id as status_id,
s.is_closed as closed,
a.id as assigned_to_id,
count(i.id) as total
from
#{Issue.table_name} i, #{IssueStatus.table_name} s, #{User.table_name} a
where
i.status_id=s.id
and i.assigned_to_id=a.id
and i.project_id=#{@project.id}
group by s.id, s.is_closed, a.id")
end
def issues_by_author
@issues_by_author ||=
ActiveRecord::Base.connection.select_all("select s.id as status_id,
s.is_closed as closed,
a.id as author_id,
count(i.id) as total
from
#{Issue.table_name} i, #{IssueStatus.table_name} s, #{User.table_name} a
where
i.status_id=s.id
and i.author_id=a.id
and i.project_id=#{@project.id}
group by s.id, s.is_closed, a.id")
end
def issues_by_subproject
@issues_by_subproject ||=
ActiveRecord::Base.connection.select_all("select s.id as status_id,
s.is_closed as closed,
i.project_id as project_id,
count(i.id) as total
from
#{Issue.table_name} i, #{IssueStatus.table_name} s
where
i.status_id=s.id
and i.project_id IN (#{@project.descendants.active.collect{|p| p.id}.join(',')})
group by s.id, s.is_closed, i.project_id") if @project.descendants.active.any?
@issues_by_subproject ||= []
end
end
================================================
FILE: app/controllers/reputations_controller.rb
================================================
class ReputationsController < ApplicationController
ssl_required :all
def index
@reputations = Reputation.all
respond_to do |format|
format.html
format.xml { render :xml => @reputations }
end
end
def show
@reputation = Reputation.find(params[:id])
respond_to do |format|
format.html
format.xml { render :xml => @reputation }
end
end
def new
@reputation = Reputation.new
respond_to do |format|
format.html
format.xml { render :xml => @reputation }
end
end
def edit
@reputation = Reputation.find(params[:id])
end
def create
@reputation = Reputation.new(params[:reputation])
respond_to do |format|
if @reputation.save
flash.now[:success] = 'Reputation was successfully created.'
format.html { redirect_to(@reputation) }
format.xml { render :xml => @reputation, :status => :created, :location => @reputation }
else
format.html { render :action => "new" }
format.xml { render :xml => @reputation.errors, :status => :unprocessable_entity }
end
end
end
def update
@reputation = Reputation.find(params[:id])
respond_to do |format|
if @reputation.update_attributes(params[:reputation])
flash.now[:success] = 'Reputation was successfully updated.'
format.html { redirect_to(@reputation) }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @reputation.errors, :status => :unprocessable_entity }
end
end
end
def destroy
@reputation = Reputation.find(params[:id])
@reputation.destroy
respond_to do |format|
format.html { redirect_to(reputations_url) }
format.xml { head :ok }
end
end
end
================================================
FILE: app/controllers/retro_ratings_controller.rb
================================================
class RetroRatingsController < ApplicationController
ssl_required :all
def index
@retro_ratings = RetroRating.all
respond_to do |format|
format.html
format.xml { render :xml => @retro_ratings }
end
end
def show
@retro_rating = RetroRating.find(params[:id])
respond_to do |format|
format.html
format.xml { render :xml => @retro_rating }
end
end
def new
@retro_rating = RetroRating.new
respond_to do |format|
format.html
format.xml { render :xml => @retro_rating }
end
end
def edit
@retro_rating = RetroRating.find(params[:id])
end
def create
@retro_ratings = params[:retro_ratings].values.collect { |retro_rating| RetroRating.new(retro_rating) }
#Archive notification for this retrospective
@retro_id = params[:retro_ratings].values[0]["retro_id"]
@rater_id = params[:retro_ratings].values[0]["rater_id"]
Notification.update_all "state = #{Notification::STATE_ARCHIVED}" , ["variation = 'retro_started' AND source_id = ? AND recipient_id = ?", @retro_id, @rater_id]
#TODO: security: make sure to only create ratings if current user is same as rater_id (and user is actually on those teams!)
respond_to do |format|
if @retro_ratings.all?(&:valid?)
RetroRating.delete_all(:rater_id => @retro_ratings[0].rater_id , :retro_id => @retro_ratings[0].retro_id)
@retro_ratings.each(&:save!)
format.html { redirect_to(@retro_rating) }
format.xml { render :xml => @retro_rating, :status => :created, :location => @retro_rating }
format.js { render :json => @retro_ratings.to_json}
else
format.html { render :action => "new" }
format.xml { render :xml => @retro_rating.errors, :status => :unprocessable_entity }
end
end
end
def update
@retro_rating = RetroRating.find(params[:id])
respond_to do |format|
if @retro_rating.update_attributes(params[:retro_rating])
flash.now[:success] = 'RetroRating was successfully updated.'
format.html { redirect_to(@retro_rating) }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @retro_rating.errors, :status => :unprocessable_entity }
end
end
end
def destroy
@retro_rating = RetroRating.find(params[:id])
@retro_rating.destroy
respond_to do |format|
format.html { redirect_to(retro_ratings_url) }
format.xml { head :ok }
end
end
end
================================================
FILE: app/controllers/retros_controller.rb
================================================
class RetrosController < ApplicationController
before_filter :find_retro, :only => [:show]
before_filter :find_project, :only => [:index, :index_json, :dashdata, :new, :edit, :create, :update, :destroy, :show_multiple]
before_filter :authorize
ssl_required :all
def index
@retros = Retro.all
respond_to do |format|
format.html
format.xml { render :xml => @retros }
end
end
def index_json
render :json => Retro.find(:all, :conditions => {:project_id => @project.id}).to_json
end
def dashdata
render :json => Issue.find(:all, :conditions => {:retro_id => params[:id]}).to_json(:include => {:journals => {:include => :user}, :issue_votes => {:include => :user}, :status => {:only => :name}, :todos => {:only => [:id, :subject, :completed_on]}, :tracker => {:only => [:name,:id]}, :author => {:only => [:firstname, :lastname, :login]}, :assigned_to => {:only => [:firstname, :lastname, :login]}})
end
def show
@retro = Retro.find(params[:id])
@team_hash = {}
@final_hash = {}
@user_retro_hash = {}
new_user_retro = {"issues" => [],
"total_points" => 0,
"percentage_points" => 0,
"given_percentage" => 0,
"self_bias" => nil,
"scale_bias" => nil,
"journals" => [],
"total_journals" => 0,
"votes" => [],
"total_votes" => 0,
"total_ideas" => 0
}
#Calculating oustanding points for entire retrospective
@total_points = 0
@total_ideas = @retro.issues.length
@max_range = 0
@pie_data_points = []
@pie_labels_points = []
@max_points = 0
#Calculating team size for issues (to distribute total points amongst team)
issue_team_sizes = Hash.new
@retro.issues.each {|issue| issue_team_sizes[issue.id] = 1}
@retro.issues.each do |issue|
issue.issue_votes.each do |issue_vote|
next if issue_vote.vote_type != IssueVote::JOIN_VOTE_TYPE
#Incrementing team size for the issue
issue_team_sizes[issue_vote.issue_id] += 1 if issue_vote.user_id != issue.assigned_to_id
end
end
#Adding users that have issues assigned to them and calculating total points for each user
issue_group = @retro.issues.group_by{|issue| issue.assigned_to_id}
issue_group.each_value {|issues| @total_points += issues.collect(&:points).sum }
issue_group.keys.sort.each do |assigned_to_id|
next if (@user_retro_hash.has_key? assigned_to_id) || assigned_to_id == User.sysadmin.id
@user_retro_hash.store assigned_to_id, new_us
gitextract_i_av7aco/
├── .gitignore
├── .gitmodules
├── .rspec
├── .rvmrc
├── Gemfile
├── Guardfile
├── README.md
├── Rakefile
├── app/
│ ├── controllers/
│ │ ├── account_controller.rb
│ │ ├── activity_stream_preferences_controller.rb
│ │ ├── activity_stream_preferences_module.rb
│ │ ├── activity_streams_controller.rb
│ │ ├── activity_streams_module.rb
│ │ ├── admin_controller.rb
│ │ ├── application_controller.rb
│ │ ├── attachments_controller.rb
│ │ ├── auth_sources_controller.rb
│ │ ├── boards_controller.rb
│ │ ├── comments_controller.rb
│ │ ├── credit_distributions_controller.rb
│ │ ├── credit_transfers_controller.rb
│ │ ├── credits_controller.rb
│ │ ├── documents_controller.rb
│ │ ├── email_updates_controller.rb
│ │ ├── enterprises_controller.rb
│ │ ├── enumerations_controller.rb
│ │ ├── help_controller.rb
│ │ ├── help_sections_controller.rb
│ │ ├── home_controller.rb
│ │ ├── hourly_types_controller.rb
│ │ ├── invitations_controller.rb
│ │ ├── issue_invitations_controller.rb
│ │ ├── issue_relations_controller.rb
│ │ ├── issue_statuses_controller.rb
│ │ ├── issue_votes_controller.rb
│ │ ├── issues_controller.rb
│ │ ├── journals_controller.rb
│ │ ├── mail_handler_controller.rb
│ │ ├── mails_controller.rb
│ │ ├── members_controller.rb
│ │ ├── messages_controller.rb
│ │ ├── motion_votes_controller.rb
│ │ ├── motions_controller.rb
│ │ ├── my_controller.rb
│ │ ├── news_controller.rb
│ │ ├── notifications_controller.rb
│ │ ├── projects_controller.rb
│ │ ├── queries_controller.rb
│ │ ├── quotes_controller.rb
│ │ ├── recurly_notifications_controller.rb
│ │ ├── reports_controller.rb
│ │ ├── reputations_controller.rb
│ │ ├── retro_ratings_controller.rb
│ │ ├── retros_controller.rb
│ │ ├── roles_controller.rb
│ │ ├── search_controller.rb
│ │ ├── settings_controller.rb
│ │ ├── shares_controller.rb
│ │ ├── todos_controller.rb
│ │ ├── trackers_controller.rb
│ │ ├── users_controller.rb
│ │ ├── votes_controller.rb
│ │ ├── watchers_controller.rb
│ │ ├── welcome_controller.rb
│ │ ├── wiki_controller.rb
│ │ ├── wikis_controller.rb
│ │ └── workflows_controller.rb
│ ├── helpers/
│ │ ├── admin_helper.rb
│ │ ├── application_helper.rb
│ │ ├── attachments_helper.rb
│ │ ├── groups_helper.rb
│ │ ├── issue_relations_helper.rb
│ │ ├── issues_helper.rb
│ │ ├── journals_helper.rb
│ │ ├── messages_helper.rb
│ │ ├── motions_helper.rb
│ │ ├── my_helper.rb
│ │ ├── news_helper.rb
│ │ ├── projects_helper.rb
│ │ ├── queries_helper.rb
│ │ ├── reports_helper.rb
│ │ ├── retros_helper.rb
│ │ ├── search_helper.rb
│ │ ├── settings_helper.rb
│ │ ├── sort_helper.rb
│ │ ├── users_helper.rb
│ │ ├── watchers_helper.rb
│ │ └── wiki_helper.rb
│ ├── models/
│ │ ├── activity_stream.rb
│ │ ├── activity_stream_preference.rb
│ │ ├── activity_stream_total.rb
│ │ ├── attachment.rb
│ │ ├── auth_source.rb
│ │ ├── auth_source_ldap.rb
│ │ ├── board.rb
│ │ ├── comment.rb
│ │ ├── credit.rb
│ │ ├── credit_distribution.rb
│ │ ├── credit_transfer.rb
│ │ ├── daily_digest.rb
│ │ ├── document.rb
│ │ ├── document_observer.rb
│ │ ├── email_update.rb
│ │ ├── enabled_module.rb
│ │ ├── enterprise.rb
│ │ ├── enumeration.rb
│ │ ├── help_section.rb
│ │ ├── hourly_type.rb
│ │ ├── invitation.rb
│ │ ├── issue.rb
│ │ ├── issue_observer.rb
│ │ ├── issue_relation.rb
│ │ ├── issue_status.rb
│ │ ├── issue_vote.rb
│ │ ├── journal.rb
│ │ ├── journal_detail.rb
│ │ ├── journal_observer.rb
│ │ ├── mail.rb
│ │ ├── mail_handler.rb
│ │ ├── mailer.rb
│ │ ├── member.rb
│ │ ├── member_role.rb
│ │ ├── message.rb
│ │ ├── message_observer.rb
│ │ ├── motion.rb
│ │ ├── motion_vote.rb
│ │ ├── news.rb
│ │ ├── news_observer.rb
│ │ ├── notification.rb
│ │ ├── open_id_authentication_association.rb
│ │ ├── open_id_authentication_nonces.rb
│ │ ├── personal_welcome.rb
│ │ ├── plan.rb
│ │ ├── plugin_schema_info.rb
│ │ ├── project.rb
│ │ ├── query.rb
│ │ ├── quote.rb
│ │ ├── reputation.rb
│ │ ├── retro.rb
│ │ ├── retro_rating.rb
│ │ ├── role.rb
│ │ ├── setting.rb
│ │ ├── share.rb
│ │ ├── todo.rb
│ │ ├── token.rb
│ │ ├── track.rb
│ │ ├── tracker.rb
│ │ ├── user.rb
│ │ ├── user_preference.rb
│ │ ├── watcher.rb
│ │ ├── wiki.rb
│ │ ├── wiki_content.rb
│ │ ├── wiki_content_observer.rb
│ │ ├── wiki_page.rb
│ │ ├── wiki_redirect.rb
│ │ └── workflow.rb
│ └── views/
│ ├── account/
│ │ ├── login.html.erb
│ │ ├── lost_password.html.erb
│ │ ├── password_recovery.html.erb
│ │ └── register.html.erb
│ ├── activity_stream_preferences/
│ │ └── index.html.erb
│ ├── activity_streams/
│ │ ├── _activity_comment.html.erb
│ │ ├── _activity_stream.html.erb
│ │ ├── _activity_stream_feed.atom.builder
│ │ ├── _activity_stream_group.erb
│ │ ├── _activity_stream_list.html.erb
│ │ ├── _activity_stream_sub.html.erb
│ │ ├── _indirect_object.html.erb
│ │ ├── _table_header.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── admin/
│ │ ├── _menu.html.erb
│ │ ├── _no_data.html.erb
│ │ ├── index.html.erb
│ │ ├── info.html.erb
│ │ ├── plugins.html.erb
│ │ ├── projects.html.erb
│ │ └── user_stats.html.erb
│ ├── attachments/
│ │ ├── _form.html.erb
│ │ ├── _links.html.erb
│ │ ├── _table.erb
│ │ ├── diff.html.erb
│ │ └── file.html.erb
│ ├── auth_sources/
│ │ ├── _form.html.erb
│ │ ├── edit.html.erb
│ │ ├── list.html.erb
│ │ └── new.html.erb
│ ├── boards/
│ │ ├── _form.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── common/
│ │ ├── 403.html.erb
│ │ ├── 404.html.erb
│ │ ├── _calendar.html.erb
│ │ ├── _diff.html.erb
│ │ ├── _file.html.erb
│ │ ├── _main_menu_home.html.erb
│ │ ├── _preview.html.erb
│ │ ├── _tabs.html.erb
│ │ └── feed.atom.rxml
│ ├── credit_distributions/
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── credit_transfers/
│ │ ├── _credit_transfer_history.html.erb
│ │ ├── _eligible_recipients.erb
│ │ ├── _new_credit_transfer.html.erb
│ │ └── index.html.erb
│ ├── credits/
│ │ ├── _credit_breakdown.html.erb
│ │ ├── _credit_history.html.erb
│ │ ├── _credit_queue.html.erb
│ │ ├── _my_credits.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── documents/
│ │ ├── _document.html.erb
│ │ ├── _form.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── email_updates/
│ │ └── new.html.erb
│ ├── enterprises/
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── enumerations/
│ │ ├── _form.html.erb
│ │ ├── destroy.html.erb
│ │ ├── edit.html.erb
│ │ ├── list.html.erb
│ │ └── new.html.erb
│ ├── help/
│ │ └── show.html.erb
│ ├── help_sections/
│ │ ├── _show.html.erb
│ │ ├── _show_popup.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── home/
│ │ ├── _footer.html.erb
│ │ ├── _header.html.erb
│ │ ├── about.html.erb
│ │ ├── apps.html.erb
│ │ ├── contact.html.erb
│ │ ├── elements.html.erb
│ │ ├── features_original.html.erb
│ │ ├── how.html.erb
│ │ ├── hq.html.erb
│ │ ├── index.html.erb
│ │ ├── library.html.erb
│ │ ├── old_index.html.erb
│ │ ├── old_index2.html.erb
│ │ ├── old_inviteonline.html.erb
│ │ ├── open_enterprise_governance_model.html.erb
│ │ ├── pricing.html.erb
│ │ ├── privacy.html.erb
│ │ ├── services.html.erb
│ │ ├── signup.html.erb
│ │ ├── tour.html.erb
│ │ ├── user_agreement.html.erb
│ │ ├── webdesign.html.erb
│ │ ├── what.html.erb
│ │ └── why.html.erb
│ ├── hourly_types/
│ │ ├── _form.html.erb
│ │ ├── edit.html.erb
│ │ └── new.html.erb
│ ├── invitations/
│ │ ├── _generic_invitation.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── issue_relations/
│ │ └── _form.html.erb
│ ├── issue_statuses/
│ │ ├── _form.html.erb
│ │ ├── edit.html.erb
│ │ ├── list.html.erb
│ │ └── new.html.erb
│ ├── issue_votes/
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── issues/
│ │ ├── _action_menu.html.erb
│ │ ├── _attributes.html.erb
│ │ ├── _edit.html.erb
│ │ ├── _form.html.erb
│ │ ├── _form_add_team_member.html.erb
│ │ ├── _form_update.html.erb
│ │ ├── _history.html.erb
│ │ ├── _joined_by.html.erb
│ │ ├── _list.html.erb
│ │ ├── _list_simple.html.erb
│ │ ├── _list_very_simple.html.erb
│ │ ├── _relations.html.erb
│ │ ├── _sidebar.html.erb
│ │ ├── calendar.html.erb
│ │ ├── changes.rxml
│ │ ├── context_menu.html.erb
│ │ ├── edit.html.erb
│ │ ├── gantt.html.erb
│ │ ├── index.html.erb
│ │ ├── move.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── journals/
│ │ ├── _notes_form.html.erb
│ │ ├── edit.rjs
│ │ └── update.rjs
│ ├── layouts/
│ │ ├── _account_menu.html.erb
│ │ ├── activescaffold.html.erb
│ │ ├── admin.html.erb
│ │ ├── base.html.erb
│ │ ├── blank.html.erb
│ │ ├── gooey.html.erb
│ │ ├── help_sections.html.erb
│ │ ├── issue_blank.html.erb
│ │ ├── mailer.text.html.erb
│ │ ├── mailer.text.plain.erb
│ │ └── static.html.erb
│ ├── mailer/
│ │ ├── _issue_text_html.html.erb
│ │ ├── _issue_text_plain.html.erb
│ │ ├── account_activated.text.html.html.erb
│ │ ├── account_activated.text.plain.html.erb
│ │ ├── account_activation_request.text.html.html.erb
│ │ ├── account_activation_request.text.plain.html.erb
│ │ ├── account_information.text.html.html.erb
│ │ ├── account_information.text.plain.html.erb
│ │ ├── attachments_added.text.html.html.erb
│ │ ├── attachments_added.text.plain.html.erb
│ │ ├── daily_digest.text.html.html.erb
│ │ ├── daily_digest.text.plain.html.erb
│ │ ├── document_added.text.html.html.erb
│ │ ├── document_added.text.plain.html.erb
│ │ ├── email_update_activation.text.html.html.erb
│ │ ├── email_update_activation.text.plain.html.erb
│ │ ├── invitation_add.text.html.html.erb
│ │ ├── invitation_add.text.plain.html.erb
│ │ ├── invitation_remind.text.html.html.erb
│ │ ├── invitation_remind.text.plain.html.erb
│ │ ├── issue_add.text.html.html.erb
│ │ ├── issue_add.text.plain.html.erb
│ │ ├── issue_edit.text.html.html.erb
│ │ ├── issue_edit.text.plain.html.erb
│ │ ├── lost_password.text.html.html.erb
│ │ ├── lost_password.text.plain.html.erb
│ │ ├── message_posted.text.html.html.erb
│ │ ├── message_posted.text.plain.html.erb
│ │ ├── news_added.text.html.html.erb
│ │ ├── news_added.text.plain.html.erb
│ │ ├── personal_welcome.text.html.html.erb
│ │ ├── personal_welcome.text.plain.html.erb
│ │ ├── register.text.html.html.erb
│ │ ├── register.text.plain.html.erb
│ │ ├── reminder.text.html.html.erb
│ │ ├── reminder.text.plain.html.erb
│ │ ├── test.text.html.html.erb
│ │ ├── test.text.plain.html.erb
│ │ ├── wiki_content_added.text.html.html.erb
│ │ ├── wiki_content_added.text.plain.html.erb
│ │ ├── wiki_content_updated.text.html.html.erb
│ │ └── wiki_content_updated.text.plain.html.erb
│ ├── mails/
│ │ ├── _inbox.html.erb
│ │ ├── _sent.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── members/
│ │ └── autocomplete_for_member.html.erb
│ ├── messages/
│ │ ├── _form.html.erb
│ │ ├── _motion_topic.html.erb
│ │ ├── edit.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── motion_votes/
│ │ ├── _vote.html.erb
│ │ ├── cast_vote.js.rjs
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── motions/
│ │ ├── _motions.html.erb
│ │ ├── edit.html.erb
│ │ ├── eligible_users.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── my/
│ │ ├── _belong_to_projects.html.erb
│ │ ├── _billing_form.html.erb
│ │ ├── _block.html.erb
│ │ ├── _my_projects.html.erb
│ │ ├── _plan_description.html.erb
│ │ ├── _plan_descriptions.html.erb
│ │ ├── _project_list.html.erb
│ │ ├── _sidebar.html.erb
│ │ ├── _usage_stats.html.erb
│ │ ├── account.html.erb
│ │ ├── blocks/
│ │ │ ├── _calendar.html.erb
│ │ │ ├── _documents.html.erb
│ │ │ ├── _issuesassignedtome.html.erb
│ │ │ ├── _issuesreportedbyme.html.erb
│ │ │ ├── _issueswatched.html.erb
│ │ │ └── _news.html.erb
│ │ ├── issues.html.erb
│ │ ├── page.html.erb
│ │ ├── page_layout.html.erb
│ │ ├── password.html.erb
│ │ ├── projects.html.erb
│ │ └── upgrade.html.erb
│ ├── news/
│ │ ├── _form.html.erb
│ │ ├── _news.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── notifications/
│ │ ├── _credits_distributed.erb
│ │ ├── _credits_transferred.html.erb
│ │ ├── _invitation.erb
│ │ ├── _issue_joined.html.erb
│ │ ├── _issue_left.html.erb
│ │ ├── _issue_team_member_added.html.erb
│ │ ├── _issue_team_member_removed.html.erb
│ │ ├── _mention.html.erb
│ │ ├── _message.html.erb
│ │ ├── _motion_started.erb
│ │ ├── _new_role.erb
│ │ ├── _retro_ended.erb
│ │ ├── _retro_started.erb
│ │ ├── _trial_expired.html.erb
│ │ ├── _unresponded.html.erb
│ │ ├── _usage_over.html.erb
│ │ ├── edit.html.erb
│ │ ├── error.js.rjs
│ │ ├── hide.js.rjs
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── projects/
│ │ ├── _active_member_box.html.erb
│ │ ├── _active_member_box_simple.html.erb
│ │ ├── _clearance_member_box.html.erb
│ │ ├── _dashboard_javascript_variables.html.erb
│ │ ├── _edit.html.erb
│ │ ├── _form.html.erb
│ │ ├── _member_box.html.erb
│ │ ├── _point_scale.html.erb
│ │ ├── _project_list.html.erb
│ │ ├── _project_summary.html.erb
│ │ ├── _projects_list_simple.html.erb
│ │ ├── _subprojects.html.erb
│ │ ├── _team_link.html.erb
│ │ ├── _team_list.html.erb
│ │ ├── _team_list_member.html.erb
│ │ ├── activity.html.erb
│ │ ├── add.html.erb
│ │ ├── add_file.html.erb
│ │ ├── copy.html.erb
│ │ ├── core_vote.js.rjs
│ │ ├── credits.html.erb
│ │ ├── dashboard.html.erb
│ │ ├── index.html.erb
│ │ ├── list_files.html.erb
│ │ ├── list_members.html.erb
│ │ ├── map.html.erb
│ │ ├── move.html.erb
│ │ ├── overview.html.erb
│ │ ├── settings/
│ │ │ ├── _boards.html.erb
│ │ │ ├── _hourly_types.html.erb
│ │ │ ├── _members.html.erb
│ │ │ ├── _modules.html.erb
│ │ │ ├── _select_new_member.html.erb
│ │ │ └── _wiki.html.erb
│ │ ├── settings.html.erb
│ │ ├── show.png.flexi
│ │ ├── team.html.erb
│ │ └── team_update.js.rjs
│ ├── queries/
│ │ ├── _columns.html.erb
│ │ ├── _filters.html.erb
│ │ ├── _form.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ └── new.html.erb
│ ├── quotes/
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── reports/
│ │ ├── _details.html.erb
│ │ ├── _simple.html.erb
│ │ ├── issue_report.html.erb
│ │ └── issue_report_details.html.erb
│ ├── reputations/
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── retro_ratings/
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── retros/
│ │ ├── _issue_details.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ ├── show.html.erb
│ │ └── show_multiple.html.erb
│ ├── roles/
│ │ ├── _form.html.erb
│ │ ├── edit.html.erb
│ │ ├── list.html.erb
│ │ ├── new.html.erb
│ │ └── report.html.erb
│ ├── search/
│ │ └── index.html.erb
│ ├── settings/
│ │ ├── _authentication.html.erb
│ │ ├── _display.html.erb
│ │ ├── _general.html.erb
│ │ ├── _issues.html.erb
│ │ ├── _mail_handler.html.erb
│ │ ├── _notifications.html.erb
│ │ ├── _projects.html.erb
│ │ ├── edit.html.erb
│ │ └── plugin.html.erb
│ ├── shares/
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── todos/
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ ├── new.html.erb
│ │ └── show.html.erb
│ ├── trackers/
│ │ ├── _form.html.erb
│ │ ├── edit.html.erb
│ │ ├── list.html.erb
│ │ └── new.html.erb
│ ├── users/
│ │ ├── _activity.html.erb
│ │ ├── _form.html.erb
│ │ ├── _general.html.erb
│ │ ├── _general_info.html.erb
│ │ ├── _membership.html.erb
│ │ ├── _memberships.html.erb
│ │ ├── _reputation.html.erb
│ │ ├── add.html.erb
│ │ ├── edit.html.erb
│ │ ├── index.html.erb
│ │ └── show.html.erb
│ ├── watchers/
│ │ └── _watchers.html.erb
│ ├── welcome/
│ │ ├── _list_workstreams.html.erb
│ │ ├── index.html.erb
│ │ └── robots.html.erb
│ ├── wiki/
│ │ ├── _content.html.erb
│ │ ├── _sidebar.html.erb
│ │ ├── annotate.html.erb
│ │ ├── destroy.html.erb
│ │ ├── diff.html.erb
│ │ ├── edit.html.erb
│ │ ├── export.html.erb
│ │ ├── export_multiple.html.erb
│ │ ├── history.html.erb
│ │ ├── rename.html.erb
│ │ ├── show.html.erb
│ │ ├── special_date_index.html.erb
│ │ └── special_page_index.html.erb
│ ├── wikis/
│ │ └── destroy.html.erb
│ └── workflows/
│ ├── _action_menu.html.erb
│ ├── copy.html.erb
│ ├── edit.html.erb
│ └── index.html.erb
├── config/
│ ├── additional_environment.rb.example
│ ├── boot.rb
│ ├── database.yml.example
│ ├── email.yml.example
│ ├── environment.rb
│ ├── environments/
│ │ ├── cucumber.rb
│ │ ├── demo.rb
│ │ ├── development.rb
│ │ ├── production.rb
│ │ ├── selenium.rb
│ │ ├── test.rb
│ │ ├── test_pgsql.rb
│ │ └── test_sqlite3.rb
│ ├── exceptional.yml
│ ├── initializers/
│ │ ├── 10-patches.rb
│ │ ├── 20-mime_types.rb
│ │ ├── 30-redmine.rb
│ │ ├── 40-email.rb
│ │ ├── activity_streams.rb
│ │ ├── admin_data.rb
│ │ ├── aws_s3.rb
│ │ ├── backtrace_silencers.rb
│ │ ├── bigdecimal-segfault-fix.rb
│ │ ├── hash.rb
│ │ ├── inflections.rb
│ │ ├── recurly_config.rb
│ │ └── timeout.rb
│ ├── locales/
│ │ └── en.yml
│ ├── preinitializer.rb
│ ├── rails_best_practices.yml
│ ├── routes.rb
│ ├── s3.yml
│ ├── selenium.yml
│ └── settings.yml
├── cucumber.yml
├── db/
│ ├── migrate/
│ │ ├── 20110320055526_acts_as_taggable_on_migration.rb
│ │ ├── 20110329230314_add_projectid_to_taggable.rb
│ │ └── 20110330041648_add_tags_to_issue.rb
│ ├── schema.rb
│ └── seeds.rb
├── deploy
├── doc/
│ ├── COPYING
│ ├── INSTALL
│ ├── README_FOR_APP
│ └── RUNNING_TESTS
├── extra/
│ ├── mail_handler/
│ │ └── rdm-mailhandler.rb
│ └── sample_plugin/
│ ├── README
│ ├── app/
│ │ ├── controllers/
│ │ │ └── example_controller.rb
│ │ ├── models/
│ │ │ └── meeting.rb
│ │ └── views/
│ │ ├── example/
│ │ │ ├── say_goodbye.html.erb
│ │ │ └── say_hello.html.erb
│ │ ├── my/
│ │ │ └── blocks/
│ │ │ └── _sample_block.html.erb
│ │ └── settings/
│ │ └── _sample_plugin_settings.html.erb
│ ├── assets/
│ │ └── stylesheets/
│ │ └── example.css
│ ├── config/
│ │ └── locales/
│ │ ├── en.yml
│ │ └── fr.yml
│ ├── db/
│ │ └── migrate/
│ │ └── 001_create_meetings.rb
│ └── init.rb
├── lib/
│ ├── activity_streams/
│ │ ├── log_activity_streams.rb
│ │ └── routes.rb
│ ├── activity_streams.rb
│ ├── ar_condition.rb
│ ├── diff.rb
│ ├── faster_csv.rb
│ ├── float.rb
│ ├── generators/
│ │ ├── redmine_plugin/
│ │ │ ├── USAGE
│ │ │ ├── redmine_plugin_generator.rb
│ │ │ └── templates/
│ │ │ ├── README.rdoc
│ │ │ ├── en.yml
│ │ │ ├── en_rails_i18n.yml
│ │ │ ├── init.rb.erb
│ │ │ └── test_helper.rb.erb
│ │ ├── redmine_plugin_controller/
│ │ │ ├── USAGE
│ │ │ ├── redmine_plugin_controller_generator.rb
│ │ │ └── templates/
│ │ │ ├── controller.rb.erb
│ │ │ ├── functional_test.rb.erb
│ │ │ ├── helper.rb.erb
│ │ │ └── view.html.erb
│ │ └── redmine_plugin_model/
│ │ ├── USAGE
│ │ ├── redmine_plugin_model_generator.rb
│ │ └── templates/
│ │ ├── fixtures.yml
│ │ ├── migration.rb.erb
│ │ ├── model.rb.erb
│ │ └── unit_test.rb.erb
│ ├── mention.rb
│ ├── redcloth3.rb
│ ├── redmine/
│ │ ├── about.rb
│ │ ├── access_control.rb
│ │ ├── access_keys.rb
│ │ ├── activity/
│ │ │ └── fetcher.rb
│ │ ├── activity.rb
│ │ ├── core_ext/
│ │ │ ├── string/
│ │ │ │ ├── conversions.rb
│ │ │ │ └── inflections.rb
│ │ │ └── string.rb
│ │ ├── core_ext.rb
│ │ ├── default_data/
│ │ │ └── loader.rb
│ │ ├── export/
│ │ │ └── pdf.rb
│ │ ├── helpers/
│ │ │ ├── calendar.rb
│ │ │ └── gantt.rb
│ │ ├── i18n.rb
│ │ ├── imap.rb
│ │ ├── info.rb
│ │ ├── menu_manager.rb
│ │ ├── mime_type.rb
│ │ ├── platform.rb
│ │ ├── plugin.rb
│ │ ├── search.rb
│ │ ├── themes.rb
│ │ ├── unified_diff.rb
│ │ ├── utils.rb
│ │ ├── version.rb
│ │ ├── views/
│ │ │ ├── my_page/
│ │ │ │ └── block.rb
│ │ │ └── other_formats_builder.rb
│ │ ├── wiki_formatting/
│ │ │ ├── macros.rb
│ │ │ └── textile/
│ │ │ ├── formatter.rb
│ │ │ └── helper.rb
│ │ └── wiki_formatting.rb
│ ├── redmine.rb
│ ├── string.rb
│ ├── tabular_form_builder.rb
│ └── tasks/
│ ├── autoaccept_commitrequests.rake
│ ├── backup.rake
│ ├── bootstrap.rake
│ ├── cleanup.rake
│ ├── close_retros.rake
│ ├── cron.rake
│ ├── cucumber.rake
│ ├── custom.rake
│ ├── deprecated.rake
│ ├── email.rake
│ ├── extract_fixtures.rake
│ ├── fetch_changesets.rake
│ ├── initializers.rake
│ ├── load_default_data.rake
│ ├── locales.rake
│ ├── metrics.rake
│ ├── migrate_from_mantis.rake
│ ├── migrate_from_trac.rake
│ ├── migrate_plugins.rake
│ ├── plugins.rake
│ ├── reek.rake
│ ├── reminder.rake
│ ├── remove_problem_type.rake
│ ├── reset_all_passwords.rake
│ ├── rspec.rake
│ ├── steak.rake
│ ├── testing.rake
│ ├── update_item_statuses.rake
│ └── watchers.rake
├── public/
│ ├── .htaccess
│ ├── 404.html
│ ├── 500.html
│ ├── help/
│ │ ├── wiki_syntax.html
│ │ └── wiki_syntax_detailed.html
│ ├── images/
│ │ ├── gallery/
│ │ │ └── index.sof
│ │ ├── inner-background.psd
│ │ └── static/
│ │ ├── HomePageMain.psd
│ │ ├── Untitled-1.psd
│ │ ├── Untitled-2.psd
│ │ ├── call-us.psd
│ │ ├── col-img3.psd
│ │ ├── index.sof
│ │ ├── landingmockup.psd
│ │ ├── pricings-buttom.psd
│ │ ├── thanks.psd
│ │ └── videotemplate.psd
│ ├── javascripts/
│ │ ├── application.js
│ │ ├── calendar/
│ │ │ ├── calendar-setup.js
│ │ │ ├── calendar.js
│ │ │ └── lang/
│ │ │ ├── calendar-bg.js
│ │ │ ├── calendar-bs.js
│ │ │ ├── calendar-ca.js
│ │ │ ├── calendar-cs.js
│ │ │ ├── calendar-da.js
│ │ │ ├── calendar-de.js
│ │ │ ├── calendar-en.js
│ │ │ ├── calendar-es.js
│ │ │ ├── calendar-fi.js
│ │ │ ├── calendar-fr.js
│ │ │ ├── calendar-gl.js
│ │ │ ├── calendar-he.js
│ │ │ ├── calendar-hu.js
│ │ │ ├── calendar-id.js
│ │ │ ├── calendar-it.js
│ │ │ ├── calendar-ja.js
│ │ │ ├── calendar-ko.js
│ │ │ ├── calendar-lt.js
│ │ │ ├── calendar-mk.js
│ │ │ ├── calendar-nl.js
│ │ │ ├── calendar-no.js
│ │ │ ├── calendar-pl.js
│ │ │ ├── calendar-pt-br.js
│ │ │ ├── calendar-pt.js
│ │ │ ├── calendar-ro.js
│ │ │ ├── calendar-ru.js
│ │ │ ├── calendar-sk.js
│ │ │ ├── calendar-sl.js
│ │ │ ├── calendar-sr.js
│ │ │ ├── calendar-sv.js
│ │ │ ├── calendar-th.js
│ │ │ ├── calendar-tr.js
│ │ │ ├── calendar-uk.js
│ │ │ ├── calendar-vi.js
│ │ │ ├── calendar-zh-tw.js
│ │ │ └── calendar-zh.js
│ │ ├── context_menu.js
│ │ ├── controls.js
│ │ ├── dashboard.js
│ │ ├── dragdrop.js
│ │ ├── effects.js
│ │ ├── enterprise_map.js
│ │ ├── fancybox/
│ │ │ ├── index.sof
│ │ │ ├── jquery.fancybox-1.3.0.css
│ │ │ ├── jquery.fancybox-1.3.0.pack.js
│ │ │ └── jquery.mousewheel-3.0.2.pack.js
│ │ ├── fileuploader.js
│ │ ├── hoverIntent.js
│ │ ├── issue.js
│ │ ├── jQuery.bubbletip-1.0.4.js
│ │ ├── jScrollPane
│ │ ├── jScrollPane.js
│ │ ├── jit-yc.js
│ │ ├── jit.js
│ │ ├── jquery-ui.js
│ │ ├── jquery.autocomplete.js
│ │ ├── jquery.autocomplete.pack.js
│ │ ├── jquery.easing-1.3.pack.js
│ │ ├── jquery.em.js
│ │ ├── jquery.fancybox-1.3.0.js
│ │ ├── jquery.fancybox-1.3.0.pack.js
│ │ ├── jquery.fancybox-1.3.4.js
│ │ ├── jquery.fancybox-1.3.4.pack.js
│ │ ├── jquery.fileupload-ui.js
│ │ ├── jquery.fileupload.js
│ │ ├── jquery.jgrowl_minimized.js
│ │ ├── jquery.js
│ │ ├── jquery.mousewheel-3.0.2.pack.js
│ │ ├── jquery.mousewheel-3.0.4.pack.js
│ │ ├── jquery.mousewheel.js
│ │ ├── jquery.scrollTo-min.js
│ │ ├── jquery.tagsinput.js
│ │ ├── jquery.ui.autocomplete.ext.js
│ │ ├── jquery.ui.autocomplete.js
│ │ ├── jquery.ui.position.js
│ │ ├── jrails.js
│ │ ├── json2.js
│ │ ├── jstoolbar/
│ │ │ ├── jstoolbar.js
│ │ │ ├── lang/
│ │ │ │ ├── jstoolbar-bg.js
│ │ │ │ ├── jstoolbar-bs.js
│ │ │ │ ├── jstoolbar-ca.js
│ │ │ │ ├── jstoolbar-cs.js
│ │ │ │ ├── jstoolbar-da.js
│ │ │ │ ├── jstoolbar-de.js
│ │ │ │ ├── jstoolbar-en.js
│ │ │ │ ├── jstoolbar-es.js
│ │ │ │ ├── jstoolbar-fi.js
│ │ │ │ ├── jstoolbar-fr.js
│ │ │ │ ├── jstoolbar-gl.js
│ │ │ │ ├── jstoolbar-he.js
│ │ │ │ ├── jstoolbar-hu.js
│ │ │ │ ├── jstoolbar-id.js
│ │ │ │ ├── jstoolbar-it.js
│ │ │ │ ├── jstoolbar-ja.js
│ │ │ │ ├── jstoolbar-ko.js
│ │ │ │ ├── jstoolbar-lt.js
│ │ │ │ ├── jstoolbar-mk.js
│ │ │ │ ├── jstoolbar-nl.js
│ │ │ │ ├── jstoolbar-no.js
│ │ │ │ ├── jstoolbar-pl.js
│ │ │ │ ├── jstoolbar-pt-br.js
│ │ │ │ ├── jstoolbar-pt.js
│ │ │ │ ├── jstoolbar-ro.js
│ │ │ │ ├── jstoolbar-ru.js
│ │ │ │ ├── jstoolbar-sk.js
│ │ │ │ ├── jstoolbar-sl.js
│ │ │ │ ├── jstoolbar-sr.js
│ │ │ │ ├── jstoolbar-sv.js
│ │ │ │ ├── jstoolbar-th.js
│ │ │ │ ├── jstoolbar-tr.js
│ │ │ │ ├── jstoolbar-uk.js
│ │ │ │ ├── jstoolbar-vi.js
│ │ │ │ ├── jstoolbar-zh-tw.js
│ │ │ │ └── jstoolbar-zh.js
│ │ │ └── textile.js
│ │ ├── lightbox.js
│ │ ├── prototype.js
│ │ ├── repository_navigation.js
│ │ ├── retro.js
│ │ ├── select_list_move.js
│ │ ├── static/
│ │ │ ├── Quicksand_Book_400.font.js
│ │ │ ├── css_browser_selector.js
│ │ │ ├── cufon-yui.js
│ │ │ ├── execute.js
│ │ │ ├── hoverIntent.js
│ │ │ ├── index.sof
│ │ │ ├── jquery-galleryview-1.1/
│ │ │ │ ├── index.sof
│ │ │ │ ├── jquery.galleryview-1.1.js
│ │ │ │ └── jquery.timers-1.1.2.js
│ │ │ ├── jquery.easing.1.3.js
│ │ │ ├── jquery.scroll.pack.js
│ │ │ ├── jquery.send.js
│ │ │ └── superfish.js
│ │ ├── store.js
│ │ ├── superfish.js
│ │ ├── supersubs.js
│ │ ├── textile-editor-config.js
│ │ └── textile-editor.js
│ ├── maintenance/
│ │ └── index.html
│ ├── stylesheets/
│ │ ├── bubbletip-IE.css
│ │ ├── bubbletip.css
│ │ ├── calendar.css
│ │ ├── context_menu.css
│ │ ├── csshover.htc
│ │ ├── custom.css
│ │ ├── dashboard.css
│ │ ├── enterprise_map.css
│ │ ├── fileuploader.css
│ │ ├── gt-fixed.css
│ │ ├── gt-rounded-corners.css
│ │ ├── gt-styles.css
│ │ ├── headerandfooter.css
│ │ ├── issue.css
│ │ ├── jScrollPane.css
│ │ ├── jquery-ui-1.7.2.custom.css
│ │ ├── jquery-ui-1.8.8.custom.css
│ │ ├── jquery.autocomplete.css
│ │ ├── jquery.fancybox-1.3.0.css
│ │ ├── jquery.fancybox-1.3.4.css
│ │ ├── jquery.fileupload-ui.css
│ │ ├── jquery.tagsinput.css
│ │ ├── jquery.ui.autocomplete.css
│ │ ├── jstoolbar.css
│ │ ├── lightbox.css
│ │ ├── oldapplication.css
│ │ ├── override.css
│ │ ├── reset-fonts.css
│ │ ├── scaffold.css
│ │ ├── scm.css
│ │ ├── static/
│ │ │ ├── index.sof
│ │ │ ├── print.css
│ │ │ ├── screen.css
│ │ │ ├── style.css
│ │ │ └── superfish.css
│ │ └── textile-editor.css
│ └── themes/
│ ├── README
│ └── bettermeans/
│ └── stylesheets/
│ └── application.css
├── script/
│ ├── about
│ ├── autospec
│ ├── breakpointer
│ ├── console
│ ├── cucumber
│ ├── dbconsole
│ ├── delayed_job
│ ├── destroy
│ ├── generate
│ ├── performance/
│ │ ├── benchmarker
│ │ ├── profiler
│ │ └── request
│ ├── plugin
│ ├── process/
│ │ ├── inspector
│ │ ├── reaper
│ │ ├── spawner
│ │ └── spinner
│ ├── runner
│ ├── server
│ └── spec
├── spec/
│ ├── acceptance/
│ │ ├── acceptance_helper.rb
│ │ ├── support/
│ │ │ ├── helpers.rb
│ │ │ └── paths.rb
│ │ └── user_login_spec.rb
│ ├── controllers/
│ │ ├── account_controller_spec.rb
│ │ └── projects/
│ │ ├── index_active_spec.rb
│ │ ├── index_latest_spec.rb
│ │ ├── index_spec.rb
│ │ ├── move_spec.rb
│ │ └── new_dash_data_spec.rb
│ ├── factories.rb
│ ├── lib/
│ │ └── hash_spec.rb
│ ├── models/
│ │ └── project_spec.rb
│ ├── rcov.opts
│ ├── routing/
│ │ ├── accounts_routing_spec.rb
│ │ ├── activity_stream_preferences_routing_spec.rb
│ │ ├── activity_streams_routing_spec.rb
│ │ ├── admin_routing_spec.rb
│ │ ├── attachments_routing_spec.rb
│ │ ├── auth_sources_routing_spec.rb
│ │ ├── boards_routing_spec.rb
│ │ ├── comments_routing_spec.rb
│ │ ├── credit_distributions_routing_spec.rb
│ │ ├── credit_transfers_routing_spec.rb
│ │ ├── credits_routing_spec.rb
│ │ ├── documents_routing_spec.rb
│ │ ├── email_updates_routing_spec.rb
│ │ ├── enterprises_routing_spec.rb
│ │ ├── enumerations_routing_spec.rb
│ │ ├── help_routing_spec.rb
│ │ ├── help_sections_routing_spec.rb
│ │ ├── home_routing_spec.rb
│ │ ├── hourly_types_routing_spec.rb
│ │ ├── invitations_routing_spec.rb
│ │ ├── issue_invitations_routing_spec.rb
│ │ ├── issue_relations_routing_spec.rb
│ │ ├── issue_statuses_routing_spec.rb
│ │ ├── issue_votes_routing_spec.rb
│ │ ├── issues_routing_spec.rb
│ │ ├── journals_routing_spec.rb
│ │ ├── mail_handler_routing_spec.rb
│ │ ├── mails_routing_spec.rb
│ │ ├── members_routing_spec.rb
│ │ ├── messages_routing_spec.rb
│ │ ├── motion_votes_routing_spec.rb
│ │ ├── motions_routing_spec.rb
│ │ ├── my_routing_spec.rb
│ │ ├── news_routing_spec.rb
│ │ ├── notifications_routing_spec.rb
│ │ ├── projects_routing_spec.rb
│ │ ├── queries_routing_spec.rb
│ │ ├── quotes_routing_spec.rb
│ │ ├── recurly_notifications_routing_spec.rb
│ │ ├── reports_routing_spec.rb
│ │ ├── reputations_routing_spec.rb
│ │ ├── retro_ratings_routing_spec.rb
│ │ ├── retros_routing_spec.rb
│ │ ├── roles_routing_spec.rb
│ │ ├── search_routing_spec.rb
│ │ ├── settings_routing_spec.rb
│ │ ├── shares_routing_spec.rb
│ │ ├── todos_routing_spec.rb
│ │ ├── trackers_routing_spec.rb
│ │ ├── users_routing_spec.rb
│ │ ├── votes_routing_spec.rb
│ │ ├── watchers_routing_spec.rb
│ │ ├── welcome_routing_spec.rb
│ │ ├── wiki_routing_spec.rb
│ │ ├── wikis_routing_spec.rb
│ │ └── workflows_routing_spec.rb
│ ├── spec.opts
│ └── spec_helper.rb
└── vendor/
└── plugins/
├── acts-as-taggable-on/
│ ├── .rspec
│ ├── CHANGELOG
│ ├── Gemfile
│ ├── MIT-LICENSE
│ ├── README.rdoc
│ ├── Rakefile
│ ├── VERSION
│ ├── acts-as-taggable-on.gemspec
│ ├── generators/
│ │ └── acts_as_taggable_on_migration/
│ │ ├── acts_as_taggable_on_migration_generator.rb
│ │ └── templates/
│ │ └── migration.rb
│ ├── lib/
│ │ ├── acts-as-taggable-on.rb
│ │ ├── acts_as_taggable_on/
│ │ │ ├── acts_as_tagger.rb
│ │ │ ├── compatibility/
│ │ │ │ ├── Gemfile
│ │ │ │ └── active_record_backports.rb
│ │ │ ├── tag.rb
│ │ │ ├── tag_list.rb
│ │ │ ├── taggable/
│ │ │ │ ├── cache.rb
│ │ │ │ ├── collection.rb
│ │ │ │ ├── core.rb
│ │ │ │ ├── ownership.rb
│ │ │ │ └── related.rb
│ │ │ ├── taggable.rb
│ │ │ ├── tagging.rb
│ │ │ └── tags_helper.rb
│ │ └── generators/
│ │ └── acts_as_taggable_on/
│ │ └── migration/
│ │ ├── migration_generator.rb
│ │ └── templates/
│ │ └── active_record/
│ │ └── migration.rb
│ ├── rails/
│ │ └── init.rb
│ ├── spec/
│ │ ├── acts_as_taggable_on/
│ │ │ ├── acts_as_taggable_on_spec.rb
│ │ │ ├── acts_as_tagger_spec.rb
│ │ │ ├── tag_list_spec.rb
│ │ │ ├── tag_spec.rb
│ │ │ ├── taggable_spec.rb
│ │ │ ├── tagger_spec.rb
│ │ │ ├── tagging_spec.rb
│ │ │ └── tags_helper_spec.rb
│ │ ├── bm.rb
│ │ ├── database.yml.sample
│ │ ├── models.rb
│ │ ├── schema.rb
│ │ └── spec_helper.rb
│ └── uninstall.rb
├── acts_as_attachable/
│ ├── init.rb
│ └── lib/
│ └── acts_as_attachable.rb
├── acts_as_event/
│ ├── init.rb
│ └── lib/
│ └── acts_as_event.rb
├── acts_as_list/
│ ├── README
│ ├── init.rb
│ ├── lib/
│ │ └── active_record/
│ │ └── acts/
│ │ └── list.rb
│ └── test/
│ └── list_test.rb
├── acts_as_searchable/
│ ├── init.rb
│ └── lib/
│ └── acts_as_searchable.rb
├── acts_as_tree/
│ ├── README
│ ├── Rakefile
│ ├── init.rb
│ ├── lib/
│ │ └── active_record/
│ │ └── acts/
│ │ └── tree.rb
│ └── test/
│ ├── abstract_unit.rb
│ ├── acts_as_tree_test.rb
│ ├── database.yml
│ ├── fixtures/
│ │ ├── mixin.rb
│ │ └── mixins.yml
│ └── schema.rb
├── acts_as_versioned/
│ ├── CHANGELOG
│ ├── MIT-LICENSE
│ ├── README
│ ├── RUNNING_UNIT_TESTS
│ ├── Rakefile
│ ├── init.rb
│ ├── lib/
│ │ └── acts_as_versioned.rb
│ └── test/
│ ├── abstract_unit.rb
│ ├── database.yml
│ ├── fixtures/
│ │ ├── authors.yml
│ │ ├── landmark.rb
│ │ ├── landmark_versions.yml
│ │ ├── landmarks.yml
│ │ ├── locked_pages.yml
│ │ ├── locked_pages_revisions.yml
│ │ ├── migrations/
│ │ │ └── 1_add_versioned_tables.rb
│ │ ├── page.rb
│ │ ├── page_versions.yml
│ │ ├── pages.yml
│ │ └── widget.rb
│ ├── migration_test.rb
│ ├── schema.rb
│ └── versioned_test.rb
├── acts_as_watchable/
│ ├── init.rb
│ └── lib/
│ └── acts_as_watchable.rb
├── admin_data/
│ ├── History.txt
│ ├── README.md
│ ├── Rakefile
│ ├── app/
│ │ ├── controllers/
│ │ │ └── admin_data/
│ │ │ ├── base_controller.rb
│ │ │ ├── diagnostic_controller.rb
│ │ │ ├── feed_controller.rb
│ │ │ ├── main_controller.rb
│ │ │ ├── migration_controller.rb
│ │ │ ├── search_controller.rb
│ │ │ └── validate_model_controller.rb
│ │ └── views/
│ │ ├── admin_data/
│ │ │ ├── diagnostic/
│ │ │ │ ├── index.html.erb
│ │ │ │ └── missing_index.html.erb
│ │ │ ├── feed/
│ │ │ │ └── index.rss.builder
│ │ │ ├── main/
│ │ │ │ ├── all_models.html.erb
│ │ │ │ ├── association/
│ │ │ │ │ ├── _association_info.html.erb
│ │ │ │ │ ├── _belongs_to_info.html.erb
│ │ │ │ │ ├── _has_many_info.html.erb
│ │ │ │ │ └── _has_one_info.html.erb
│ │ │ │ ├── edit.html.erb
│ │ │ │ ├── misc/
│ │ │ │ │ ├── _form.html.erb
│ │ │ │ │ └── _modify_record.html.erb
│ │ │ │ ├── new.html.erb
│ │ │ │ ├── show.html.erb
│ │ │ │ └── table_structure.html.erb
│ │ │ ├── migration/
│ │ │ │ ├── index.html.erb
│ │ │ │ └── jstest.html.erb
│ │ │ ├── search/
│ │ │ │ ├── _search_base.html.erb
│ │ │ │ ├── advance_search.html.erb
│ │ │ │ ├── quick_search.html.erb
│ │ │ │ └── search/
│ │ │ │ ├── _advance_search_form.html.erb
│ │ │ │ ├── _errors.html.erb
│ │ │ │ ├── _listing.html.erb
│ │ │ │ ├── _search_form.html.erb
│ │ │ │ ├── _sortby.html.erb
│ │ │ │ └── _title.html.erb
│ │ │ ├── shared/
│ │ │ │ ├── _breadcrum.html.erb
│ │ │ │ ├── _drop_down_klasses.html.erb
│ │ │ │ ├── _flash_message.html.erb
│ │ │ │ ├── _header.html.erb
│ │ │ │ ├── _powered_by.html.erb
│ │ │ │ └── _secondary_navigation.html.erb
│ │ │ └── validate_model/
│ │ │ ├── _bad.html.erb
│ │ │ ├── tid.html.erb
│ │ │ └── validate.html.erb
│ │ └── layouts/
│ │ └── admin_data.html.erb
│ ├── config/
│ │ └── routes.rb
│ ├── doc/
│ │ └── git.txt
│ ├── init.rb
│ ├── lib/
│ │ ├── admin_data/
│ │ │ ├── chelper.rb
│ │ │ ├── compatibility.rb
│ │ │ ├── helpers.rb
│ │ │ ├── rake_util.rb
│ │ │ ├── search.rb
│ │ │ ├── settings.rb
│ │ │ └── util.rb
│ │ ├── admin_data_date_validation.rb
│ │ ├── css/
│ │ │ ├── app.css
│ │ │ ├── base.css
│ │ │ ├── header.css
│ │ │ ├── rounded.css
│ │ │ ├── themes/
│ │ │ │ └── drastic-dark/
│ │ │ │ └── style.css
│ │ │ ├── umbrella.css
│ │ │ └── vendor/
│ │ │ ├── jquery-ui-1.7.2.custom.css
│ │ │ └── qunit.css
│ │ └── js/
│ │ ├── advance_search/
│ │ │ ├── act_on_result.js
│ │ │ ├── adv_search.js
│ │ │ ├── advance_search.js
│ │ │ ├── advance_search_structure.js
│ │ │ ├── ajaxify_advance_search.js
│ │ │ ├── build_first_row.js
│ │ │ ├── event_bindings.js
│ │ │ ├── global_ajax_setting.js
│ │ │ └── trigger_submit_on_domready.js
│ │ ├── misc/
│ │ │ ├── drop_down_change.js
│ │ │ ├── js_util.js
│ │ │ └── quick_search_input_focus.js
│ │ ├── test/
│ │ │ ├── act_on_result.js
│ │ │ ├── advance_search.js
│ │ │ ├── ajaxify_advance_search.js
│ │ │ ├── build_first_row.js
│ │ │ └── event_bindings.js
│ │ ├── validate_model/
│ │ │ ├── ajaxify_form.js
│ │ │ └── select_all.js
│ │ └── vendor/
│ │ ├── jack.js
│ │ ├── jquery-1.4.1.js
│ │ ├── jquery.ba-isjquery.js
│ │ ├── jquery.form.js
│ │ ├── jquery.lint.js
│ │ ├── log.js
│ │ └── qunit.js
│ ├── tasks/
│ │ ├── admin_data_tasks.rake
│ │ └── validate_models_bg.rake
│ └── test/
│ ├── factories/
│ │ ├── article.rb
│ │ ├── car.rb
│ │ ├── city.rb
│ │ ├── comment.rb
│ │ ├── door.rb
│ │ └── engine.rb
│ ├── functional/
│ │ ├── base_controller_test.rb
│ │ ├── feed_controller_test.rb
│ │ ├── main_controller_test.rb
│ │ ├── migration_controller_test.rb
│ │ └── search_controller_test.rb
│ ├── helper/
│ │ └── view_helper_test.rb
│ ├── misc_tests/
│ │ ├── date_validation_test.rb
│ │ ├── settings_test.rb
│ │ └── util_test.rb
│ ├── rails_root/
│ │ ├── Rakefile
│ │ ├── app/
│ │ │ ├── controllers/
│ │ │ │ ├── application_controller.rb
│ │ │ │ └── articles_controller.rb
│ │ │ └── models/
│ │ │ ├── article.rb
│ │ │ ├── city.rb
│ │ │ ├── comment.rb
│ │ │ ├── tech_magazine.rb
│ │ │ └── vehicle/
│ │ │ ├── car.rb
│ │ │ ├── door.rb
│ │ │ └── engine.rb
│ │ ├── config/
│ │ │ ├── boot.rb
│ │ │ ├── database.yml
│ │ │ ├── environment.rb
│ │ │ ├── environments/
│ │ │ │ ├── development.rb
│ │ │ │ └── test.rb
│ │ │ ├── initializers/
│ │ │ │ └── new_rails_defaults.rb
│ │ │ └── routes.rb
│ │ ├── db/
│ │ │ ├── migrate/
│ │ │ │ └── 20090809061114_create_tables.rb
│ │ │ └── schema.rb
│ │ ├── public/
│ │ │ └── tmp/
│ │ │ └── response.txt
│ │ └── script/
│ │ ├── about
│ │ ├── console
│ │ ├── dbconsole
│ │ ├── destroy
│ │ ├── generate
│ │ ├── performance/
│ │ │ ├── benchmarker
│ │ │ └── profiler
│ │ ├── plugin
│ │ ├── runner
│ │ └── server
│ └── test_helper.rb
├── annotate_models/
│ ├── History.txt
│ ├── README.rdoc
│ ├── Rakefile
│ ├── VERSION.yml
│ ├── annotate.gemspec
│ ├── bin/
│ │ └── annotate
│ ├── lib/
│ │ ├── annotate/
│ │ │ ├── annotate_models.rb
│ │ │ ├── annotate_routes.rb
│ │ │ └── tasks/
│ │ │ ├── migrate.rake
│ │ │ └── migrate.rake~HEAD
│ │ └── annotate.rb
│ ├── spec/
│ │ ├── annotate/
│ │ │ ├── annotate_models_spec.rb
│ │ │ └── annotate_routes_spec.rb
│ │ ├── annotate_spec.rb
│ │ ├── spec.opts
│ │ └── spec_helper.rb
│ └── todo.txt
├── auto_complete/
│ ├── README
│ ├── Rakefile
│ ├── init.rb
│ ├── lib/
│ │ ├── auto_complete.rb
│ │ └── auto_complete_macros_helper.rb
│ └── test/
│ └── auto_complete_test.rb
├── awesome_nested_set/
│ ├── MIT-LICENSE
│ ├── README.rdoc
│ ├── Rakefile
│ ├── awesome_nested_set.gemspec
│ ├── init.rb
│ ├── lib/
│ │ ├── awesome_nested_set/
│ │ │ ├── compatability.rb
│ │ │ ├── helper.rb
│ │ │ └── named_scope.rb
│ │ └── awesome_nested_set.rb
│ ├── rails/
│ │ └── init.rb
│ └── test/
│ ├── awesome_nested_set/
│ │ └── helper_test.rb
│ ├── awesome_nested_set_test.rb
│ ├── db/
│ │ ├── database.yml
│ │ └── schema.rb
│ ├── fixtures/
│ │ ├── categories.yml
│ │ ├── category.rb
│ │ ├── departments.yml
│ │ └── notes.yml
│ └── test_helper.rb
├── classic_pagination/
│ ├── CHANGELOG
│ ├── README
│ ├── Rakefile
│ ├── init.rb
│ ├── install.rb
│ ├── lib/
│ │ ├── pagination.rb
│ │ └── pagination_helper.rb
│ └── test/
│ ├── fixtures/
│ │ ├── companies.yml
│ │ ├── company.rb
│ │ ├── developer.rb
│ │ ├── developers.yml
│ │ ├── developers_projects.yml
│ │ ├── project.rb
│ │ ├── projects.yml
│ │ ├── replies.yml
│ │ ├── reply.rb
│ │ ├── schema.sql
│ │ ├── topic.rb
│ │ └── topics.yml
│ ├── helper.rb
│ ├── pagination_helper_test.rb
│ └── pagination_test.rb
├── coderay-0.7.6.227/
│ ├── FOLDERS
│ ├── LICENSE
│ ├── README
│ ├── bin/
│ │ ├── coderay
│ │ └── coderay_stylesheet
│ └── lib/
│ ├── coderay/
│ │ ├── duo.rb
│ │ ├── encoder.rb
│ │ ├── encoders/
│ │ │ ├── _map.rb
│ │ │ ├── count.rb
│ │ │ ├── debug.rb
│ │ │ ├── div.rb
│ │ │ ├── html/
│ │ │ │ ├── css.rb
│ │ │ │ ├── numerization.rb
│ │ │ │ └── output.rb
│ │ │ ├── html.rb
│ │ │ ├── null.rb
│ │ │ ├── page.rb
│ │ │ ├── span.rb
│ │ │ ├── statistic.rb
│ │ │ ├── text.rb
│ │ │ ├── tokens.rb
│ │ │ ├── xml.rb
│ │ │ └── yaml.rb
│ │ ├── helpers/
│ │ │ ├── file_type.rb
│ │ │ ├── gzip_simple.rb
│ │ │ ├── plugin.rb
│ │ │ └── word_list.rb
│ │ ├── scanner.rb
│ │ ├── scanners/
│ │ │ ├── _map.rb
│ │ │ ├── c.rb
│ │ │ ├── debug.rb
│ │ │ ├── delphi.rb
│ │ │ ├── html.rb
│ │ │ ├── java.rb
│ │ │ ├── javascript.rb
│ │ │ ├── nitro_xhtml.rb
│ │ │ ├── php.rb
│ │ │ ├── plaintext.rb
│ │ │ ├── rhtml.rb
│ │ │ ├── ruby/
│ │ │ │ └── patterns.rb
│ │ │ ├── ruby.rb
│ │ │ ├── scheme.rb
│ │ │ └── xml.rb
│ │ ├── style.rb
│ │ ├── styles/
│ │ │ ├── _map.rb
│ │ │ ├── cycnus.rb
│ │ │ └── murphy.rb
│ │ ├── token_classes.rb
│ │ └── tokens.rb
│ └── coderay.rb
├── default_value_for/
│ ├── LICENSE.TXT
│ ├── README.rdoc
│ ├── Rakefile
│ ├── init.rb
│ └── test.rb
├── delayed_job/
│ ├── MIT-LICENSE
│ ├── README.textile
│ ├── Rakefile
│ ├── VERSION
│ ├── contrib/
│ │ └── delayed_job.monitrc
│ ├── delayed_job.gemspec
│ ├── generators/
│ │ └── delayed_job/
│ │ ├── delayed_job_generator.rb
│ │ └── templates/
│ │ ├── migration.rb
│ │ └── script
│ ├── init.rb
│ ├── lib/
│ │ ├── delayed/
│ │ │ ├── command.rb
│ │ │ ├── job.rb
│ │ │ ├── message_sending.rb
│ │ │ ├── performable_method.rb
│ │ │ ├── recipes.rb
│ │ │ ├── tasks.rb
│ │ │ └── worker.rb
│ │ └── delayed_job.rb
│ ├── recipes/
│ │ └── delayed_job.rb
│ ├── spec/
│ │ ├── delayed_method_spec.rb
│ │ ├── job_spec.rb
│ │ ├── sample_jobs.rb
│ │ ├── spec_helper.rb
│ │ ├── story_spec.rb
│ │ └── worker_spec.rb
│ └── tasks/
│ └── jobs.rake
├── engines/
│ ├── .gitignore
│ ├── CHANGELOG
│ ├── MIT-LICENSE
│ ├── README
│ ├── Rakefile
│ ├── about.yml
│ ├── boot.rb
│ ├── generators/
│ │ └── plugin_migration/
│ │ ├── USAGE
│ │ ├── plugin_migration_generator.rb
│ │ └── templates/
│ │ └── plugin_migration.erb
│ ├── init.rb
│ ├── lib/
│ │ ├── engines/
│ │ │ ├── assets.rb
│ │ │ ├── plugin/
│ │ │ │ ├── list.rb
│ │ │ │ ├── loader.rb
│ │ │ │ ├── locator.rb
│ │ │ │ └── migrator.rb
│ │ │ ├── plugin.rb
│ │ │ ├── rails_extensions/
│ │ │ │ ├── asset_helpers.rb
│ │ │ │ ├── dependencies.rb
│ │ │ │ ├── form_tag_helpers.rb
│ │ │ │ ├── migrations.rb
│ │ │ │ └── rails.rb
│ │ │ ├── tasks/
│ │ │ │ ├── engines.rake
│ │ │ │ └── engines.rake~HEAD
│ │ │ └── testing.rb
│ │ └── engines.rb
│ └── test/
│ ├── app/
│ │ ├── controllers/
│ │ │ ├── app_and_plugin_controller.rb
│ │ │ └── namespace/
│ │ │ └── app_and_plugin_controller.rb
│ │ ├── helpers/
│ │ │ └── mail_helper.rb
│ │ ├── models/
│ │ │ ├── app_and_plugin_model.rb
│ │ │ └── notify_mail.rb
│ │ ├── things/
│ │ │ └── thing.rb
│ │ └── views/
│ │ ├── app_and_plugin/
│ │ │ └── a_view.html.erb
│ │ ├── namespace/
│ │ │ └── app_and_plugin/
│ │ │ └── a_view.html.erb
│ │ ├── notify_mail/
│ │ │ ├── implicit_multipart.text.html.erb
│ │ │ ├── implicit_multipart.text.plain.erb
│ │ │ ├── multipart_html.html.erb
│ │ │ ├── multipart_plain.html.erb
│ │ │ └── signup.text.plain.erb
│ │ └── plugin_mail/
│ │ ├── mail_from_plugin_with_application_template.text.plain.erb
│ │ └── multipart_from_plugin_with_application_template_plain.html.erb
│ ├── functional/
│ │ ├── controller_loading_test.rb
│ │ ├── exception_notification_compatibility_test.rb
│ │ ├── locale_loading_test.rb
│ │ ├── routes_test.rb
│ │ ├── view_helpers_test.rb
│ │ └── view_loading_test.rb
│ ├── lib/
│ │ ├── app_and_plugin_lib_model.rb
│ │ ├── engines_test_helper.rb
│ │ └── render_information.rb
│ ├── plugins/
│ │ ├── alpha_plugin/
│ │ │ ├── app/
│ │ │ │ ├── controllers/
│ │ │ │ │ ├── alpha_plugin_controller.rb
│ │ │ │ │ ├── app_and_plugin_controller.rb
│ │ │ │ │ ├── namespace/
│ │ │ │ │ │ ├── alpha_plugin_controller.rb
│ │ │ │ │ │ ├── app_and_plugin_controller.rb
│ │ │ │ │ │ └── shared_plugin_controller.rb
│ │ │ │ │ └── shared_plugin_controller.rb
│ │ │ │ ├── models/
│ │ │ │ │ ├── alpha_plugin_model.rb
│ │ │ │ │ ├── app_and_plugin_model.rb
│ │ │ │ │ └── shared_plugin_model.rb
│ │ │ │ └── views/
│ │ │ │ ├── alpha_plugin/
│ │ │ │ │ └── a_view.html.erb
│ │ │ │ ├── app_and_plugin/
│ │ │ │ │ └── a_view.html.erb
│ │ │ │ ├── layouts/
│ │ │ │ │ └── plugin_layout.erb
│ │ │ │ ├── namespace/
│ │ │ │ │ ├── alpha_plugin/
│ │ │ │ │ │ └── a_view.html.erb
│ │ │ │ │ ├── app_and_plugin/
│ │ │ │ │ │ └── a_view.html.erb
│ │ │ │ │ └── shared_plugin/
│ │ │ │ │ └── a_view.html.erb
│ │ │ │ └── shared_plugin/
│ │ │ │ └── a_view.html.erb
│ │ │ ├── lib/
│ │ │ │ ├── alpha_plugin_lib_model.rb
│ │ │ │ └── app_and_plugin_lib_model.rb
│ │ │ └── locales/
│ │ │ └── en.yml
│ │ ├── beta_plugin/
│ │ │ ├── app/
│ │ │ │ ├── controllers/
│ │ │ │ │ ├── app_and_plugin_controller.rb
│ │ │ │ │ ├── namespace/
│ │ │ │ │ │ └── shared_plugin_controller.rb
│ │ │ │ │ └── shared_plugin_controller.rb
│ │ │ │ ├── models/
│ │ │ │ │ └── shared_plugin_model.rb
│ │ │ │ └── views/
│ │ │ │ ├── namespace/
│ │ │ │ │ └── shared_plugin/
│ │ │ │ │ └── a_view.html.erb
│ │ │ │ └── shared_plugin/
│ │ │ │ └── a_view.html.erb
│ │ │ ├── init.rb
│ │ │ └── locales/
│ │ │ └── en.yml
│ │ ├── not_a_plugin/
│ │ │ └── public/
│ │ │ └── should_not_be_copied.txt
│ │ ├── test_assets/
│ │ │ ├── app/
│ │ │ │ ├── controllers/
│ │ │ │ │ └── assets_controller.rb
│ │ │ │ └── views/
│ │ │ │ ├── assets/
│ │ │ │ │ └── index.html.erb
│ │ │ │ └── layouts/
│ │ │ │ └── assets.html.erb
│ │ │ ├── init.rb
│ │ │ └── public/
│ │ │ ├── file.txt
│ │ │ └── subfolder/
│ │ │ └── file_in_subfolder.txt
│ │ ├── test_assets_with_assets_directory/
│ │ │ ├── assets/
│ │ │ │ ├── file.txt
│ │ │ │ └── subfolder/
│ │ │ │ └── file_in_subfolder.txt
│ │ │ └── init.rb
│ │ ├── test_assets_with_no_subdirectory/
│ │ │ ├── assets/
│ │ │ │ └── file.txt
│ │ │ └── init.rb
│ │ ├── test_code_mixing/
│ │ │ ├── app/
│ │ │ │ └── things/
│ │ │ │ └── thing.rb
│ │ │ └── init.rb
│ │ ├── test_load_path/
│ │ │ └── init.rb
│ │ ├── test_migration/
│ │ │ ├── db/
│ │ │ │ └── migrate/
│ │ │ │ ├── 001_create_tests.rb
│ │ │ │ ├── 002_create_others.rb
│ │ │ │ └── 003_create_extras.rb
│ │ │ └── init.rb
│ │ ├── test_plugin_mailing/
│ │ │ ├── app/
│ │ │ │ ├── models/
│ │ │ │ │ └── plugin_mail.rb
│ │ │ │ └── views/
│ │ │ │ └── plugin_mail/
│ │ │ │ ├── mail_from_plugin.erb
│ │ │ │ ├── multipart_from_plugin_html.html.erb
│ │ │ │ ├── multipart_from_plugin_plain.html.erb
│ │ │ │ ├── multipart_from_plugin_with_application_template_html.html.erb
│ │ │ │ └── multipart_from_plugin_with_application_template_plain.html.erb
│ │ │ └── init.rb
│ │ ├── test_routing/
│ │ │ ├── app/
│ │ │ │ └── controllers/
│ │ │ │ ├── namespace/
│ │ │ │ │ └── test_routing_controller.rb
│ │ │ │ └── test_routing_controller.rb
│ │ │ ├── config/
│ │ │ │ └── routes.rb
│ │ │ └── init.rb
│ │ └── test_testing/
│ │ ├── app/
│ │ │ └── README.txt
│ │ ├── init.rb
│ │ └── test/
│ │ ├── fixtures/
│ │ │ └── testing_fixtures.yml
│ │ └── unit/
│ │ └── override_test.rb
│ └── unit/
│ ├── action_mailer_test.rb
│ ├── arbitrary_code_mixing_test.rb
│ ├── assets_test.rb
│ ├── backwards_compat_test.rb
│ ├── load_path_test.rb
│ ├── migration_test.rb
│ ├── model_and_lib_test.rb
│ ├── plugins_test.rb
│ ├── test_testing/
│ │ └── override_test.rb
│ └── testing_test.rb
├── exceptional/
│ ├── History.txt
│ ├── Manifest
│ ├── README
│ ├── Rakefile
│ ├── bin/
│ │ └── ginger
│ ├── exceptional.gemspec
│ ├── exceptional.yml
│ ├── ginger_scenarios.rb
│ ├── init.rb
│ ├── install.rb
│ ├── lib/
│ │ ├── exceptional/
│ │ │ ├── api.rb
│ │ │ ├── bootstrap.rb
│ │ │ ├── config.rb
│ │ │ ├── exception_data.rb
│ │ │ ├── integration/
│ │ │ │ └── rails.rb
│ │ │ ├── log.rb
│ │ │ ├── remote.rb
│ │ │ └── version.rb
│ │ └── exceptional.rb
│ └── spec/
│ ├── api_spec.rb
│ ├── bootstrap_spec.rb
│ ├── config_spec.rb
│ ├── exception_data_spec.rb
│ ├── exceptional_rescue_from_spec.rb
│ ├── exceptional_spec.rb
│ ├── log_spec.rb
│ ├── remote_spec.rb
│ └── spec_helper.rb
├── googlecharts/
│ ├── History.txt
│ ├── License.txt
│ ├── Manifest.txt
│ ├── README
│ ├── README.markdown
│ ├── README.txt
│ ├── Rakefile
│ ├── VERSION
│ ├── config/
│ │ ├── hoe.rb
│ │ └── requirements.rb
│ ├── lib/
│ │ ├── gchart/
│ │ │ ├── aliases.rb
│ │ │ ├── tasks/
│ │ │ │ ├── deployment.rake
│ │ │ │ ├── environment.rake
│ │ │ │ ├── rspec.rake
│ │ │ │ └── website.rake
│ │ │ ├── theme.rb
│ │ │ └── version.rb
│ │ ├── gchart.rb
│ │ ├── googlecharts.rb
│ │ └── themes.yml
│ ├── script/
│ │ ├── destroy
│ │ ├── generate
│ │ └── txt2html
│ ├── setup.rb
│ ├── spec/
│ │ ├── fixtures/
│ │ │ ├── another_test_theme.yml
│ │ │ └── test_theme.yml
│ │ ├── gchart_spec.rb
│ │ ├── spec_helper.rb
│ │ └── theme_spec.rb
│ └── website/
│ ├── index.html
│ ├── index.txt
│ ├── javascripts/
│ │ └── rounded_corners_lite.inc.js
│ ├── stylesheets/
│ │ └── screen.css
│ └── template.rhtml
├── gravatar/
│ ├── .gitignore
│ ├── MIT-LICENSE
│ ├── README.rdoc
│ ├── Rakefile
│ ├── about.yml
│ ├── init.rb
│ ├── lib/
│ │ └── gravatar.rb
│ └── spec/
│ └── gravatar_spec.rb
├── jrails/
│ ├── CHANGELOG
│ ├── LICENSE
│ ├── README.rdoc
│ ├── Rakefile
│ ├── VERSION.yml
│ ├── bin/
│ │ └── jrails
│ ├── init.rb
│ ├── install.rb
│ ├── javascripts/
│ │ ├── jquery-ui.js
│ │ ├── jquery.js
│ │ ├── jrails.js
│ │ └── sources/
│ │ └── jrails.js
│ ├── jrails.gemspec
│ ├── lib/
│ │ ├── jquery_selector_assertions.rb
│ │ ├── jrails.rb
│ │ └── tasks/
│ │ └── jrails.rake
│ └── rails/
│ └── init.rb
├── open_id_authentication/
│ ├── CHANGELOG
│ ├── README
│ ├── Rakefile
│ ├── generators/
│ │ ├── open_id_authentication_tables/
│ │ │ ├── open_id_authentication_tables_generator.rb
│ │ │ └── templates/
│ │ │ └── migration.rb
│ │ └── upgrade_open_id_authentication_tables/
│ │ ├── templates/
│ │ │ └── migration.rb
│ │ └── upgrade_open_id_authentication_tables_generator.rb
│ ├── init.rb
│ ├── lib/
│ │ ├── open_id_authentication/
│ │ │ ├── association.rb
│ │ │ ├── db_store.rb
│ │ │ ├── mem_cache_store.rb
│ │ │ ├── nonce.rb
│ │ │ ├── request.rb
│ │ │ ├── tasks/
│ │ │ │ └── open_id_authentication_tasks.rake
│ │ │ └── timeout_fixes.rb
│ │ └── open_id_authentication.rb
│ └── test/
│ ├── mem_cache_store_test.rb
│ ├── normalize_test.rb
│ ├── open_id_authentication_test.rb
│ ├── status_test.rb
│ └── test_helper.rb
├── pickle/
│ ├── History.txt
│ ├── License.txt
│ ├── README.rdoc
│ ├── Rakefile
│ ├── Todo.txt
│ ├── VERSION
│ ├── features/
│ │ ├── app/
│ │ │ ├── app.rb
│ │ │ ├── blueprints.rb
│ │ │ ├── factories.rb
│ │ │ └── views/
│ │ │ └── notifier/
│ │ │ ├── email.erb
│ │ │ └── user_email.erb
│ │ ├── email/
│ │ │ └── email.feature
│ │ ├── generator/
│ │ │ └── generators.feature
│ │ ├── path/
│ │ │ ├── models_page.feature
│ │ │ └── named_route_page.feature
│ │ ├── pickle/
│ │ │ ├── create_from_active_record.feature
│ │ │ ├── create_from_factory_girl.feature
│ │ │ └── create_from_machinist.feature
│ │ ├── step_definitions/
│ │ │ ├── email_steps.rb
│ │ │ ├── extra_email_steps.rb
│ │ │ ├── fork_steps.rb
│ │ │ ├── generator_steps.rb
│ │ │ ├── path_steps.rb
│ │ │ └── pickle_steps.rb
│ │ └── support/
│ │ ├── env.rb
│ │ └── paths.rb
│ ├── garlic.rb
│ ├── init.rb
│ ├── lib/
│ │ ├── pickle/
│ │ │ ├── adapter.rb
│ │ │ ├── config.rb
│ │ │ ├── email/
│ │ │ │ ├── parser.rb
│ │ │ │ └── world.rb
│ │ │ ├── email.rb
│ │ │ ├── parser/
│ │ │ │ └── matchers.rb
│ │ │ ├── parser.rb
│ │ │ ├── path/
│ │ │ │ └── world.rb
│ │ │ ├── path.rb
│ │ │ ├── session/
│ │ │ │ └── parser.rb
│ │ │ ├── session.rb
│ │ │ ├── version.rb
│ │ │ └── world.rb
│ │ └── pickle.rb
│ ├── pickle.gemspec
│ ├── rails_generators/
│ │ └── pickle/
│ │ ├── pickle_generator.rb
│ │ └── templates/
│ │ ├── email_steps.rb
│ │ ├── env.rb
│ │ ├── paths.rb
│ │ └── pickle_steps.rb
│ └── spec/
│ ├── lib/
│ │ ├── pickle_adapter_spec.rb
│ │ ├── pickle_config_spec.rb
│ │ ├── pickle_email_parser_spec.rb
│ │ ├── pickle_email_spec.rb
│ │ ├── pickle_parser_matchers_spec.rb
│ │ ├── pickle_parser_spec.rb
│ │ ├── pickle_path_spec.rb
│ │ ├── pickle_session_spec.rb
│ │ └── pickle_spec.rb
│ └── spec_helper.rb
├── prepend_engine_views/
│ └── init.rb
├── redmine_s3/
│ ├── README.rdoc
│ ├── config/
│ │ ├── locales/
│ │ │ └── en.yml
│ │ └── s3.yml.example
│ ├── init.rb
│ ├── lang/
│ │ └── en.yml
│ ├── lib/
│ │ ├── S3.rb
│ │ ├── redmine_s3/
│ │ │ └── connection.rb
│ │ └── s3_helper.rb
│ └── test/
│ └── test_helper.rb
├── rfpdf/
│ ├── CHANGELOG
│ ├── MIT-LICENSE
│ ├── README
│ ├── init.rb
│ ├── lib/
│ │ ├── rfpdf/
│ │ │ ├── bookmark.rb
│ │ │ ├── chinese.rb
│ │ │ ├── errors.rb
│ │ │ ├── fpdf.rb
│ │ │ ├── fpdf_eps.rb
│ │ │ ├── japanese.rb
│ │ │ ├── korean.rb
│ │ │ ├── makefont.rb
│ │ │ ├── rfpdf.rb
│ │ │ └── view.rb
│ │ └── rfpdf.rb
│ └── test/
│ └── test_helper.rb
├── ruby-net-ldap-0.0.4/
│ ├── COPYING
│ ├── ChangeLog
│ ├── LICENCE
│ ├── README
│ ├── lib/
│ │ └── net/
│ │ ├── ber.rb
│ │ ├── ldap/
│ │ │ ├── dataset.rb
│ │ │ ├── entry.rb
│ │ │ ├── filter.rb
│ │ │ ├── pdu.rb
│ │ │ └── psw.rb
│ │ ├── ldap.rb
│ │ └── ldif.rb
│ └── tests/
│ ├── testber.rb
│ ├── testdata.ldif
│ ├── testem.rb
│ ├── testfilter.rb
│ ├── testldap.rb
│ ├── testldif.rb
│ └── testpsw.rb
├── seed_dump/
│ ├── CHANGELOG.rdoc
│ ├── MIT-LICENSE
│ ├── README.rdoc
│ ├── Rakefile
│ ├── VERSION
│ ├── lib/
│ │ ├── seed_dump/
│ │ │ └── railtie.rb
│ │ ├── seed_dump.rb
│ │ └── tasks/
│ │ └── seed_dump.rake
│ ├── seed_dump.gemspec
│ └── test/
│ ├── seed_dump_test.rb
│ └── test_helper.rb
├── selenium-on-rails/
│ ├── CHANGELOG
│ ├── LICENSE-2.0.txt
│ ├── README.md
│ ├── Rakefile
│ ├── doc/
│ │ ├── classes/
│ │ │ ├── SeleniumController.html
│ │ │ ├── SeleniumHelper.html
│ │ │ ├── SeleniumOnRails/
│ │ │ │ ├── FixtureLoader.html
│ │ │ │ ├── PartialsSupport.html
│ │ │ │ ├── Paths.html
│ │ │ │ ├── RSelenese.html
│ │ │ │ ├── Renderer.html
│ │ │ │ ├── Selenese.html
│ │ │ │ ├── SuiteRenderer.html
│ │ │ │ ├── TestBuilder.html
│ │ │ │ ├── TestBuilderAccessors.html
│ │ │ │ ├── TestBuilderActions.html
│ │ │ │ ├── TestBuilderUserAccessors.html
│ │ │ │ └── TestBuilderUserActions.html
│ │ │ ├── SeleniumOnRails.html
│ │ │ └── SeleniumOnRailsConfig.html
│ │ ├── files/
│ │ │ ├── CHANGELOG.html
│ │ │ ├── README.html
│ │ │ └── lib/
│ │ │ ├── controllers/
│ │ │ │ └── selenium_controller_rb.html
│ │ │ ├── selenium_helper_rb.html
│ │ │ ├── selenium_on_rails/
│ │ │ │ ├── acceptance_test_runner_rb.html
│ │ │ │ ├── fixture_loader_rb.html
│ │ │ │ ├── partials_support_rb.html
│ │ │ │ ├── paths_rb.html
│ │ │ │ ├── renderer_rb.html
│ │ │ │ ├── rselenese_rb.html
│ │ │ │ ├── selenese_rb.html
│ │ │ │ ├── suite_renderer_rb.html
│ │ │ │ ├── test_builder_accessors_rb.html
│ │ │ │ ├── test_builder_actions_rb.html
│ │ │ │ └── test_builder_rb.html
│ │ │ ├── selenium_on_rails_config_rb.html
│ │ │ └── selenium_on_rails_rb.html
│ │ ├── fr_class_index.html
│ │ ├── fr_file_index.html
│ │ ├── fr_method_index.html
│ │ ├── index.html
│ │ └── rdoc-style.css
│ ├── generators/
│ │ └── selenium/
│ │ ├── USAGE
│ │ ├── selenium_generator.rb
│ │ └── templates/
│ │ ├── rhtml.html.erb
│ │ ├── rselenese.html.erb
│ │ └── selenese.html.erb
│ ├── init.rb
│ ├── lib/
│ │ ├── controllers/
│ │ │ ├── selenium_controller.rb
│ │ │ └── switch_environment_controller.rb
│ │ ├── selenium_helper.rb
│ │ ├── selenium_on_rails/
│ │ │ ├── acceptance_test_runner.rb
│ │ │ ├── fixture_loader.rb
│ │ │ ├── partials_support.rb
│ │ │ ├── paths.rb
│ │ │ ├── renderer.rb
│ │ │ ├── rselenese.rb
│ │ │ ├── selenese.rb
│ │ │ ├── suite_renderer.rb
│ │ │ ├── tasks/
│ │ │ │ └── test_acceptance.rake
│ │ │ ├── test_builder.rb
│ │ │ ├── test_builder_accessors.rb
│ │ │ ├── test_builder_actions.rb
│ │ │ ├── test_builder_user_accessors.rb.example
│ │ │ └── test_builder_user_actions.rb.example
│ │ ├── selenium_on_rails.rb
│ │ ├── selenium_on_rails_config.rb
│ │ └── views/
│ │ ├── layouts/
│ │ │ └── layout.html.erb
│ │ ├── record.html.erb
│ │ ├── selenium_helper.rb
│ │ ├── setup.html.erb
│ │ └── test_suite.html.erb
│ ├── log/
│ │ └── default.yml
│ ├── routes.rb
│ ├── selenium-core/
│ │ ├── Blank.html
│ │ ├── InjectedRemoteRunner.html
│ │ ├── RemoteRunner.html
│ │ ├── SeleniumLog.html
│ │ ├── TestPrompt.html
│ │ ├── TestRunner-splash.html
│ │ ├── TestRunner.hta
│ │ ├── TestRunner.html
│ │ ├── domviewer/
│ │ │ ├── domviewer.css
│ │ │ ├── domviewer.html
│ │ │ └── selenium-domviewer.js
│ │ ├── iedoc-core.xml
│ │ ├── iedoc.xml
│ │ ├── lib/
│ │ │ ├── cssQuery/
│ │ │ │ ├── cssQuery-p.js
│ │ │ │ └── src/
│ │ │ │ ├── cssQuery-level2.js
│ │ │ │ ├── cssQuery-level3.js
│ │ │ │ ├── cssQuery-standard.js
│ │ │ │ └── cssQuery.js
│ │ │ ├── prototype.js
│ │ │ ├── scriptaculous/
│ │ │ │ ├── builder.js
│ │ │ │ ├── controls.js
│ │ │ │ ├── dragdrop.js
│ │ │ │ ├── effects.js
│ │ │ │ ├── scriptaculous.js
│ │ │ │ ├── slider.js
│ │ │ │ └── unittest.js
│ │ │ └── snapsie.js
│ │ ├── scripts/
│ │ │ ├── find_matching_child.js
│ │ │ ├── htmlutils.js
│ │ │ ├── injection.html
│ │ │ ├── selenium-api.js
│ │ │ ├── selenium-browserbot.js
│ │ │ ├── selenium-browserdetect.js
│ │ │ ├── selenium-commandhandlers.js
│ │ │ ├── selenium-executionloop.js
│ │ │ ├── selenium-logging.js
│ │ │ ├── selenium-remoterunner.js
│ │ │ ├── selenium-testrunner.js
│ │ │ ├── selenium-version.js
│ │ │ ├── ui-doc.html
│ │ │ ├── ui-element.js
│ │ │ ├── ui-map-sample.js
│ │ │ ├── user-extensions.js
│ │ │ ├── user-extensions.js.sample
│ │ │ └── xmlextras.js
│ │ ├── selenium-test.css
│ │ ├── selenium.css
│ │ └── xpath/
│ │ ├── dom.js
│ │ ├── javascript-xpath-0.1.11.js
│ │ ├── util.js
│ │ ├── xmltoken.js
│ │ └── xpath.js
│ ├── selenium.yml
│ ├── test/
│ │ ├── fixtures/
│ │ │ ├── config.yml
│ │ │ └── selenium.yml
│ │ ├── paths_test.rb
│ │ ├── renderer_test.rb
│ │ ├── rselenese_test.rb
│ │ ├── selenese_test.rb
│ │ ├── selenium_controller_test.rb
│ │ ├── selenium_on_rails_config_test.rb
│ │ ├── selenium_support_test.rb
│ │ ├── setup_test.rb
│ │ ├── suite_renderer_test.rb
│ │ ├── switch_environment_controller_test.rb
│ │ ├── test_builder_functions_authortest.rb
│ │ └── test_helper.rb
│ └── test_data/
│ ├── _partial.rsel
│ ├── backup.html~
│ ├── own_layout.html
│ ├── partials/
│ │ ├── _html.html
│ │ ├── _nesting.rsel
│ │ ├── _rhtml.html.erb
│ │ ├── _rsel.rsel
│ │ ├── _sel.sel
│ │ └── all_partials.rsel
│ ├── rhtml.html.erb
│ ├── rselenese.rsel
│ ├── selenese.sel
│ ├── suite_one/
│ │ ├── subsuite/
│ │ │ └── suite_one_subsuite_testcase.sel
│ │ ├── suite_one_testcase1.sel
│ │ └── suite_one_testcase2.sel
│ └── suite_two/
│ └── suite_two_testcase.sel
├── simple-private-messages/
│ ├── MIT-LICENSE
│ ├── README.rdoc
│ ├── Rakefile
│ ├── generators/
│ │ ├── private_message_model/
│ │ │ ├── USAGE
│ │ │ ├── private_message_model_generator.rb
│ │ │ └── templates/
│ │ │ ├── migration.rb
│ │ │ └── model.rb
│ │ └── private_message_scaffold/
│ │ ├── USAGE
│ │ ├── private_message_scaffold_generator.rb
│ │ └── templates/
│ │ ├── controller.rb
│ │ ├── view_index.html.erb
│ │ ├── view_index_inbox.html.erb
│ │ ├── view_index_sent.html.erb
│ │ ├── view_new.html.erb
│ │ └── view_show.html.erb
│ ├── init.rb
│ ├── lib/
│ │ └── professionalnerd/
│ │ └── simple_private_messages/
│ │ ├── has_private_messages_extensions.rb
│ │ ├── private_message_extensions.rb
│ │ └── tasks/
│ │ └── simple_private_messages_tasks.rake
│ └── test/
│ ├── database.yml
│ ├── fixtures/
│ │ ├── message.rb
│ │ └── user.rb
│ ├── schema.rb
│ ├── test_helper.rb
│ └── unit/
│ ├── message_model.rb
│ └── user_model.rb
├── textile-editor-helper/
│ ├── CHANGELOG
│ ├── MIT-LICENSE
│ ├── README
│ ├── Rakefile
│ ├── assets/
│ │ ├── javascripts/
│ │ │ ├── textile-editor-config.js
│ │ │ └── textile-editor.js
│ │ └── stylesheets/
│ │ └── textile-editor.css
│ ├── init.rb
│ ├── install.rb
│ ├── lib/
│ │ ├── tasks/
│ │ │ └── textile_editor_helper_tasks.rake
│ │ └── textile_editor_helper.rb
│ └── test/
│ ├── abstract_unit.rb
│ └── textile_editor_helper_test.rb
└── yaml_db/
├── README
├── Rakefile
├── about.yml
├── init.rb
├── lib/
│ ├── tasks/
│ │ └── yaml_db_tasks.rake
│ └── yaml_db.rb
└── spec/
├── base.rb
├── yaml_dump_spec.rb
├── yaml_load_spec.rb
└── yaml_utils_spec.rb
Showing preview only (453K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (6068 symbols across 633 files)
FILE: app/controllers/account_controller.rb
class AccountController (line 2) | class AccountController < ApplicationController
method login (line 12) | def login
method rpx_token (line 25) | def rpx_token
method logout (line 32) | def logout
method lost_password (line 40) | def lost_password
method register (line 46) | def register
method activate (line 60) | def activate
method cancel (line 73) | def cancel
method password_authentication (line 80) | def password_authentication(invitation_token=nil)
method open_id_authenticate (line 94) | def open_id_authenticate(openid_url)
method successful_authentication (line 135) | def successful_authentication(user, invitation_token = nil, msg=nil)
method onthefly_creation_failed (line 159) | def onthefly_creation_failed(user, auth_source_options = { })
method invalid_credentials (line 165) | def invalid_credentials
method inactive_user (line 171) | def inactive_user
method register_by_email_activation (line 179) | def register_by_email_activation(user, invitation_token = nil)
method register_automatically (line 208) | def register_automatically(user, &block)
method register_manually_by_administrator (line 226) | def register_manually_by_administrator(user, &block)
method account_pending (line 236) | def account_pending
method random_email (line 241) | def random_email
method data (line 245) | def data
method invitation (line 251) | def invitation
method invitation_mail (line 260) | def invitation_mail
method update_invitation (line 264) | def update_invitation
method find_user_by_identifier (line 268) | def find_user_by_identifier
method find_user_by_mail (line 275) | def find_user_by_mail
method create_new_user (line 282) | def create_new_user
method reactivate_user (line 292) | def reactivate_user
method save_user_or_raise (line 299) | def save_user_or_raise
method name (line 307) | def name
method mail (line 311) | def mail
method available_login (line 317) | def available_login
method logout_user (line 323) | def logout_user
method set_invitation_token (line 327) | def set_invitation_token
method open_id_authenticate? (line 332) | def open_id_authenticate?
method update_password (line 336) | def update_password
method valid_user (line 349) | def valid_user
method valid_token (line 363) | def valid_token
method token (line 372) | def token
method find_token (line 377) | def find_token(action)
method send_mail (line 383) | def send_mail(token)
method validate_token (line 389) | def validate_token
method create_token (line 398) | def create_token
method pick_plan (line 405) | def pick_plan
method register_user (line 415) | def register_user
method invite_to_login (line 432) | def invite_to_login
method initialize_user_with_plan (line 442) | def initialize_user_with_plan
method register_user_with_auth_source (line 453) | def register_user_with_auth_source
method logout_and_invite (line 469) | def logout_and_invite
method check_registration (line 477) | def check_registration
method can_activate? (line 481) | def can_activate?
method valid_register_token? (line 485) | def valid_register_token?
method registered_user (line 490) | def registered_user
FILE: app/controllers/activity_stream_preferences_controller.rb
class ActivityStreamPreferencesController (line 7) | class ActivityStreamPreferencesController < ApplicationController
FILE: app/controllers/activity_stream_preferences_module.rb
type ActivityStreamPreferencesModule (line 11) | module ActivityStreamPreferencesModule
function index (line 13) | def index
function create (line 38) | def create
function get_user_id (line 88) | def get_user_id
function build_activities_hash (line 96) | def build_activities_hash
FILE: app/controllers/activity_streams_controller.rb
class ActivityStreamsController (line 7) | class ActivityStreamsController < ApplicationController
method index (line 13) | def index
FILE: app/controllers/activity_streams_module.rb
type ActivityStreamsModule (line 9) | module ActivityStreamsModule
function index (line 11) | def index
function show (line 20) | def show
function new (line 29) | def new
function edit (line 38) | def edit
function create (line 42) | def create
function update (line 57) | def update
function destroy (line 72) | def destroy
FILE: app/controllers/admin_controller.rb
class AdminController (line 4) | class AdminController < ApplicationController
method index (line 13) | def index
method projects (line 17) | def projects
method plugins (line 32) | def plugins
method default_configuration (line 38) | def default_configuration
method test_email (line 50) | def test_email
method user_data_dump (line 64) | def user_data_dump
method info (line 69) | def info
FILE: app/controllers/application_controller.rb
class ApplicationController (line 8) | class ApplicationController < ActionController::Base
method delete_broken_cookies (line 24) | def delete_broken_cookies
method set_user_ip (line 42) | def set_user_ip
method user_setup (line 46) | def user_setup
method redirect_with_flash (line 53) | def redirect_with_flash(flash_type,msg,*params)
method current_user (line 58) | def current_user
method find_current_user (line 64) | def find_current_user
method logged_user= (line 90) | def logged_user=(user)
method check_if_login_required (line 104) | def check_if_login_required
method set_localization (line 110) | def set_localization
method data_admin_logged_in? (line 119) | def data_admin_logged_in?
method require_login (line 124) | def require_login
method require_admin (line 142) | def require_admin
method deny_access (line 151) | def deny_access
method authorize (line 156) | def authorize(ctrl = params[:controller], action = params[:action], gl...
method authorize_global (line 163) | def authorize_global(ctrl = params[:controller], action = params[:acti...
method check_project_privacy (line 169) | def check_project_privacy
method redirect_back_or_default (line 183) | def redirect_back_or_default(default)
method render_403 (line 201) | def render_403
method render_404 (line 207) | def render_404
method render_error (line 212) | def render_error(msg)
method render_message (line 217) | def render_message(msg)
method invalid_authenticity_token (line 222) | def invalid_authenticity_token
method render_feed (line 226) | def render_feed(items, options={})
method accept_key_auth (line 234) | def self.accept_key_auth(*actions)
method accept_key_auth_actions (line 239) | def accept_key_auth_actions
method attach_files_for_new_issue (line 243) | def attach_files_for_new_issue(issue,attachment_ids)
method attach_files (line 250) | def attach_files(obj, attachments)
method attach_temp_files (line 270) | def attach_temp_files(obj, attachments)
method cleanup_newline (line 293) | def cleanup_newline(text)
method simple_format_without_paragraph (line 299) | def simple_format_without_paragraph(text)
method per_page_option (line 308) | def per_page_option
method parse_qvalues (line 323) | def parse_qvalues(value)
method filename_for_content_disposition (line 343) | def filename_for_content_disposition(name)
method bp (line 348) | def bp
FILE: app/controllers/attachments_controller.rb
class AttachmentsController (line 5) | class AttachmentsController < ApplicationController
method create (line 18) | def create
method redirect_to_s3 (line 34) | def redirect_to_s3
method show (line 42) | def show
method download (line 54) | def download
method destroy (line 65) | def destroy
method find_project (line 75) | def find_project
method file_readable (line 85) | def file_readable
method read_authorize (line 89) | def read_authorize
method delete_authorize (line 93) | def delete_authorize
FILE: app/controllers/auth_sources_controller.rb
class AuthSourcesController (line 4) | class AuthSourcesController < ApplicationController
method index (line 10) | def index
method list (line 19) | def list
method new (line 24) | def new
method create (line 28) | def create
method edit (line 38) | def edit
method update (line 42) | def update
method test_connection (line 52) | def test_connection
method destroy (line 63) | def destroy
FILE: app/controllers/boards_controller.rb
class BoardsController (line 4) | class BoardsController < ApplicationController
method index (line 16) | def index
method show (line 25) | def show
method new (line 47) | def new
method edit (line 56) | def edit
method destroy (line 62) | def destroy
method find_project (line 69) | def find_project
FILE: app/controllers/comments_controller.rb
class CommentsController (line 1) | class CommentsController < ApplicationController
method index (line 13) | def index
method create (line 20) | def create
method find_issue (line 30) | def find_issue
method find_project (line 34) | def find_project
FILE: app/controllers/credit_distributions_controller.rb
class CreditDistributionsController (line 1) | class CreditDistributionsController < ApplicationController
method index (line 6) | def index
method show (line 15) | def show
method new (line 24) | def new
method edit (line 33) | def edit
method create (line 37) | def create
method update (line 52) | def update
method destroy (line 67) | def destroy
FILE: app/controllers/credit_transfers_controller.rb
class CreditTransfersController (line 5) | class CreditTransfersController < ApplicationController
method index (line 9) | def index
method create (line 27) | def create
method eligible_recipients (line 45) | def eligible_recipients
FILE: app/controllers/credits_controller.rb
class CreditsController (line 1) | class CreditsController < ApplicationController
method index (line 9) | def index
method show (line 23) | def show
method new (line 32) | def new
method edit (line 41) | def edit
method create (line 45) | def create
method update (line 60) | def update
method disable (line 75) | def disable
method enable (line 93) | def enable
method update_credit_partials (line 111) | def update_credit_partials
method destroy (line 127) | def destroy
method find_credit (line 139) | def find_credit
method self_authorize (line 145) | def self_authorize
FILE: app/controllers/documents_controller.rb
class DocumentsController (line 4) | class DocumentsController < ApplicationController
method index (line 18) | def index
method show (line 35) | def show
method new (line 39) | def new
method edit (line 48) | def edit
method destroy (line 55) | def destroy
method add_attachment (line 60) | def add_attachment
method find_project (line 68) | def find_project
method find_document (line 75) | def find_document
FILE: app/controllers/email_updates_controller.rb
class EmailUpdatesController (line 1) | class EmailUpdatesController < ApplicationController
method new (line 5) | def new
method create (line 14) | def create
method activate (line 29) | def activate
FILE: app/controllers/enterprises_controller.rb
class EnterprisesController (line 1) | class EnterprisesController < ApplicationController
method index (line 4) | def index
method show (line 13) | def show
method new (line 22) | def new
method edit (line 31) | def edit
method create (line 35) | def create
method update (line 50) | def update
method destroy (line 65) | def destroy
FILE: app/controllers/enumerations_controller.rb
class EnumerationsController (line 4) | class EnumerationsController < ApplicationController
method index (line 10) | def index
method list (line 19) | def list
method new (line 22) | def new
method create (line 30) | def create
method edit (line 41) | def edit
method update (line 45) | def update
method destroy (line 56) | def destroy
FILE: app/controllers/help_controller.rb
class HelpController (line 1) | class HelpController < ApplicationController
method show (line 2) | def show
FILE: app/controllers/help_sections_controller.rb
class HelpSectionsController (line 1) | class HelpSectionsController < ApplicationController
method show (line 5) | def show
method dont_show (line 17) | def dont_show
method new (line 29) | def new
method edit (line 38) | def edit
method create (line 42) | def create
method update (line 57) | def update
method destroy (line 72) | def destroy
FILE: app/controllers/home_controller.rb
class HomeController (line 1) | class HomeController < ApplicationController
method index (line 4) | def index
method show (line 12) | def show
method robots (line 16) | def robots
FILE: app/controllers/hourly_types_controller.rb
class HourlyTypesController (line 1) | class HourlyTypesController < ApplicationController
method new (line 5) | def new
method edit (line 14) | def edit
method destroy (line 20) | def destroy
method find_project (line 27) | def find_project
FILE: app/controllers/invitations_controller.rb
class InvitationsController (line 1) | class InvitationsController < ApplicationController
method index (line 6) | def index
method show (line 19) | def show
method new (line 28) | def new
method edit (line 42) | def edit
method create (line 46) | def create
method accept (line 91) | def accept
method resend (line 122) | def resend
method destroy (line 149) | def destroy
method find_project (line 166) | def find_project
method valid_email? (line 173) | def valid_email?(email)
FILE: app/controllers/issue_invitations_controller.rb
class IssueInvitationsController (line 4) | class IssueInvitationsController < ApplicationController
method new (line 5) | def new
method create (line 14) | def create
FILE: app/controllers/issue_relations_controller.rb
class IssueRelationsController (line 6) | class IssueRelationsController < ApplicationController
method new (line 10) | def new
method destroy (line 31) | def destroy
method find_project (line 45) | def find_project
FILE: app/controllers/issue_statuses_controller.rb
class IssueStatusesController (line 4) | class IssueStatusesController < ApplicationController
method index (line 13) | def index
method list (line 18) | def list
method new (line 23) | def new
method create (line 27) | def create
method edit (line 37) | def edit
method update (line 41) | def update
method destroy (line 51) | def destroy
FILE: app/controllers/issue_votes_controller.rb
class IssueVotesController (line 1) | class IssueVotesController < ApplicationController
method index (line 4) | def index
method show (line 13) | def show
method new (line 22) | def new
method edit (line 31) | def edit
method create (line 35) | def create
method update (line 50) | def update
method destroy (line 65) | def destroy
FILE: app/controllers/issues_controller.rb
class IssuesController (line 4) | class IssuesController < ApplicationController
method index (line 62) | def index
method show (line 96) | def show
method new (line 111) | def new
method edit (line 193) | def edit
method start (line 228) | def start
method finish (line 241) | def finish
method release (line 250) | def release
method cancel (line 270) | def cancel
method restart (line 275) | def restart
method change_status (line 280) | def change_status
method prioritize (line 299) | def prioritize
method update_tags (line 310) | def update_tags
method estimate (line 320) | def estimate
method agree (line 344) | def agree
method accept (line 373) | def accept
method join (line 402) | def join
method add_team_member (line 421) | def add_team_member
method remove_team_member (line 444) | def remove_team_member
method leave (line 465) | def leave
method reply (line 485) | def reply
method bulk_edit (line 505) | def bulk_edit
method move (line 538) | def move
method destroy (line 596) | def destroy
method gantt (line 601) | def gantt
method calendar (line 629) | def calendar
method context_menu (line 653) | def context_menu
method update_form (line 680) | def update_form
method preview (line 693) | def preview
method datadump (line 700) | def datadump
method find_issue (line 707) | def find_issue
method find_issues (line 717) | def find_issues
method find_project (line 732) | def find_project
method find_optional_project (line 739) | def find_optional_project
method retrieve_query (line 748) | def retrieve_query
method query_statement_invalid (line 782) | def query_statement_invalid(exception)
FILE: app/controllers/journals_controller.rb
class JournalsController (line 5) | class JournalsController < ApplicationController
method edit (line 9) | def edit
method edit_from_dashboard (line 25) | def edit_from_dashboard
method update_activity_stream (line 36) | def update_activity_stream(notes)
method find_journal (line 44) | def find_journal
FILE: app/controllers/mail_handler_controller.rb
class MailHandlerController (line 5) | class MailHandlerController < ActionController::Base
method index (line 14) | def index
method sendgrid (line 25) | def sendgrid
method check_credential (line 49) | def check_credential
FILE: app/controllers/mails_controller.rb
class MailsController (line 1) | class MailsController < ApplicationController
method index (line 5) | def index
method show (line 13) | def show
method new (line 17) | def new
method create (line 30) | def create
method delete_selected (line 43) | def delete_selected
method set_user (line 58) | def set_user
FILE: app/controllers/members_controller.rb
class MembersController (line 4) | class MembersController < ApplicationController
method new (line 10) | def new
method edit (line 34) | def edit
method destroy (line 48) | def destroy
method autocomplete_for_member (line 58) | def autocomplete_for_member
method find_project (line 65) | def find_project
method find_member (line 71) | def find_member
FILE: app/controllers/messages_controller.rb
class MessagesController (line 4) | class MessagesController < ApplicationController
method show (line 29) | def show
method new (line 37) | def new
method reply (line 52) | def reply
method edit (line 68) | def edit
method destroy (line 83) | def destroy
method quote (line 91) | def quote
method preview (line 107) | def preview
method find_message (line 116) | def find_message
method guess_board (line 131) | def guess_board
method find_board (line 140) | def find_board
FILE: app/controllers/motion_votes_controller.rb
class MotionVotesController (line 1) | class MotionVotesController < ApplicationController
method index (line 4) | def index
method show (line 13) | def show
method new (line 22) | def new
method edit (line 31) | def edit
method create (line 35) | def create
method update (line 58) | def update
method destroy (line 73) | def destroy
FILE: app/controllers/motions_controller.rb
class MotionsController (line 1) | class MotionsController < ApplicationController
method index (line 11) | def index
method show (line 19) | def show
method new (line 40) | def new
method eligible_users (line 51) | def eligible_users
method edit (line 72) | def edit
method create (line 75) | def create
method update (line 98) | def update
method destroy (line 111) | def destroy
method reply (line 121) | def reply
method find_project (line 137) | def find_project
method find_motion (line 144) | def find_motion
method check_visibility_permission (line 152) | def check_visibility_permission
FILE: app/controllers/my_controller.rb
class MyController (line 4) | class MyController < ApplicationController
method index (line 26) | def index
method page (line 32) | def page
method projects (line 37) | def projects
method issues (line 45) | def issues
method account (line 71) | def account
method upgrade (line 113) | def upgrade
method password (line 216) | def password
method reset_rss_key (line 237) | def reset_rss_key
method reset_api_key (line 250) | def reset_api_key
method page_layout (line 263) | def page_layout
method add_block (line 273) | def add_block
method remove_block (line 289) | def remove_block
method order_blocks (line 303) | def order_blocks
FILE: app/controllers/news_controller.rb
class NewsController (line 4) | class NewsController < ApplicationController
method index (line 22) | def index
method show (line 35) | def show
method new (line 40) | def new
method edit (line 51) | def edit
method add_comment (line 58) | def add_comment
method destroy_comment (line 70) | def destroy_comment
method destroy (line 75) | def destroy
method preview (line 80) | def preview
method find_news (line 87) | def find_news
method find_project (line 95) | def find_project
method find_optional_project (line 102) | def find_optional_project
FILE: app/controllers/notifications_controller.rb
class NotificationsController (line 1) | class NotificationsController < ApplicationController
method index (line 3) | def index
method show (line 14) | def show
method new (line 23) | def new
method edit (line 32) | def edit
method create (line 36) | def create
method update (line 51) | def update
method hide (line 65) | def hide
method destroy (line 80) | def destroy
FILE: app/controllers/projects_controller.rb
class ProjectsController (line 4) | class ProjectsController < ApplicationController
method index (line 42) | def index
method index_latest (line 47) | def index_latest
method index_active (line 64) | def index_active
method map (line 81) | def map
method add (line 86) | def add
method copy (line 133) | def copy
method reset_invitation_token (line 159) | def reset_invitation_token
method join (line 175) | def join
method overview (line 196) | def overview
method hourly_types (line 221) | def hourly_types
method community_members (line 228) | def community_members
method community_members_array (line 235) | def community_members_array
method issue_search (line 242) | def issue_search
method all_tags (line 247) | def all_tags
method dashboard (line 252) | def dashboard
method dashdata (line 259) | def dashdata
method new_dashdata (line 288) | def new_dashdata
method update_scale (line 342) | def update_scale
method mypris (line 351) | def mypris
method settings (line 355) | def settings
method edit (line 363) | def edit
method modules (line 388) | def modules
method archive (line 395) | def archive
method unarchive (line 405) | def unarchive
method destroy (line 433) | def destroy
method move (line 449) | def move
method add_file (line 469) | def add_file
method list_files (line 481) | def list_files
method team (line 492) | def team
method credits (line 497) | def credits
method activity (line 509) | def activity
method find_project (line 517) | def find_project
method find_optional_project (line 529) | def find_optional_project
method retrieve_selected_tracker_ids (line 537) | def retrieve_selected_tracker_ids(selectable_trackers, default_tracker...
method validate_parent_id (line 547) | def validate_parent_id
FILE: app/controllers/queries_controller.rb
class QueriesController (line 4) | class QueriesController < ApplicationController
method new (line 9) | def new
method edit (line 29) | def edit
method destroy (line 47) | def destroy
method find_query (line 54) | def find_query
method find_optional_project (line 62) | def find_optional_project
FILE: app/controllers/quotes_controller.rb
class QuotesController (line 1) | class QuotesController < ApplicationController
method index (line 4) | def index
method show (line 13) | def show
method new (line 22) | def new
method edit (line 31) | def edit
method create (line 35) | def create
method update (line 51) | def update
method destroy (line 66) | def destroy
FILE: app/controllers/recurly_notifications_controller.rb
class RecurlyNotificationsController (line 4) | class RecurlyNotificationsController < ApplicationController
method listen (line 5) | def listen
method update_subscription (line 24) | def update_subscription(params,active_subscription)
FILE: app/controllers/reports_controller.rb
class ReportsController (line 4) | class ReportsController < ApplicationController
method issue_report (line 8) | def issue_report
method find_project (line 54) | def find_project
method issues_by_tracker (line 60) | def issues_by_tracker
method issues_by_assigned_to (line 75) | def issues_by_assigned_to
method issues_by_author (line 90) | def issues_by_author
method issues_by_subproject (line 105) | def issues_by_subproject
FILE: app/controllers/reputations_controller.rb
class ReputationsController (line 1) | class ReputationsController < ApplicationController
method index (line 4) | def index
method show (line 13) | def show
method new (line 22) | def new
method edit (line 31) | def edit
method create (line 35) | def create
method update (line 50) | def update
method destroy (line 65) | def destroy
FILE: app/controllers/retro_ratings_controller.rb
class RetroRatingsController (line 1) | class RetroRatingsController < ApplicationController
method index (line 4) | def index
method show (line 13) | def show
method new (line 22) | def new
method edit (line 31) | def edit
method create (line 35) | def create
method update (line 59) | def update
method destroy (line 74) | def destroy
FILE: app/controllers/retros_controller.rb
class RetrosController (line 1) | class RetrosController < ApplicationController
method index (line 7) | def index
method index_json (line 16) | def index_json
method dashdata (line 20) | def dashdata
method show (line 24) | def show
method new (line 220) | def new
method edit (line 229) | def edit
method create (line 233) | def create
method update (line 248) | def update
method destroy (line 263) | def destroy
method find_retro (line 275) | def find_retro
method find_project (line 282) | def find_project
FILE: app/controllers/roles_controller.rb
class RolesController (line 4) | class RolesController < ApplicationController
method index (line 13) | def index
method list (line 18) | def list
method new (line 23) | def new
method edit (line 38) | def edit
method destroy (line 47) | def destroy
method report (line 56) | def report
FILE: app/controllers/search_controller.rb
class SearchController (line 4) | class SearchController < ApplicationController
method index (line 11) | def index
method find_optional_project (line 97) | def find_optional_project
FILE: app/controllers/settings_controller.rb
class SettingsController (line 17) | class SettingsController < ApplicationController
method index (line 22) | def index
method edit (line 27) | def edit
method plugin (line 48) | def plugin
FILE: app/controllers/shares_controller.rb
class SharesController (line 1) | class SharesController < ApplicationController
method index (line 4) | def index
method show (line 14) | def show
method new (line 23) | def new
method edit (line 32) | def edit
method create (line 36) | def create
method update (line 51) | def update
method destroy (line 66) | def destroy
FILE: app/controllers/todos_controller.rb
class TodosController (line 1) | class TodosController < ApplicationController
method index (line 7) | def index
method show (line 16) | def show
method new (line 25) | def new
method edit (line 34) | def edit
method create (line 38) | def create
method update (line 55) | def update
method destroy (line 71) | def destroy
method find_issue (line 84) | def find_issue
method find_project (line 88) | def find_project
FILE: app/controllers/trackers_controller.rb
class TrackersController (line 4) | class TrackersController < ApplicationController
method index (line 10) | def index
method list (line 17) | def list
method new (line 22) | def new
method edit (line 37) | def edit
method destroy (line 47) | def destroy
FILE: app/controllers/users_controller.rb
class UsersController (line 4) | class UsersController < ApplicationController
method index (line 12) | def index
method show (line 36) | def show
method add (line 57) | def add
method edit (line 76) | def edit
method edit_membership (line 102) | def edit_membership
method destroy_membership (line 118) | def destroy_membership
FILE: app/controllers/votes_controller.rb
class VotesController (line 3) | class VotesController < ApplicationController
method index (line 13) | def index
method show (line 20) | def show
method new (line 29) | def new
method edit (line 32) | def edit
method create (line 35) | def create
method update (line 65) | def update
method destroy (line 68) | def destroy
method find_votes_for_my_scope (line 80) | def find_votes_for_my_scope
method must_own_vote (line 90) | def must_own_vote
method ownership_violation (line 95) | def ownership_violation
FILE: app/controllers/watchers_controller.rb
class WatchersController (line 4) | class WatchersController < ApplicationController
method watch (line 14) | def watch
method unwatch (line 22) | def unwatch
method new (line 26) | def new
method destroy (line 42) | def destroy
method find_project (line 56) | def find_project
method set_watcher (line 65) | def set_watcher(user, watching)
FILE: app/controllers/welcome_controller.rb
class WelcomeController (line 4) | class WelcomeController < ApplicationController
method index (line 10) | def index
method robots (line 27) | def robots
FILE: app/controllers/wiki_controller.rb
class WikiController (line 6) | class WikiController < ApplicationController
method index (line 22) | def index
method edit (line 53) | def edit
method rename (line 92) | def rename
method protect (line 103) | def protect
method history (line 109) | def history
method diff (line 122) | def diff
method annotate (line 127) | def annotate
method destroy (line 134) | def destroy
method special (line 162) | def special
method preview (line 187) | def preview
method add_attachment (line 199) | def add_attachment
method find_wiki (line 207) | def find_wiki
method find_existing_page (line 218) | def find_existing_page
method editable? (line 224) | def editable?(page = @page)
method initial_page_content (line 229) | def initial_page_content(page)
FILE: app/controllers/wikis_controller.rb
class WikisController (line 4) | class WikisController < ApplicationController
method edit (line 10) | def edit
method destroy (line 18) | def destroy
method find_project (line 27) | def find_project
FILE: app/controllers/workflows_controller.rb
class WorkflowsController (line 5) | class WorkflowsController < ApplicationController
method index (line 11) | def index
method edit (line 15) | def edit
method copy (line 41) | def copy
FILE: app/helpers/admin_helper.rb
type AdminHelper (line 4) | module AdminHelper
function project_status_options_for_select (line 5) | def project_status_options_for_select(selected)
function css_project_classes (line 10) | def css_project_classes(project)
FILE: app/helpers/application_helper.rb
type ApplicationHelper (line 9) | module ApplicationHelper
function help_section (line 17) | def help_section(name, popup=false)
function authorize_for (line 37) | def authorize_for(controller, action)
function link_to_if_authorized (line 43) | def link_to_if_authorized(name, options = {}, html_options = nil, *par...
function link_to_if_anon (line 48) | def link_to_if_anon(name, options = {}, html_options = nil, *parameter...
function link_to_remote_if_authorized (line 53) | def link_to_remote_if_authorized(name, options = {}, html_options = nil)
function link_to_user (line 59) | def link_to_user(user, options={})
function link_to_user_or_you (line 72) | def link_to_user_or_you(user, options={})
function link_to_project (line 81) | def link_to_project(project, options={})
function link_to_user_from_id (line 91) | def link_to_user_from_id(user_id, options={})
function link_to_issue (line 103) | def link_to_issue(issue, options={})
function link_to_issue_from_id (line 129) | def link_to_issue_from_id(issue_id, options={})
function link_to_attachment (line 141) | def link_to_attachment(attachment, options={})
function current_user (line 148) | def current_user
function logged_in? (line 152) | def logged_in?
function toggle_link (line 156) | def toggle_link(name, id, options={})
function image_to_function (line 164) | def image_to_function(name, function, html_options = {})
function prompt_to_remote (line 172) | def prompt_to_remote(name, text, param, url, html_options = {})
function prompt_input_to_remote (line 185) | def prompt_input_to_remote(id, name, title, message, param, url, requi...
function format_activity_title (line 190) | def format_activity_title(text)
function format_activity_day (line 194) | def format_activity_day(date)
function format_activity_description (line 198) | def format_activity_description(text)
function make_expandable (line 202) | def make_expandable(newhtml,length=400)
function due_date_distance_in_words (line 220) | def due_date_distance_in_words(date)
function render_page_hierarchy (line 226) | def render_page_hierarchy(pages, node=nil)
function render_flash_messages (line 243) | def render_flash_messages
function render_global_messages (line 251) | def render_global_messages
function render_tabs (line 262) | def render_tabs(tabs)
function render_project_jump_box (line 271) | def render_project_jump_box
function sub_workstream_project_box (line 298) | def sub_workstream_project_box(project)
function project_tree_options_for_select (line 323) | def project_tree_options_for_select(projects, options = {})
function project_tree (line 335) | def project_tree(projects, &block)
function project_tree_sorted (line 346) | def project_tree_sorted(projects, &block)
function sort2d (line 372) | def sort2d(ar)
function traverse_sorted (line 380) | def traverse_sorted(ar, &block)
function show_detail (line 388) | def show_detail(detail, no_html=false)
function format_time_ago (line 448) | def format_time_ago(updated_at)
function project_nested_ul (line 453) | def project_nested_ul(projects, &block)
function users_check_box_tags (line 477) | def users_check_box_tags(name, users)
function truncate_single_line (line 486) | def truncate_single_line(string, *args)
function html_hours (line 490) | def html_hours(text)
function authoring (line 494) | def authoring(created, author, options={})
function time_tag (line 499) | def time_tag(time)
function since_tag (line 508) | def since_tag(time)
function syntax_highlight (line 513) | def syntax_highlight(name, content)
function to_path_param (line 518) | def to_path_param(path)
function pagination_links_full (line 522) | def pagination_links_full(paginator, count=nil, options={})
function per_page_links (line 551) | def per_page_links(selected=nil)
function reorder_links (line 564) | def reorder_links(name, url)
function breadcrumb (line 571) | def breadcrumb(*args)
function other_formats_links (line 576) | def other_formats_links(&block)
function page_header_title (line 582) | def page_header_title
function page_header_name (line 628) | def page_header_name
function html_title (line 645) | def html_title(*args)
function accesskey (line 658) | def accesskey(s)
function textilizable (line 667) | def textilizable(*args)
function simple_format_without_paragraph (line 840) | def simple_format_without_paragraph(text)
function lang_options_for_select (line 847) | def lang_options_for_select(blank=true)
function month_hash (line 852) | def month_hash
function privacy (line 869) | def privacy(project)
function volunteering (line 873) | def volunteering(project)
function year_hash (line 877) | def year_hash
function unit_for (line 881) | def unit_for(project)
function country_hash (line 891) | def country_hash
function label_tag_for (line 1141) | def label_tag_for(name, option_tags = nil, options = {})
function labelled_tabular_form_for (line 1146) | def labelled_tabular_form_for(name, object, options, &proc)
function back_url_hidden_field_tag (line 1152) | def back_url_hidden_field_tag
function check_all_links (line 1158) | def check_all_links(form_name)
function progress_bar (line 1164) | def progress_bar(pcts, options={})
function context_menu_link (line 1180) | def context_menu_link(name, url, options={})
function help_link (line 1196) | def help_link(name, options={})
function help_bubble (line 1201) | def help_bubble(name, options={})
function calendar_for (line 1218) | def calendar_for(field_id)
function include_calendar_headers_tags (line 1224) | def include_calendar_headers_tags
function content_for (line 1246) | def content_for(name, content = nil, &block)
function has_content? (line 1252) | def has_content?(name)
function avatar (line 1258) | def avatar(user, options = { })
function render_journal_details (line 1269) | def render_journal_details(journal)
function link_to_activity (line 1290) | def link_to_activity(as)
function name_for_activity_stream (line 1294) | def name_for_activity_stream(as)
function class_for_activity_stream (line 1298) | def class_for_activity_stream(as)
function url_for_activity_stream (line 1302) | def url_for_activity_stream(as)
function title_for_activity_stream (line 1317) | def title_for_activity_stream(as)
function action_times (line 1330) | def action_times(count)
function avatar_from_id (line 1339) | def avatar_from_id(user_id, options = { })
function button (line 1343) | def button(text, cssclass)
function tally_table (line 1347) | def tally_table(motion)
function tame_bias (line 1364) | def tame_bias(number)
function tame_scale (line 1373) | def tame_scale(number)
function credit_activation_link (line 1383) | def credit_activation_link(credit, project_id, include_sub_workstreams)
function login_protocol (line 1395) | def login_protocol
function wiki_helper (line 1405) | def wiki_helper
function link_to_remote_content_update (line 1411) | def link_to_remote_content_update(text, url_params)
FILE: app/helpers/attachments_helper.rb
type AttachmentsHelper (line 4) | module AttachmentsHelper
function link_to_attachments (line 8) | def link_to_attachments(container, options = {})
function link_to_attachments_table (line 17) | def link_to_attachments_table(container, options = {})
function to_utf8 (line 26) | def to_utf8(str)
FILE: app/helpers/groups_helper.rb
type GroupsHelper (line 4) | module GroupsHelper
function options_for_membership_project_select (line 6) | def options_for_membership_project_select(user, projects)
function group_settings_tabs (line 14) | def group_settings_tabs
FILE: app/helpers/issue_relations_helper.rb
type IssueRelationsHelper (line 4) | module IssueRelationsHelper
function collection_for_relation_type_select (line 5) | def collection_for_relation_type_select
FILE: app/helpers/issues_helper.rb
type IssuesHelper (line 4) | module IssuesHelper
function render_issue_tooltip (line 7) | def render_issue_tooltip(issue)
function sidebar_queries (line 18) | def sidebar_queries
function tags (line 32) | def tags(issue, editable)
function issues_to_csv (line 43) | def issues_to_csv(issues, project = nil)
function collection_for_project_members_select (line 86) | def collection_for_project_members_select
FILE: app/helpers/journals_helper.rb
type JournalsHelper (line 5) | module JournalsHelper
function render_notes (line 6) | def render_notes(journal, editable, options={})
function render_votes (line 25) | def render_votes(journal, options={})
function link_to_in_place_notes_editor (line 51) | def link_to_in_place_notes_editor(text, field_id, url, options={})
FILE: app/helpers/messages_helper.rb
type MessagesHelper (line 4) | module MessagesHelper
function link_to_message (line 6) | def link_to_message(message)
FILE: app/helpers/motions_helper.rb
type MotionsHelper (line 1) | module MotionsHelper
function render_title_date (line 2) | def render_title_date
FILE: app/helpers/my_helper.rb
type MyHelper (line 4) | module MyHelper
function describe (line 5) | def describe(amount)
function my_issues_tabs (line 9) | def my_issues_tabs
function my_projects_tabs (line 45) | def my_projects_tabs
function upgrade_options (line 87) | def upgrade_options(user)
FILE: app/helpers/news_helper.rb
type NewsHelper (line 4) | module NewsHelper
FILE: app/helpers/projects_helper.rb
type ProjectsHelper (line 4) | module ProjectsHelper
function project_settings_tabs (line 5) | def project_settings_tabs
function project_image (line 14) | def project_image(project)
function nomination_links (line 21) | def nomination_links(member,project)
function parent_project_select_tag (line 55) | def parent_project_select_tag(project)
function render_project_hierarchy (line 72) | def render_project_hierarchy(projects)
function render_new_item_jump_box (line 100) | def render_new_item_jump_box
FILE: app/helpers/queries_helper.rb
type QueriesHelper (line 4) | module QueriesHelper
function operators_for_select (line 6) | def operators_for_select(filter_type)
function column_header (line 10) | def column_header(column)
function column_content (line 16) | def column_content(column, issue)
FILE: app/helpers/reports_helper.rb
type ReportsHelper (line 4) | module ReportsHelper
function aggregate (line 6) | def aggregate(data, criteria)
function aggregate_link (line 18) | def aggregate_link(data, criteria, *args)
FILE: app/helpers/retros_helper.rb
type RetrosHelper (line 1) | module RetrosHelper
function render_title_date (line 2) | def render_title_date
function team_from_issue (line 11) | def team_from_issue(issue)
function accuracy_display (line 15) | def accuracy_display(self_bias,magnitude)
FILE: app/helpers/search_helper.rb
type SearchHelper (line 4) | module SearchHelper
function highlight_tokens (line 5) | def highlight_tokens(text, tokens)
function type_label (line 27) | def type_label(t)
function project_select_tag (line 31) | def project_select_tag
function render_results_by_type (line 39) | def render_results_by_type(results_by_type)
FILE: app/helpers/settings_helper.rb
type SettingsHelper (line 4) | module SettingsHelper
function administration_settings_tabs (line 5) | def administration_settings_tabs
function setting_select (line 16) | def setting_select(setting, choices, options={})
function setting_multiselect (line 24) | def setting_multiselect(setting, choices, options={})
function setting_text_field (line 39) | def setting_text_field(setting, options={})
function setting_text_area (line 44) | def setting_text_area(setting, options={})
function setting_check_box (line 49) | def setting_check_box(setting, options={})
function setting_label (line 55) | def setting_label(setting, options={})
FILE: app/helpers/sort_helper.rb
type SortHelper (line 53) | module SortHelper
class SortCriteria (line 54) | class SortCriteria
method initialize (line 56) | def initialize
method available_criteria= (line 60) | def available_criteria=(criteria)
method from_param (line 67) | def from_param(param)
method criteria= (line 72) | def criteria=(arg)
method to_param (line 77) | def to_param
method to_sql (line 81) | def to_sql
method add! (line 90) | def add!(key, asc)
method add (line 96) | def add(*args)
method first_key (line 102) | def first_key
method first_asc? (line 106) | def first_asc?
method empty? (line 110) | def empty?
method normalize! (line 116) | def normalize!
function sort_name (line 126) | def sort_name
function sort_init (line 138) | def sort_init(*args)
function sort_update (line 153) | def sort_update(criteria)
function sort_clear (line 163) | def sort_clear
function sort_clause (line 170) | def sort_clause
function sort_link (line 180) | def sort_link(column, caption, default_order)
function sort_header_tag (line 220) | def sort_header_tag(column, options = {})
FILE: app/helpers/users_helper.rb
type UsersHelper (line 4) | module UsersHelper
function users_status_options_for_select (line 5) | def users_status_options_for_select(selected)
function options_for_membership_project_select (line 14) | def options_for_membership_project_select(user, projects)
function change_status_link (line 22) | def change_status_link(user)
function user_settings_tabs (line 34) | def user_settings_tabs
function reputation_value (line 42) | def reputation_value(reputation_type, reputation_value)
function reputation_project (line 51) | def reputation_project(reputation)
FILE: app/helpers/watchers_helper.rb
type WatchersHelper (line 4) | module WatchersHelper
function watcher_tag (line 10) | def watcher_tag(object, user, options={:replace => 'watcher'})
function watcher_link (line 19) | def watcher_link(object, user, options={:replace => 'watcher'})
function watchers_list (line 35) | def watchers_list(object)
FILE: app/helpers/wiki_helper.rb
type WikiHelper (line 4) | module WikiHelper
function wiki_page_options_for_select (line 6) | def wiki_page_options_for_select(pages, selected = nil, parent = nil, ...
function html_diff (line 19) | def html_diff(wdiff)
FILE: app/models/activity_stream.rb
class ActivityStream (line 7) | class ActivityStream < ActiveRecord::Base
method before_save (line 22) | def before_save
method recent_actors (line 30) | def self.recent_actors(actor, location, limit=12)
method recent_objects (line 55) | def self.recent_objects(object, location, limit=12)
method preference_join (line 67) | def self.preference_join(location) # :nodoc:
method fetch (line 77) | def self.fetch(user_id, project_id, with_subprojects, limit, max_creat...
method soft_destroy (line 129) | def soft_destroy
FILE: app/models/activity_stream_preference.rb
class ActivityStreamPreference (line 9) | class ActivityStreamPreference < ActiveRecord::Base
FILE: app/models/activity_stream_total.rb
class ActivityStreamTotal (line 10) | class ActivityStreamTotal < ActiveRecord::Base
FILE: app/models/attachment.rb
class Attachment (line 6) | class Attachment < ActiveRecord::Base
method validate (line 27) | def validate
method put_to_s3 (line 33) | def put_to_s3
method delete_from_s3 (line 44) | def delete_from_s3
method file= (line 52) | def file=(incoming_file)
method file (line 64) | def file
method before_save (line 70) | def before_save
method after_destroy (line 91) | def after_destroy
method diskfile (line 96) | def diskfile
method increment_download (line 100) | def increment_download
method project (line 104) | def project
method visible? (line 108) | def visible?(user=User.current)
method deletable? (line 112) | def deletable?(user=User.current)
method image? (line 116) | def image?
method is_text? (line 120) | def is_text?
method is_diff? (line 124) | def is_diff?
method readable? (line 129) | def readable?
method sanitize_filename (line 135) | def sanitize_filename(value)
method disk_filename (line 146) | def self.disk_filename(filename)
FILE: app/models/auth_source.rb
class AuthSource (line 4) | class AuthSource < ActiveRecord::Base
method authenticate (line 11) | def authenticate(login, password)
method test_connection (line 14) | def test_connection
method auth_method_name (line 17) | def auth_method_name
method authenticate (line 22) | def self.authenticate(login, password)
FILE: app/models/auth_source_ldap.rb
class AuthSourceLdap (line 7) | class AuthSourceLdap < AuthSource
method after_initialize (line 16) | def after_initialize
method authenticate (line 20) | def authenticate(login, password)
method test_connection (line 51) | def test_connection
method auth_method_name (line 58) | def auth_method_name
method strip_ldap_attributes (line 64) | def strip_ldap_attributes
method initialize_ldap_con (line 70) | def initialize_ldap_con(ldap_user, ldap_password)
method get_attr (line 79) | def self.get_attr(entry, attr_name)
FILE: app/models/board.rb
class Board (line 4) | class Board < ActiveRecord::Base
method visible? (line 17) | def visible?(user=User.current)
method to_s (line 21) | def to_s
method reset_counters! (line 25) | def reset_counters!
method reset_counters! (line 30) | def self.reset_counters!(board_id)
FILE: app/models/comment.rb
class Comment (line 4) | class Comment < ActiveRecord::Base
method send_mentions (line 12) | def send_mentions
method title (line 16) | def title
method mention (line 23) | def mention(mentioner_id, mentioned_id, mention_text)
FILE: app/models/credit.rb
class Credit (line 1) | class Credit < ActiveRecord::Base
method issue_day (line 15) | def issue_day
method disable (line 19) | def disable
method enable (line 24) | def enable
method issue_shares (line 30) | def issue_shares
method previously_issued (line 34) | def previously_issued
method settled? (line 38) | def settled?
method pay_out (line 42) | def pay_out(pay_amount)
method round (line 61) | def self.round(x)
method settle (line 67) | def self.settle(project,amount)
method transfer (line 89) | def self.transfer(sender,recipient,project,amount, note)
FILE: app/models/credit_distribution.rb
class CreditDistribution (line 1) | class CreditDistribution < ActiveRecord::Base
method add_credits (line 11) | def add_credits
FILE: app/models/credit_transfer.rb
class CreditTransfer (line 4) | class CreditTransfer < ActiveRecord::Base
method send_notification (line 11) | def send_notification
FILE: app/models/daily_digest.rb
class DailyDigest (line 4) | class DailyDigest < ActiveRecord::Base
method deliver (line 8) | def self.deliver
FILE: app/models/document.rb
class Document (line 4) | class Document < ActiveRecord::Base
method size (line 17) | def size
method visible? (line 27) | def visible?(user=User.current)
method updated_at (line 31) | def updated_at
method recipients (line 40) | def recipients
FILE: app/models/document_observer.rb
class DocumentObserver (line 4) | class DocumentObserver < ActiveRecord::Observer
method after_create (line 5) | def after_create(document)
FILE: app/models/email_update.rb
class EmailUpdate (line 1) | class EmailUpdate < ActiveRecord::Base
method before_create (line 4) | def before_create
method send_activation (line 8) | def send_activation
method accept (line 12) | def accept
FILE: app/models/enabled_module.rb
class EnabledModule (line 4) | class EnabledModule < ActiveRecord::Base
method module_enabled (line 14) | def module_enabled
FILE: app/models/enterprise.rb
class Enterprise (line 1) | class Enterprise < ActiveRecord::Base
FILE: app/models/enumeration.rb
class Enumeration (line 4) | class Enumeration < ActiveRecord::Base
method default (line 19) | def default
method default (line 28) | def self.default
method option_name (line 41) | def option_name
method opt (line 46) | def opt
method before_save (line 51) | def before_save
method objects_count (line 58) | def objects_count
method in_use? (line 62) | def in_use?
method is_override? (line 67) | def is_override?
method destroy (line 75) | def destroy(reassign_to = nil)
method <=> (line 82) | def <=>(enumeration)
method to_s (line 86) | def to_s; name end
method get_subclasses (line 92) | def self.get_subclasses
method overridding_change? (line 97) | def self.overridding_change?(new, previous)
method same_active_state? (line 107) | def self.same_active_state?(new, previous)
method check_integrity (line 114) | def check_integrity
FILE: app/models/help_section.rb
class HelpSection (line 1) | class HelpSection < ActiveRecord::Base
FILE: app/models/hourly_type.rb
class HourlyType (line 1) | class HourlyType < ActiveRecord::Base
method validate (line 9) | def validate
method name_with_rates (line 14) | def name_with_rates
FILE: app/models/invitation.rb
class Invitation (line 1) | class Invitation < ActiveRecord::Base
method before_create (line 9) | def before_create
method deliver (line 16) | def deliver(note="")
method resend (line 34) | def resend(note="")
method status_name (line 40) | def status_name
method accept (line 51) | def accept(user=nil)
FILE: app/models/issue.rb
class Issue (line 4) | class Issue < ActiveRecord::Base
method visible? (line 81) | def visible?(usr=nil)
method ready_for_open? (line 86) | def ready_for_open?
method ready_for_canceled? (line 94) | def ready_for_canceled?
method ready_for_accepted? (line 100) | def ready_for_accepted?
method ready_for_rejected? (line 107) | def ready_for_rejected?
method is_gift? (line 114) | def is_gift?
method is_expense? (line 118) | def is_expense?
method is_hourly? (line 122) | def is_hourly?
method is_feature (line 126) | def is_feature
method is_bug (line 130) | def is_bug
method is_chore (line 134) | def is_chore
method updated_status (line 138) | def updated_status
method after_initialize (line 149) | def after_initialize
method has_team? (line 157) | def has_team?
method has_todos? (line 161) | def has_todos?
method team_votes (line 165) | def team_votes
method team_members (line 169) | def team_members
method copy_from (line 174) | def copy_from(arg)
method startable? (line 182) | def startable?
method clone_recurring (line 190) | def clone_recurring
method move_to (line 206) | def move_to(new_project, new_tracker = nil, options = {})
method tracker_id= (line 240) | def tracker_id=(tid)
method mention (line 247) | def mention(mentioner_id, mentioned_id, mention_text)
method update_tags (line 258) | def update_tags(tags)
method attributes_with_tracker_first= (line 265) | def attributes_with_tracker_first=(new_attributes, *args)
method estimated_hours= (line 275) | def estimated_hours=(h)
method validate (line 280) | def validate
method init_journal (line 283) | def init_journal(user, notes = "")
method closed? (line 295) | def closed?
method reopened? (line 300) | def reopened?
method editable? (line 311) | def editable?
method overdue? (line 321) | def overdue?
method assignable_users (line 326) | def assignable_users
method blocked? (line 331) | def blocked?
method new_statuses_allowed_to (line 336) | def new_statuses_allowed_to(user)
method recipients (line 345) | def recipients
method relations (line 360) | def relations
method all_dependent_issues (line 364) | def all_dependent_issues
method duplicates (line 374) | def duplicates
method due_before (line 380) | def due_before
method duration (line 389) | def duration
method soonest_start (line 393) | def soonest_start
method to_s (line 397) | def to_s
method css_classes (line 402) | def css_classes
method push_allowed? (line 413) | def push_allowed?(user)
method update_estimate_total (line 421) | def update_estimate_total(binding)
method update_pri_total (line 429) | def update_pri_total(binding)
method update_agree_total (line 437) | def update_agree_total(binding)
method update_accept_total (line 449) | def update_accept_total(binding)
method update_status (line 462) | def update_status
method set_points_from_hourly (line 506) | def set_points_from_hourly
method give_credits (line 517) | def give_credits
method to_dashboard (line 549) | def to_dashboard
method dollar_amount (line 563) | def dollar_amount
method points_from_credits (line 568) | def points_from_credits
method size (line 574) | def size
method after_create (line 584) | def after_create
method update_last_item_stamp (line 588) | def update_last_item_stamp
method attachment_removed (line 595) | def attachment_removed(obj)
method after_save (line 603) | def after_save
method create_journal (line 629) | def create_journal
FILE: app/models/issue_observer.rb
class IssueObserver (line 4) | class IssueObserver < ActiveRecord::Observer
method after_create (line 5) | def after_create(issue)
FILE: app/models/issue_relation.rb
class IssueRelation (line 4) | class IssueRelation < ActiveRecord::Base
method validate (line 28) | def validate
method other_issue (line 36) | def other_issue(issue)
method label_for (line 40) | def label_for(issue)
method before_save (line 44) | def before_save
method set_issue_to_dates (line 55) | def set_issue_to_dates
method successor_soonest_start (line 63) | def successor_soonest_start
method <=> (line 68) | def <=>(relation)
method reverse_if_needed (line 74) | def reverse_if_needed
FILE: app/models/issue_status.rb
class IssueStatus (line 4) | class IssueStatus < ActiveRecord::Base
method after_save (line 14) | def after_save
method default (line 19) | def self.default
method assigned (line 23) | def self.assigned
method done (line 27) | def self.done
method inprogress (line 31) | def self.inprogress
method newstatus (line 35) | def self.newstatus
method open (line 39) | def self.open
method canceled (line 43) | def self.canceled
method estimate (line 47) | def self.estimate
method accepted (line 51) | def self.accepted
method rejected (line 55) | def self.rejected
method archived (line 59) | def self.archived
method new_statuses_allowed_to (line 67) | def new_statuses_allowed_to(roles, tracker)
method find_new_statuses_allowed_to (line 78) | def find_new_statuses_allowed_to(roles, tracker)
method new_status_allowed_to? (line 89) | def new_status_allowed_to?(status, roles, tracker)
method <=> (line 97) | def <=>(status)
method to_s (line 101) | def to_s; name end
method check_integrity (line 105) | def check_integrity
FILE: app/models/issue_vote.rb
class IssueVote (line 1) | class IssueVote < ActiveRecord::Base
method project (line 13) | def project
method update_issue_totals (line 17) | def update_issue_totals
method remove_similar (line 30) | def remove_similar
method set_binding (line 40) | def set_binding
FILE: app/models/journal.rb
class Journal (line 4) | class Journal < ActiveRecord::Base
method update_issue_timestamp (line 17) | def update_issue_timestamp
method send_mentions (line 22) | def send_mentions
method mention (line 26) | def mention(mentioner_id, mentioned_id, mention_text)
method parse_relations (line 37) | def parse_relations
method issue_id (line 41) | def issue_id
method parse_relations_delayed (line 46) | def parse_relations_delayed
method save (line 65) | def save(*args)
method new_status (line 71) | def new_status
method new_value_for (line 76) | def new_value_for(prop)
method editable_by? (line 81) | def editable_by?(usr)
method project (line 85) | def project
method attachments (line 89) | def attachments
FILE: app/models/journal_detail.rb
class JournalDetail (line 4) | class JournalDetail < ActiveRecord::Base
method before_save (line 7) | def before_save
FILE: app/models/journal_observer.rb
class JournalObserver (line 4) | class JournalObserver < ActiveRecord::Observer
method after_create (line 5) | def after_create(journal)
FILE: app/models/mail.rb
class Mail (line 4) | class Mail < ActiveRecord::Base
FILE: app/models/mail_handler.rb
class MailHandler (line 4) | class MailHandler < ActiveRecord::Base
class UnauthorizedAction (line 7) | class UnauthorizedAction < StandardError; end
class MissingInformation (line 8) | class MissingInformation < StandardError; end
method initialize (line 16) | def initialize(email, user,options = {})
method receive (line 35) | def self.receive(email, options={})
method receive (line 53) | def receive(email)
method receive_from_api (line 88) | def self.receive_from_api(email,options ={})
method dispatch (line 139) | def dispatch
method receive_issue (line 170) | def receive_issue
method target_project (line 198) | def target_project
method receive_issue_reply (line 208) | def receive_issue_reply(issue_id)
method receive_journal_reply (line 236) | def receive_journal_reply(journal_id)
method receive_message_reply (line 244) | def receive_message_reply(message_id)
method add_attachments (line 266) | def add_attachments(obj)
method add_watchers (line 279) | def add_watchers(obj)
method get_keyword (line 289) | def get_keyword(attr, options={})
method plain_text_body (line 306) | def plain_text_body
method cleaned_up_text_body (line 327) | def cleaned_up_text_body
method full_sanitizer (line 331) | def self.full_sanitizer
method create_user_from_email (line 336) | def self.create_user_from_email(email)
method cleanup_body (line 355) | def cleanup_body(body)
FILE: app/models/mailer.rb
class Mailer (line 4) | class Mailer < ActionMailer::Base
method default_url_options (line 12) | def self.default_url_options
method issue_add (line 23) | def issue_add(issue)
method issue_edit (line 44) | def issue_edit(journal)
method daily_digest (line 69) | def daily_digest(recipient,journals)
method invitation_add (line 82) | def invitation_add(invitation,note)
method invitation_remind (line 96) | def invitation_remind(invitation,note)
method reminder (line 110) | def reminder(user, issues, days)
method document_added (line 125) | def document_added(document)
method attachments_added (line 139) | def attachments_added(attachments)
method news_added (line 166) | def news_added(news)
method message_posted (line 181) | def message_posted(message)
method wiki_content_added (line 208) | def wiki_content_added(wiki_content)
method wiki_content_updated (line 229) | def wiki_content_updated(wiki_content)
method account_information (line 247) | def account_information(user, password)
method account_activation_request (line 262) | def account_activation_request(user)
method account_activated (line 276) | def account_activated(user)
method lost_password (line 285) | def lost_password(token)
method register (line 294) | def register(token)
method personal_welcome (line 307) | def personal_welcome(user,project)
method test (line 318) | def test(user)
method deliver! (line 328) | def deliver!(mail = @mail)
method email_update_activation (line 343) | def email_update_activation(email_update)
method reminders (line 357) | def self.reminders(options={})
method initialize_defaults (line 378) | def initialize_defaults(method_name)
method redmine_headers (line 392) | def redmine_headers(h)
method create_mail (line 397) | def create_mail
method render_multipart (line 422) | def render_multipart(method_name, body)
method controller_path (line 434) | def self.controller_path
method message_id_for (line 439) | def self.message_id_for(object)
method message_id (line 449) | def message_id(object)
method references (line 453) | def references(object)
type TMail (line 461) | module TMail
class Mail (line 463) | class Mail
method add_message_id (line 465) | def add_message_id( fqdn = nil )
FILE: app/models/member.rb
class Member (line 4) | class Member < ActiveRecord::Base
method name (line 16) | def name
method name_and_id (line 20) | def name_and_id
method role_ids= (line 25) | def role_ids=(arg)
method <=> (line 41) | def <=>(member)
method deletable? (line 46) | def deletable?
method validate (line 52) | def validate
method unwatch_from_permission_change (line 59) | def unwatch_from_permission_change
FILE: app/models/member_role.rb
class MemberRole (line 4) | class MemberRole < ActiveRecord::Base
method project (line 22) | def project
method name (line 27) | def name
method project_id (line 31) | def project_id
method user_id (line 35) | def user_id
method user (line 39) | def user
method long_description (line 43) | def long_description
method event_title (line 47) | def event_title
method remove_member_if_empty (line 53) | def remove_member_if_empty
method send_notification (line 60) | def send_notification
method log_activity (line 69) | def log_activity
method refresh_memberships (line 75) | def refresh_memberships
method refresh_memberships_delayed (line 82) | def self.refresh_memberships_delayed(member_role)
FILE: app/models/message.rb
class Message (line 4) | class Message < ActiveRecord::Base
method project_id (line 30) | def project_id
method visible? (line 34) | def visible?(user=User.current)
method validate_on_create (line 38) | def validate_on_create
method after_create (line 43) | def after_create
method send_mentions (line 50) | def send_mentions
method mention (line 54) | def mention(mentioner_id, mentioned_id, mention_text)
method after_update (line 66) | def after_update
method after_destroy (line 74) | def after_destroy
method sticky= (line 78) | def sticky=(arg)
method sticky? (line 82) | def sticky?
method project (line 86) | def project
method editable_by? (line 90) | def editable_by?(usr)
method destroyable_by? (line 94) | def destroyable_by?(usr)
method recipients (line 99) | def recipients
method add_author_as_watcher (line 108) | def add_author_as_watcher
FILE: app/models/message_observer.rb
class MessageObserver (line 4) | class MessageObserver < ActiveRecord::Observer
method after_create (line 5) | def after_create(message)
FILE: app/models/motion.rb
class Motion (line 1) | class Motion < ActiveRecord::Base
method active? (line 51) | def active?
method ended? (line 55) | def ended?
method concerns_someone? (line 75) | def concerns_someone?
method close (line 80) | def close
method set_values (line 114) | def set_values
method generate_title (line 126) | def generate_title
method generate_description (line 150) | def generate_description
method eligible_users (line 174) | def self.eligible_users(variation,project_id)
method create_forum_topic (line 191) | def create_forum_topic
method visibility_level_description (line 204) | def visibility_level_description
method binding_level_description (line 208) | def binding_level_description
method execute_action (line 212) | def execute_action
method send_announce (line 235) | def send_announce
method announce (line 239) | def announce
method announce_passed (line 254) | def announce_passed
FILE: app/models/motion_vote.rb
class MotionVote (line 1) | class MotionVote < ActiveRecord::Base
method default (line 9) | def default
method project (line 17) | def project
method remove_similar_votes (line 21) | def remove_similar_votes
method set_binding (line 25) | def set_binding
method action_description (line 30) | def action_description
method update_agree_total (line 44) | def update_agree_total
method remove_notifications (line 58) | def remove_notifications
FILE: app/models/news.rb
class News (line 5) | class News < ActiveRecord::Base
method visible? (line 20) | def visible?(user=User.current)
method recipients (line 25) | def recipients
method latest (line 32) | def self.latest(user = User.current, count = 5)
method send_mentions (line 36) | def send_mentions
method mention (line 40) | def mention(mentioner_id, mentioned_id, mention_text)
FILE: app/models/news_observer.rb
class NewsObserver (line 4) | class NewsObserver < ActiveRecord::Observer
method after_create (line 5) | def after_create(news)
FILE: app/models/notification.rb
class Notification (line 1) | class Notification < ActiveRecord::Base
method mark_as_responded (line 18) | def mark_as_responded
method mention? (line 25) | def mention?
method unresponded? (line 30) | def self.unresponded?
method unresponded_count (line 35) | def self.unresponded_count
method unresponded (line 39) | def self.unresponded
method remove_mention_duplicates (line 43) | def remove_mention_duplicates
method recind (line 49) | def self.recind(variation, source_id, sender_id)
method deactivate_all (line 58) | def self.deactivate_all(variation, source_id)
method activate_all (line 62) | def self.activate_all(variation, source_id)
FILE: app/models/open_id_authentication_association.rb
class OpenIdAuthenticationAssociation (line 1) | class OpenIdAuthenticationAssociation < ActiveRecord::Base
FILE: app/models/open_id_authentication_nonces.rb
class OpenIdAuthenticationNonces (line 1) | class OpenIdAuthenticationNonces < ActiveRecord::Base
FILE: app/models/personal_welcome.rb
class PersonalWelcome (line 4) | class PersonalWelcome < ActiveRecord::Base
method deliver (line 7) | def self.deliver
FILE: app/models/plan.rb
class Plan (line 1) | class Plan < ActiveRecord::Base
method free? (line 4) | def free?
method free (line 8) | def self.free
FILE: app/models/plugin_schema_info.rb
class PluginSchemaInfo (line 1) | class PluginSchemaInfo < ActiveRecord::Base
FILE: app/models/project.rb
class Project (line 4) | class Project < ActiveRecord::Base
method project_id (line 142) | def project_id
method all_tags (line 146) | def all_tags(term = '')
method graph_data (line 150) | def graph_data
method sub_project_array (line 162) | def sub_project_array
method sub_project_array_visible_to (line 171) | def sub_project_array_visible_to(user)
method graph_data2 (line 185) | def graph_data2
method identifier= (line 196) | def identifier=(identifier)
method identifier_frozen? (line 200) | def identifier_frozen?
method latest_public (line 204) | def self.latest_public(count=10, offset=0)
method most_active_public (line 217) | def self.most_active_public(count=10, offset=0)
method most_active (line 232) | def self.most_active(user=nil, count=10, root=false, offset=0)
method visible_to (line 242) | def visible_to(user)
method visible_by (line 255) | def self.visible_by(user=nil)
method fetch_credits (line 266) | def fetch_credits(with_subprojects)
method allowed_to_condition (line 278) | def self.allowed_to_condition(user, permission, options={})
method activities (line 313) | def activities(include_inactive=false)
method project_condition (line 326) | def project_condition(with_subprojects)
method find (line 332) | def self.find(*args)
method active? (line 342) | def active?
method archived? (line 346) | def archived?
method locked? (line 350) | def locked?
method lock (line 354) | def lock
method unlock (line 358) | def unlock
method enterprise? (line 362) | def enterprise?
method archive (line 367) | def archive
method unarchive (line 376) | def unarchive
method allowed_parents (line 383) | def allowed_parents
method set_allowed_parent! (line 397) | def set_allowed_parent!(p)
method set_parent! (line 419) | def set_parent!(p)
method rolled_up_trackers (line 456) | def rolled_up_trackers
method users_by_role (line 465) | def users_by_role
method active_members (line 476) | def active_members
method clearance_members (line 481) | def clearance_members
method contributor_list (line 486) | def contributor_list
method member_list (line 491) | def member_list
method core_member_list (line 496) | def core_member_list
method active_binding_members_count (line 501) | def active_binding_members_count
method binding_members_count (line 507) | def binding_members_count
method role_and_above_count (line 512) | def role_and_above_count(position)
method refresh_active_members (line 519) | def refresh_active_members
method delete_all_members (line 576) | def delete_all_members
method assignable_users (line 583) | def assignable_users
method recipients (line 588) | def recipients
method notified_users (line 593) | def notified_users
method project (line 597) | def project
method <=> (line 601) | def <=>(project)
method to_s (line 605) | def to_s
method name_with_ancestors (line 609) | def name_with_ancestors
method short_description (line 627) | def short_description(length = 255)
method allows_to? (line 635) | def allows_to?(action)
method module_enabled? (line 643) | def module_enabled?(module_name)
method credits_enabled? (line 648) | def credits_enabled?
method enabled_module_names= (line 652) | def enabled_module_names=(module_names)
method next_identifier (line 665) | def self.next_identifier
method copy (line 693) | def copy(project, options={})
method copy_from (line 713) | def self.copy_from(project)
method team_points_for (line 731) | def team_points_for(user, options={})
method highest_pri (line 736) | def highest_pri
method before_validation_on_create (line 740) | def before_validation_on_create
method after_create (line 756) | def after_create
method set_owner (line 768) | def set_owner
method ready_for_retro? (line 788) | def ready_for_retro?
method start_new_retro (line 804) | def start_new_retro
method start_retro_if_ready (line 815) | def start_retro_if_ready
method refresh_activity_line (line 819) | def refresh_activity_line
method activity_line_max (line 858) | def activity_line_max
method activity_line_show (line 862) | def activity_line_show(length)
method volunteer? (line 866) | def volunteer?
method calculate_storage (line 870) | def calculate_storage
method allowed_actions (line 884) | def allowed_actions
method refresh_issue_count (line 888) | def refresh_issue_count
method refresh_issue_count_sub (line 893) | def refresh_issue_count_sub
method update_last_item (line 899) | def update_last_item
method update_last_item_sub (line 904) | def update_last_item_sub
method copy_wiki (line 912) | def copy_wiki(project)
method copy_issues (line 927) | def copy_issues(project)
method copy_members (line 967) | def copy_members(project)
method copy_queries (line 978) | def copy_queries(project)
method copy_boards (line 989) | def copy_boards(project)
method allowed_permissions (line 998) | def allowed_permissions
method archive! (line 1006) | def archive!
FILE: app/models/query.rb
class QueryColumn (line 5) | class QueryColumn
method initialize (line 9) | def initialize(name, options={})
method caption (line 19) | def caption
method sortable? (line 24) | def sortable?
method value (line 28) | def value(issue)
class Query (line 33) | class Query < ActiveRecord::Base
class StatementInvalid (line 34) | class StatementInvalid < ::ActiveRecord::StatementInvalid
method initialize (line 100) | def initialize(attributes = nil)
method after_initialize (line 105) | def after_initialize
method validate (line 110) | def validate
method editable_by? (line 120) | def editable_by?(user)
method available_filters (line 128) | def available_filters
method add_filter (line 169) | def add_filter(field, operator, values)
method add_short_filter (line 179) | def add_short_filter(field, expression)
method has_filter? (line 185) | def has_filter?(field)
method operator_for (line 189) | def operator_for(field)
method values_for (line 193) | def values_for(field)
method label_for (line 197) | def label_for(field)
method available_columns (line 202) | def available_columns
method groupable_columns (line 208) | def groupable_columns
method columns (line 212) | def columns
method column_names= (line 224) | def column_names=(names)
method has_column? (line 236) | def has_column?(column)
method has_default_columns? (line 240) | def has_default_columns?
method sort_criteria= (line 244) | def sort_criteria=(arg)
method sort_criteria (line 253) | def sort_criteria
method sort_criteria_key (line 257) | def sort_criteria_key(arg)
method sort_criteria_order (line 261) | def sort_criteria_order(arg)
method group_by_sort_order (line 266) | def group_by_sort_order
method grouped? (line 275) | def grouped?
method group_by_column (line 279) | def group_by_column
method group_by_statement (line 283) | def group_by_statement
method project_statement (line 287) | def project_statement
method statement (line 313) | def statement
method issue_count (line 347) | def issue_count
method issue_count_by_group (line 354) | def issue_count_by_group
method issues (line 372) | def issues(options={})
method journals (line 387) | def journals(options={})
method sql_for_field (line 400) | def sql_for_field(field, operator, value, db_table, db_field)
method date_range_clause (line 450) | def date_range_clause(table, field, from, to)
FILE: app/models/quote.rb
class Quote (line 1) | class Quote < ActiveRecord::Base
method random (line 4) | def self.random
FILE: app/models/reputation.rb
class Reputation (line 1) | class Reputation < ActiveRecord::Base
method calculate_all (line 8) | def self.calculate_all
method calculate (line 13) | def self.calculate(variation)
method calculate_moving_average (line 26) | def self.calculate_moving_average(variation,user_id)
method create_or_update (line 39) | def self.create_or_update(variation,user_id,average,project_id)
method bias_moving_average (line 55) | def self.bias_moving_average(variation,user_id,project_id)
FILE: app/models/retro.rb
class Retro (line 4) | class Retro < ActiveRecord::Base
method set_from_date (line 38) | def set_from_date
method ended? (line 43) | def ended?
method distribute_credits (line 48) | def distribute_credits
method close (line 79) | def close
method calculate_ratings (line 88) | def calculate_ratings
method announce_start (line 156) | def announce_start
method announce_close (line 182) | def announce_close
method all_in? (line 201) | def all_in?
FILE: app/models/retro_rating.rb
class RetroRating (line 4) | class RetroRating < ActiveRecord::Base
FILE: app/models/role.rb
class Role (line 4) | class Role < ActiveRecord::Base
method copy (line 30) | def copy(source_role)
method permissions (line 46) | def permissions
method permissions= (line 50) | def permissions=(perms)
method add_permission! (line 55) | def add_permission!(*perms)
method remove_permission! (line 66) | def remove_permission!(*perms)
method has_permission? (line 74) | def has_permission?(perm)
method <=> (line 78) | def <=>(role)
method to_s (line 82) | def to_s
method builtin? (line 87) | def builtin?
method community_member? (line 92) | def community_member?
method enterprise_member? (line 97) | def enterprise_member?
method platform_member? (line 102) | def platform_member?
method binding_member? (line 107) | def binding_member?
method admin? (line 112) | def admin?
method core_member? (line 117) | def core_member?
method contributor? (line 122) | def contributor?
method member? (line 127) | def member?
method active? (line 132) | def active?
method clearance? (line 137) | def clearance?
method allowed_to? (line 146) | def allowed_to?(action)
method setable_permissions (line 155) | def setable_permissions
method find_all_givable (line 163) | def self.find_all_givable(level)
method non_member (line 168) | def self.non_member
method anonymous (line 173) | def self.anonymous
method administrator (line 179) | def self.administrator
method board (line 184) | def self.board
method contributor (line 190) | def self.contributor
method core_member (line 196) | def self.core_member
method member (line 201) | def self.member
method founder (line 206) | def self.founder
method clearance (line 211) | def self.clearance
method active (line 216) | def self.active
method allowed_permissions (line 223) | def allowed_permissions
method allowed_actions (line 227) | def allowed_actions
method check_deletable (line 231) | def check_deletable
FILE: app/models/setting.rb
class Setting (line 4) | class Setting < ActiveRecord::Base
method value (line 182) | def value
method value= (line 190) | def value=(value)
method serialize_value (line 194) | def serialize_value
method [] (line 200) | def self.[](name)
method []= (line 205) | def self.[]=(name, v)
method per_page_options_array (line 234) | def self.per_page_options_array
method openid? (line 238) | def self.openid?
method check_cache (line 245) | def self.check_cache
method find_or_default (line 257) | def self.find_or_default(name)
FILE: app/models/share.rb
class Share (line 1) | class Share < ActiveRecord::Base
method set_expiration (line 20) | def self.set_expiration(owner,project,amount,expiration_date)
FILE: app/models/todo.rb
class Todo (line 1) | class Todo < ActiveRecord::Base
method update_issue_timestamp (line 8) | def update_issue_timestamp
FILE: app/models/token.rb
class Token (line 4) | class Token < ActiveRecord::Base
method before_create (line 12) | def before_create
method expired? (line 17) | def expired?
method destroy_expired (line 22) | def self.destroy_expired
method generate_token_value (line 28) | def self.generate_token_value
method delete_previous_tokens (line 33) | def delete_previous_tokens
FILE: app/models/track.rb
class Track (line 4) | class Track < ActiveRecord::Base
method log (line 12) | def self.log(code, ip="")
FILE: app/models/tracker.rb
class Tracker (line 4) | class Tracker < ActiveRecord::Base
method copy (line 8) | def copy(source_tracker)
method to_s (line 21) | def to_s; name end
method <=> (line 23) | def <=>(tracker)
method all (line 27) | def self.all
method no_credits (line 32) | def self.no_credits
method gift? (line 37) | def gift?
method expense? (line 41) | def expense?
method recurring? (line 45) | def recurring?
method hourly? (line 49) | def hourly?
method feature? (line 53) | def feature?
method bug? (line 57) | def bug?
method chore? (line 61) | def chore?
method issue_statuses (line 68) | def issue_statuses
method check_integrity (line 85) | def check_integrity
FILE: app/models/user.rb
class User (line 7) | class User < ActiveRecord::Base
method <=> (line 111) | def <=>(user)
method before_create (line 121) | def before_create
method before_save (line 127) | def before_save
method after_create (line 133) | def after_create
method activate_invitations (line 138) | def activate_invitations
method after_update (line 145) | def after_update
method create_recurly_account (line 149) | def self.create_recurly_account(id)
method update_recurly_account (line 163) | def self.update_recurly_account(id)
method save_billing (line 181) | def save_billing(cc,ccverify,ip)
method update_recurly_billing (line 185) | def self.update_recurly_billing(id,cc,ccverify,ip)
method reload (line 238) | def reload(*args)
method lock_workstreams? (line 243) | def lock_workstreams?
method lock_workstreams (line 248) | def lock_workstreams
method unlock_workstreams (line 254) | def unlock_workstreams
method usage_over? (line 260) | def usage_over?
method update_usage_over (line 265) | def update_usage_over
method update_trial_expiration (line 291) | def update_trial_expiration
method identity_url= (line 318) | def identity_url=(url)
method try_to_login (line 332) | def self.try_to_login(login, password)
method try_to_autologin (line 363) | def self.try_to_autologin(key)
method name (line 376) | def name(formatter = nil)
method active? (line 384) | def active?
method reactivate (line 388) | def reactivate
method registered? (line 402) | def registered?
method lock (line 406) | def lock
method cancel (line 411) | def cancel
method cancel_account! (line 417) | def cancel_account!
method canceled? (line 421) | def canceled?
method locked? (line 425) | def locked?
method check_password? (line 429) | def check_password?(clear_password)
method random_password (line 436) | def random_password
method pref (line 445) | def pref
method time_zone (line 449) | def time_zone
method wants_comments_in_reverse_order? (line 453) | def wants_comments_in_reverse_order?
method rss_key (line 458) | def rss_key
method api_key (line 464) | def api_key
method notified_projects_ids (line 470) | def notified_projects_ids
method notified_project_ids= (line 474) | def notified_project_ids=(ids)
method find_by_rss_key (line 481) | def self.find_by_rss_key(key)
method find_by_api_key (line 486) | def self.find_by_api_key(key)
method find_by_mail (line 492) | def self.find_by_mail(mail)
method find_by_login (line 497) | def self.find_by_login(login)
method to_s (line 501) | def to_s
method today (line 506) | def today
method logged? (line 514) | def logged?
method anonymous? (line 518) | def anonymous?
method roles_for_project (line 523) | def roles_for_project(child_project)
method community_member_of? (line 545) | def community_member_of?(project)
method enterprise_member_of? (line 550) | def enterprise_member_of?(project)
method admin_of? (line 555) | def admin_of?(project)
method member_of? (line 561) | def member_of?(project)
method core_member_of? (line 566) | def core_member_of?(project)
method contributor_of? (line 571) | def contributor_of?(project)
method binding_voter_of? (line 576) | def binding_voter_of?(project)
method binding_voter_of_motion? (line 581) | def binding_voter_of_motion?(motion)
method allowed_to_see_motion? (line 586) | def allowed_to_see_motion?(motion)
method allowed_to_see_project? (line 594) | def allowed_to_see_project?(project)
method position_for (line 605) | def position_for(project)
method allowed_to? (line 613) | def allowed_to?(action, project, options={})
method add_as_core (line 639) | def add_as_core(project, options={})
method add_as_member (line 646) | def add_as_member(project, options={})
method add_as_contributor (line 655) | def add_as_contributor(project, options={})
method add_as_contributor_if_new (line 662) | def add_as_contributor_if_new(project, options={})
method add_to_project (line 667) | def add_to_project(project, role, options={})
method drop_from_project (line 683) | def drop_from_project(project, role, options={})
method drop_from_core (line 691) | def drop_from_core(project, options={})
method current= (line 695) | def self.current=(user)
method current (line 699) | def self.current
method anonymous (line 705) | def self.anonymous
method sysadmin (line 714) | def self.sysadmin
method public_project_total (line 719) | def public_project_total
method private_project_total (line 723) | def private_project_total
method public_contributor_total (line 727) | def public_contributor_total
method private_contributor_total (line 733) | def private_contributor_total
method project_storage_total (line 739) | def project_storage_total
method belongs_to_projects (line 744) | def belongs_to_projects
method recent_projects (line 749) | def recent_projects(max = 10)
method recent_items (line 756) | def recent_items(max = 10)
method find_available_login (line 764) | def self.find_available_login(array)
method delete_autologin_tokens (line 773) | def delete_autologin_tokens
method activate (line 777) | def activate
method validate (line 783) | def validate
method hash_password (line 793) | def self.hash_password(clear_password)
class AnonymousUser (line 800) | class AnonymousUser < User
method validate_on_create (line 802) | def validate_on_create
method logged? (line 808) | def logged?; false end
method admin (line 809) | def admin; false end
method name (line 810) | def name(*args); I18n.t(:label_user_anonymous) end
method mail (line 811) | def mail; nil end
method time_zone (line 812) | def time_zone; nil end
method rss_key (line 813) | def rss_key; nil end
method delete_autologin_tokens (line 814) | def delete_autologin_tokens; nil end
FILE: app/models/user_preference.rb
class UserPreference (line 4) | class UserPreference < ActiveRecord::Base
method initialize (line 16) | def initialize(attributes = nil)
method before_save (line 21) | def before_save
method [] (line 25) | def [](attr_name)
method []= (line 33) | def []=(attr_name, value)
method comments_sorting (line 44) | def comments_sorting; self[:comments_sorting] end
method comments_sorting= (line 45) | def comments_sorting=(order); self[:comments_sorting]=order end
FILE: app/models/watcher.rb
class Watcher (line 4) | class Watcher < ActiveRecord::Base
method prune (line 12) | def self.prune(options={})
method validate (line 26) | def validate
method prune_single_user (line 32) | def self.prune_single_user(user, options={})
FILE: app/models/wiki.rb
class Wiki (line 4) | class Wiki < ActiveRecord::Base
method visible? (line 14) | def visible?(user=User.current)
method find_or_new_page (line 20) | def find_or_new_page(title)
method find_page (line 26) | def find_page(title, options = {})
method find_page (line 43) | def self.find_page(title, options = {})
method titleize (line 58) | def self.titleize(title)
FILE: app/models/wiki_content.rb
class WikiContent (line 6) | class WikiContent < ActiveRecord::Base
method visible? (line 15) | def visible?(user=User.current)
method project (line 19) | def project
method recipients (line 24) | def recipients
class Version (line 30) | class Version
method text= (line 41) | def text=(plain)
method text (line 58) | def text
method project (line 68) | def project
method previous (line 73) | def previous
FILE: app/models/wiki_content_observer.rb
class WikiContentObserver (line 4) | class WikiContentObserver < ActiveRecord::Observer
method after_create (line 5) | def after_create(wiki_content)
method after_update (line 9) | def after_update(wiki_content)
FILE: app/models/wiki_page.rb
class WikiPage (line 7) | class WikiPage < ActiveRecord::Base
method project_id (line 30) | def project_id
method visible? (line 34) | def visible?(user=User.current)
method title= (line 38) | def title=(value)
method before_save (line 44) | def before_save
method before_destroy (line 61) | def before_destroy
method pretty_title (line 66) | def pretty_title
method content_for_version (line 70) | def content_for_version(version=nil)
method diff (line 76) | def diff(version_to=nil, version_from=nil)
method annotate (line 87) | def annotate(version=nil)
method pretty_title (line 93) | def self.pretty_title(str)
method project (line 97) | def project
method text (line 101) | def text
method editable_by? (line 106) | def editable_by?(usr)
method attachments_deletable? (line 110) | def attachments_deletable?(usr=User.current)
method parent_title (line 114) | def parent_title
method parent_title= (line 118) | def parent_title=(t)
method validate (line 126) | def validate
class WikiDiff (line 133) | class WikiDiff
method initialize (line 136) | def initialize(content_to, content_from)
class WikiAnnotate (line 147) | class WikiAnnotate
method initialize (line 150) | def initialize(content)
FILE: app/models/wiki_redirect.rb
class WikiRedirect (line 4) | class WikiRedirect < ActiveRecord::Base
FILE: app/models/workflow.rb
class Workflow (line 4) | class Workflow < ActiveRecord::Base
method count_by_tracker_and_role (line 12) | def self.count_by_tracker_and_role
method available_statuses (line 31) | def self.available_statuses(project, user=User.current)
method copy (line 42) | def self.copy(source_tracker, source_role, target_trackers, target_roles)
method copy_one (line 64) | def self.copy_one(source_tracker, source_role, target_tracker, target_...
FILE: config/boot.rb
type Rails (line 7) | module Rails
function boot! (line 9) | def boot!
function booted? (line 16) | def booted?
function pick_boot (line 20) | def pick_boot
function vendor_rails? (line 24) | def vendor_rails?
function preinitialize (line 28) | def preinitialize
function preinitializer_path (line 32) | def preinitializer_path
class Boot (line 37) | class Boot
method run (line 38) | def run
class VendorBoot (line 51) | class VendorBoot < Boot
method load_initializer (line 52) | def load_initializer
class GemBoot (line 59) | class GemBoot < Boot
method load_initializer (line 60) | def load_initializer
method load_rails_gem (line 66) | def load_rails_gem
method rubygems_version (line 78) | def rubygems_version
method gem_version (line 82) | def gem_version
method load_rubygems (line 92) | def load_rubygems
method parse_gem_version (line 105) | def parse_gem_version(text)
method read_environment_rb (line 110) | def read_environment_rb
FILE: config/initializers/10-patches.rb
type ActiveRecord (line 4) | module ActiveRecord
class Base (line 5) | class Base
method human_attribute_name (line 9) | def self.human_attribute_name(attr)
class Errors (line 16) | class Errors
method full_messages (line 17) | def full_messages(options = {})
type ActiveRecord (line 15) | module ActiveRecord
class Base (line 5) | class Base
method human_attribute_name (line 9) | def self.human_attribute_name(attr)
class Errors (line 16) | class Errors
method full_messages (line 17) | def full_messages(options = {})
type ActionView (line 37) | module ActionView
type Helpers (line 38) | module Helpers
type DateHelper (line 39) | module DateHelper
function distance_of_date_in_words (line 41) | def distance_of_date_in_words(from_date, to_date = 0, options = {})
type AsynchronousMailer (line 62) | module AsynchronousMailer
FILE: config/initializers/bigdecimal-segfault-fix.rb
function BigDecimal (line 24) | def BigDecimal(initial, digits=0)
FILE: config/initializers/hash.rb
class Hash (line 1) | class Hash
method + (line 2) | def +(hash2)
method to_array_conditions (line 12) | def to_array_conditions
FILE: db/migrate/20110320055526_acts_as_taggable_on_migration.rb
class ActsAsTaggableOnMigration (line 1) | class ActsAsTaggableOnMigration < ActiveRecord::Migration
method up (line 2) | def self.up
method down (line 25) | def self.down
FILE: db/migrate/20110329230314_add_projectid_to_taggable.rb
class AddProjectidToTaggable (line 1) | class AddProjectidToTaggable < ActiveRecord::Migration
method up (line 2) | def self.up
method down (line 6) | def self.down
FILE: db/migrate/20110330041648_add_tags_to_issue.rb
class AddTagsToIssue (line 1) | class AddTagsToIssue < ActiveRecord::Migration
method up (line 2) | def self.up
method down (line 6) | def self.down
FILE: extra/mail_handler/rdm-mailhandler.rb
type Net (line 58) | module Net
class HTTPS (line 59) | class HTTPS < HTTP
method post_form (line 60) | def self.post_form(url, params)
class RedmineMailHandler (line 71) | class RedmineMailHandler
method initialize (line 76) | def initialize
method submit (line 121) | def submit(email)
method debug (line 159) | def debug(msg)
FILE: extra/sample_plugin/app/controllers/example_controller.rb
class ExampleController (line 2) | class ExampleController < ApplicationController
method say_hello (line 9) | def say_hello
method say_goodbye (line 13) | def say_goodbye
method find_project (line 17) | def find_project
FILE: extra/sample_plugin/app/models/meeting.rb
class Meeting (line 1) | class Meeting < ActiveRecord::Base
FILE: extra/sample_plugin/db/migrate/001_create_meetings.rb
class CreateMeetings (line 3) | class CreateMeetings < ActiveRecord::Migration
method up (line 4) | def self.up
method down (line 12) | def self.down
FILE: lib/activity_streams/log_activity_streams.rb
type LogActivityStreams (line 10) | module LogActivityStreams
function write_single_activity_stream (line 12) | def self.write_single_activity_stream(actor,actor_name,object,object_n...
function find_identical (line 65) | def self.find_identical(actor, object, verb, activity) # :nodoc:
function included (line 74) | def self.included(controller) #:nodoc:
type ClassMethods (line 79) | module ClassMethods #:nodoc:
function log_activity_streams (line 84) | def log_activity_streams(actor_method, actor_name, verb, object_method,
function activity_stream_location (line 101) | def activity_stream_location
function write_activity_stream_log (line 109) | def write_activity_stream_log(actor_method, actor_name, verb, object_m...
FILE: lib/ar_condition.rb
class ARCondition (line 5) | class ARCondition
method initialize (line 8) | def initialize(condition=nil)
method add (line 13) | def add(condition)
method << (line 25) | def <<(condition)
FILE: lib/diff.rb
type RedmineDiff (line 1) | module RedmineDiff
class Diff (line 2) | class Diff
method lcs (line 6) | def Diff.lcs(a, b)
method makediff (line 56) | def makediff(a, b)
method compactdiffs (line 85) | def compactdiffs
method initialize (line 110) | def initialize(diffs_or_a, b = nil, isstring = nil)
method match (line 122) | def match(ai, bi)
method discarda (line 127) | def discarda(i, elem)
method discardb (line 131) | def discardb(i, elem)
method compact (line 135) | def compact
method compact! (line 139) | def compact!
method inspect (line 143) | def inspect
type Diffable (line 150) | module Diffable
function diff (line 151) | def diff(b)
function reverse_hash (line 158) | def reverse_hash(range = (0...self.length))
function replacenextlarger (line 171) | def replacenextlarger(value, high = nil)
function patch (line 194) | def patch(diff)
class Array (line 235) | class Array
class String (line 239) | class String
FILE: lib/faster_csv.rb
class FasterCSV (line 83) | class FasterCSV
class Row (line 95) | class Row
method initialize (line 112) | def initialize(headers, fields, header_row = false)
method header_row? (line 133) | def header_row?
method field_row? (line 138) | def field_row?
method headers (line 143) | def headers
method field (line 160) | def field(header_or_index, minimum_index = 0)
method []= (line 183) | def []=(*args)
method << (line 216) | def <<(arg)
method push (line 235) | def push(*args)
method delete (line 251) | def delete(header_or_index, minimum_index = 0)
method delete_if (line 266) | def delete_if(&block)
method fields (line 280) | def fields(*headers_and_or_indices)
method index (line 310) | def index(header, minimum_index = 0)
method header? (line 318) | def header?(name)
method field? (line 327) | def field?(data)
method each (line 341) | def each(&block)
method == (line 351) | def ==(other)
method to_hash (line 359) | def to_hash
method to_csv (line 369) | def to_csv(options = Hash.new)
method inspect (line 375) | def inspect
class Table (line 393) | class Table
method initialize (line 406) | def initialize(array_of_rows)
method by_col (line 432) | def by_col
method by_col! (line 442) | def by_col!
method by_col_or_row (line 457) | def by_col_or_row
method by_col_or_row! (line 469) | def by_col_or_row!
method by_row (line 484) | def by_row
method by_row! (line 494) | def by_row!
method headers (line 504) | def headers
method [] (line 520) | def [](index_or_header)
method []= (line 545) | def []=(index_or_header, value)
method values_at (line 583) | def values_at(*indices_or_headers)
method << (line 604) | def <<(row_or_array)
method push (line 621) | def push(*rows)
method delete (line 632) | def delete(index_or_header)
method delete_if (line 649) | def delete_if(&block)
method each (line 672) | def each(&block)
method == (line 683) | def ==(other)
method to_a (line 691) | def to_a
method to_csv (line 705) | def to_csv(options = Hash.new)
method inspect (line 716) | def inspect
class MalformedCSVError (line 722) | class MalformedCSVError < RuntimeError; end
method build_csv_interface (line 850) | def self.build_csv_interface
method dump (line 919) | def self.dump(ary_of_objs, io = "", options = Hash.new)
method filter (line 988) | def self.filter(*args)
method foreach (line 1022) | def self.foreach(path, options = Hash.new, &block)
method generate (line 1043) | def self.generate(*args)
method generate_line (line 1066) | def self.generate_line(row, options = Hash.new)
method instance (line 1080) | def self.instance(data = $stdout, options = Hash.new)
method load (line 1108) | def self.load(io_or_str, options = Hash.new)
method open (line 1187) | def self.open(*args)
method parse (line 1219) | def self.parse(*args, &block)
method parse_line (line 1239) | def self.parse_line(line, options = Hash.new)
method read (line 1247) | def self.read(path, options = Hash.new)
method readlines (line 1252) | def self.readlines(*args)
method table (line 1263) | def self.table(path, options = Hash.new)
method initialize (line 1397) | def initialize(data, options = Hash.new)
method rewind (line 1432) | def rewind
method << (line 1449) | def <<(row)
method convert (line 1488) | def convert(name = nil, &converter)
method header_convert (line 1503) | def header_convert(name = nil, &converter)
method each (line 1519) | def each
method read (line 1530) | def read
method header_row? (line 1541) | def header_row?
method shift (line 1552) | def shift
method inspect (line 1666) | def inspect
method init_separators (line 1703) | def init_separators(options)
method init_parsers (line 1783) | def init_parsers(options)
method init_converters (line 1815) | def init_converters(options, field_name = :converters)
method init_headers (line 1845) | def init_headers(options)
method add_converter (line 1865) | def add_converter(var_name, const, name = nil, &converter)
method convert_fields (line 1888) | def convert_fields(fields, headers = false)
method parse_headers (line 1916) | def parse_headers(row = nil)
method add_unconverted_fields (line 1950) | def add_unconverted_fields(row, fields)
function FasterCSV (line 1963) | def FasterCSV(*args, &block)
class Row (line 95) | class Row
method initialize (line 112) | def initialize(headers, fields, header_row = false)
method header_row? (line 133) | def header_row?
method field_row? (line 138) | def field_row?
method headers (line 143) | def headers
method field (line 160) | def field(header_or_index, minimum_index = 0)
method []= (line 183) | def []=(*args)
method << (line 216) | def <<(arg)
method push (line 235) | def push(*args)
method delete (line 251) | def delete(header_or_index, minimum_index = 0)
method delete_if (line 266) | def delete_if(&block)
method fields (line 280) | def fields(*headers_and_or_indices)
method index (line 310) | def index(header, minimum_index = 0)
method header? (line 318) | def header?(name)
method field? (line 327) | def field?(data)
method each (line 341) | def each(&block)
method == (line 351) | def ==(other)
method to_hash (line 359) | def to_hash
method to_csv (line 369) | def to_csv(options = Hash.new)
method inspect (line 375) | def inspect
class Table (line 393) | class Table
method initialize (line 406) | def initialize(array_of_rows)
method by_col (line 432) | def by_col
method by_col! (line 442) | def by_col!
method by_col_or_row (line 457) | def by_col_or_row
method by_col_or_row! (line 469) | def by_col_or_row!
method by_row (line 484) | def by_row
method by_row! (line 494) | def by_row!
method headers (line 504) | def headers
method [] (line 520) | def [](index_or_header)
method []= (line 545) | def []=(index_or_header, value)
method values_at (line 583) | def values_at(*indices_or_headers)
method << (line 604) | def <<(row_or_array)
method push (line 621) | def push(*rows)
method delete (line 632) | def delete(index_or_header)
method delete_if (line 649) | def delete_if(&block)
method each (line 672) | def each(&block)
method == (line 683) | def ==(other)
method to_a (line 691) | def to_a
method to_csv (line 705) | def to_csv(options = Hash.new)
method inspect (line 716) | def inspect
class MalformedCSVError (line 722) | class MalformedCSVError < RuntimeError; end
method build_csv_interface (line 850) | def self.build_csv_interface
method dump (line 919) | def self.dump(ary_of_objs, io = "", options = Hash.new)
method filter (line 988) | def self.filter(*args)
method foreach (line 1022) | def self.foreach(path, options = Hash.new, &block)
method generate (line 1043) | def self.generate(*args)
method generate_line (line 1066) | def self.generate_line(row, options = Hash.new)
method instance (line 1080) | def self.instance(data = $stdout, options = Hash.new)
method load (line 1108) | def self.load(io_or_str, options = Hash.new)
method open (line 1187) | def self.open(*args)
method parse (line 1219) | def self.parse(*args, &block)
method parse_line (line 1239) | def self.parse_line(line, options = Hash.new)
method read (line 1247) | def self.read(path, options = Hash.new)
method readlines (line 1252) | def self.readlines(*args)
method table (line 1263) | def self.table(path, options = Hash.new)
method initialize (line 1397) | def initialize(data, options = Hash.new)
method rewind (line 1432) | def rewind
method << (line 1449) | def <<(row)
method convert (line 1488) | def convert(name = nil, &converter)
method header_convert (line 1503) | def header_convert(name = nil, &converter)
method each (line 1519) | def each
method read (line 1530) | def read
method header_row? (line 1541) | def header_row?
method shift (line 1552) | def shift
method inspect (line 1666) | def inspect
method init_separators (line 1703) | def init_separators(options)
method init_parsers (line 1783) | def init_parsers(options)
method init_converters (line 1815) | def init_converters(options, field_name = :converters)
method init_headers (line 1845) | def init_headers(options)
method add_converter (line 1865) | def add_converter(var_name, const, name = nil, &converter)
method convert_fields (line 1888) | def convert_fields(fields, headers = false)
method parse_headers (line 1916) | def parse_headers(row = nil)
method add_unconverted_fields (line 1950) | def add_unconverted_fields(row, fields)
function FCSV (line 1968) | def FCSV(*args, &block)
class Array (line 1972) | class Array
method to_csv (line 1974) | def to_csv(options = Hash.new)
class String (line 1979) | class String
method parse_csv (line 1981) | def parse_csv(options = Hash.new)
FILE: lib/float.rb
class Float (line 1) | class Float
method round_to (line 2) | def round_to(x)
method ceil_to (line 6) | def ceil_to(x)
method floor_to (line 10) | def floor_to(x)
FILE: lib/generators/redmine_plugin/redmine_plugin_generator.rb
class RedminePluginGenerator (line 1) | class RedminePluginGenerator < Rails::Generator::NamedBase
method initialize (line 4) | def initialize(runtime_args, runtime_options = {})
method manifest (line 11) | def manifest
FILE: lib/generators/redmine_plugin_controller/redmine_plugin_controller_generator.rb
class RedminePluginControllerGenerator (line 4) | class RedminePluginControllerGenerator < ControllerGenerator
method initialize (line 7) | def initialize(runtime_args, runtime_options = {})
method destination_root (line 15) | def destination_root
method manifest (line 19) | def manifest
FILE: lib/generators/redmine_plugin_model/redmine_plugin_model_generator.rb
class RedminePluginModelGenerator (line 4) | class RedminePluginModelGenerator < ModelGenerator
method initialize (line 7) | def initialize(runtime_args, runtime_options = {})
method destination_root (line 15) | def destination_root
method manifest (line 19) | def manifest
FILE: lib/mention.rb
class Mention (line 4) | class Mention
method parse (line 5) | def self.parse(object, mentioner_id)
method send_mention (line 20) | def self.send_mention(object,mentioner_id, mentioned_login, mention_text)
FILE: lib/redcloth3.rb
class RedCloth3 (line 167) | class RedCloth3 < String
method initialize (line 254) | def initialize( string, restrictions = [] )
method to_html (line 266) | def to_html( *rules )
method htmlesc (line 438) | def htmlesc( str, mode=:Quotes )
method pgl (line 450) | def pgl( text )
method pba (line 461) | def pba( text_in, element = "" )
method block_textile_table (line 504) | def block_textile_table( text )
method block_textile_lists (line 537) | def block_textile_lists( text )
method block_textile_quotes (line 583) | def block_textile_quotes( text )
method inline_textile_code (line 610) | def inline_textile_code( text )
method lT (line 618) | def lT( text )
method hard_break (line 622) | def hard_break( text )
method blocks (line 628) | def blocks( text, deep_code = false )
method textile_bq (line 672) | def textile_bq( tag, atts, cite, content )
method textile_p (line 679) | def textile_p( tag, atts, cite, content )
method textile_fn_ (line 691) | def textile_fn_( tag, num, atts, cite, content )
method block_textile_prefix (line 700) | def block_textile_prefix( text )
method block_markdown_setext (line 715) | def block_markdown_setext( text )
method block_markdown_atx (line 730) | def block_markdown_atx( text )
method block_markdown_bq (line 741) | def block_markdown_bq( text )
method block_markdown_rule (line 755) | def block_markdown_rule( text )
method block_markdown_lists (line 762) | def block_markdown_lists( text )
method inline_textile_span (line 765) | def inline_textile_span( text )
method inline_textile_link (line 805) | def inline_textile_link( text )
method inline_markdown_reflink (line 839) | def inline_markdown_reflink( text )
method inline_markdown_link (line 871) | def inline_markdown_link( text )
method refs (line 886) | def refs( text )
method refs_textile (line 892) | def refs_textile( text )
method refs_markdown (line 900) | def refs_markdown( text )
method check_refs (line 909) | def check_refs( text )
method inline_textile_image (line 927) | def inline_textile_image( text )
method shelve (line 961) | def shelve( val )
method retrieve (line 966) | def retrieve( text )
method incoming_entities (line 972) | def incoming_entities( text )
method no_textile (line 980) | def no_textile( text )
method clean_white_space (line 987) | def clean_white_space( text )
method flush_left (line 1001) | def flush_left( text )
method footnote_ref (line 1013) | def footnote_ref( text )
method glyphs_textile (line 1025) | def glyphs_textile( text, level = 0 )
method rip_offtags (line 1052) | def rip_offtags( text )
method smooth_offtags (line 1089) | def smooth_offtags( text )
method inline (line 1096) | def inline( text )
method h_align (line 1104) | def h_align( text )
method v_align (line 1108) | def v_align( text )
method textile_popup_help (line 1112) | def textile_popup_help( name, windowW, windowH )
method clean_html (line 1151) | def clean_html( text, tags = BASIC_TAGS )
method escape_html_tags (line 1178) | def escape_html_tags(text)
FILE: lib/redmine/about.rb
type Redmine (line 1) | module Redmine
class About (line 2) | class About
method print_plugin_info (line 3) | def self.print_plugin_info
FILE: lib/redmine/access_control.rb
type Redmine (line 4) | module Redmine
type AccessControl (line 5) | module AccessControl
function map (line 8) | def map
function permissions (line 15) | def permissions
function permission (line 21) | def permission(name)
function allowed_actions (line 26) | def allowed_actions(permission_name)
function public_permissions (line 31) | def public_permissions
function members_only_permissions (line 35) | def members_only_permissions
function loggedin_only_permissions (line 39) | def loggedin_only_permissions
function available_project_modules (line 43) | def available_project_modules
function modules_permissions (line 47) | def modules_permissions(modules)
class Mapper (line 52) | class Mapper
method initialize (line 53) | def initialize
method permission (line 57) | def permission(name, hash, options={})
method project_module (line 63) | def project_module(name, options={})
method mapped_permissions (line 69) | def mapped_permissions
class Permission (line 74) | class Permission
method initialize (line 77) | def initialize(name, hash, options)
method public? (line 93) | def public?
method require_member? (line 97) | def require_member?
method require_loggedin? (line 101) | def require_loggedin?
FILE: lib/redmine/access_keys.rb
type Redmine (line 5) | module Redmine
type AccessKeys (line 6) | module AccessKeys
function key_for (line 14) | def self.key_for(action)
FILE: lib/redmine/activity.rb
type Redmine (line 5) | module Redmine
type Activity (line 6) | module Activity
function map (line 15) | def map(&block)
function register (line 20) | def register(event_type, options={})
FILE: lib/redmine/activity/fetcher.rb
type Redmine (line 5) | module Redmine
type Activity (line 6) | module Activity
class Fetcher (line 8) | class Fetcher
method initialize (line 14) | def initialize(user, options={})
method event_types (line 24) | def event_types
method scope_select (line 33) | def scope_select(&block)
method scope= (line 39) | def scope=(s)
method default_scope! (line 51) | def default_scope!
method events (line 57) | def events(from = nil, to = nil, options={})
method constantized_providers (line 77) | def constantized_providers(event_type)
FILE: lib/redmine/core_ext/string.rb
class String (line 4) | class String #:nodoc:
FILE: lib/redmine/core_ext/string/conversions.rb
type Redmine (line 5) | module Redmine #:nodoc:
type CoreExtensions (line 6) | module CoreExtensions #:nodoc:
type String (line 7) | module String #:nodoc:
type Conversions (line 9) | module Conversions
function to_hours (line 11) | def to_hours
function to_a (line 29) | def to_a
FILE: lib/redmine/core_ext/string/inflections.rb
type Redmine (line 4) | module Redmine #:nodoc:
type CoreExtensions (line 5) | module CoreExtensions #:nodoc:
type String (line 6) | module String #:nodoc:
type Inflections (line 8) | module Inflections
function with_leading_slash (line 9) | def with_leading_slash
FILE: lib/redmine/default_data/loader.rb
type Redmine (line 4) | module Redmine
type DefaultData (line 5) | module DefaultData
class DataAlreadyLoaded (line 6) | class DataAlreadyLoaded < Exception; end
type Loader (line 8) | module Loader
function no_data? (line 14) | def no_data?
function load (line 23) | def load(lang=nil)
FILE: lib/redmine/export/pdf.rb
type Redmine (line 10) | module Redmine
type Export (line 11) | module Export
type PDF (line 12) | module PDF
class IFPDF (line 16) | class IFPDF < FPDF
method initialize (line 20) | def initialize(lang)
method SetFontStyle (line 47) | def SetFontStyle(style, size)
method SetTitle (line 51) | def SetTitle(txt)
method textstring (line 63) | def textstring(s)
method Cell (line 72) | def Cell(w,h=0,txt='',border=0,ln=0,align='',fill=0,link='')
method Footer (line 87) | def Footer
function issues_to_pdf (line 99) | def issues_to_pdf(issues, project, query)
function issue_to_pdf (line 163) | def issue_to_pdf(issue)
function gantt_to_pdf (line 280) | def gantt_to_pdf(gantt, project)
FILE: lib/redmine/helpers/calendar.rb
type Redmine (line 4) | module Redmine
type Helpers (line 5) | module Helpers
class Calendar (line 8) | class Calendar
method initialize (line 12) | def initialize(date, lang = current_language, period = :month)
method events= (line 35) | def events=(events)
method events_on (line 42) | def events_on(day)
method month (line 47) | def month
method first_wday (line 53) | def first_wday
method last_wday (line 64) | def last_wday
FILE: lib/redmine/helpers/gantt.rb
type Redmine (line 5) | module Redmine
type Helpers (line 6) | module Helpers
class Gantt (line 8) | class Gantt
method initialize (line 11) | def initialize(options={})
method events= (line 42) | def events=(e)
method params (line 46) | def params
method params_previous (line 50) | def params_previous
method params_next (line 54) | def params_next
method to_image (line 60) | def to_image(format='PNG')
FILE: lib/redmine/i18n.rb
type Redmine (line 1) | module Redmine
type I18n (line 2) | module I18n
function included (line 3) | def self.included(base)
function l (line 7) | def l(*args)
function l_or_humanize (line 24) | def l_or_humanize(s, options={})
function l_hours (line 29) | def l_hours(hours)
function ll (line 34) | def ll(lang, str, value=nil)
function format_date (line 38) | def format_date(date)
function format_time (line 43) | def format_time(time, include_date = true)
function local_time (line 52) | def local_time(time)
function day_name (line 61) | def day_name(day)
function month_name (line 65) | def month_name(month)
function valid_languages (line 69) | def valid_languages
function find_language (line 73) | def find_language(lang)
function set_language_if_valid (line 78) | def set_language_if_valid(lang)
function current_language (line 84) | def current_language
FILE: lib/redmine/imap.rb
type Redmine (line 7) | module Redmine
type IMAP (line 8) | module IMAP
function check (line 10) | def check(imap_options={}, options={})
function logger (line 42) | def logger
FILE: lib/redmine/info.rb
type Redmine (line 1) | module Redmine
type Info (line 2) | module Info
function app_name (line 4) | def app_name; 'Redmine' end
function url (line 5) | def url; 'http://www.redmine.org/' end
function help_url (line 6) | def help_url; 'http://www.redmine.org/guide' end
function versioned_name (line 7) | def versioned_name; "#{app_name} #{Redmine::VERSION}" end
function issue (line 10) | def issue(issue_id)
FILE: lib/redmine/menu_manager.rb
type TreeNodePatch (line 7) | module TreeNodePatch
function included (line 8) | def self.included(base)
type InstanceMethods (line 22) | module InstanceMethods
function prepend (line 26) | def prepend(child)
function add_at (line 39) | def add_at(child, position)
function add_last (line 49) | def add_last(child)
function add (line 63) | def add(child)
function position (line 76) | def position
type Redmine (line 83) | module Redmine
type MenuManager (line 84) | module MenuManager
class MenuError (line 85) | class MenuError < StandardError #:nodoc:
type MenuController (line 88) | module MenuController
function included (line 89) | def self.included(base)
type ClassMethods (line 93) | module ClassMethods
function menu_item (line 105) | def menu_item(id, options = {})
function menu_items (line 115) | def menu_items
function current_menu_item (line 120) | def current_menu_item
function redirect_to_project_menu_item (line 127) | def redirect_to_project_menu_item(project, name)
type MenuHelper (line 137) | module MenuHelper
function current_menu_item (line 139) | def current_menu_item
function render_main_menu (line 144) | def render_main_menu(project)
function render_menu (line 148) | def render_menu(menu, project=nil)
function render_menu_node (line 156) | def render_menu_node(node, project=nil)
function render_menu_node_with_children (line 166) | def render_menu_node_with_children(node, project=nil)
function render_unattached_children_menu (line 193) | def render_unattached_children_menu(node, project)
function render_single_menu_node (line 209) | def render_single_menu_node(item, caption, url, selected)
function render_unattached_menu_item (line 213) | def render_unattached_menu_item(menu_item, project)
function menu_items_for (line 223) | def menu_items_for(menu, project=nil)
function extract_node_details (line 237) | def extract_node_details(node, project=nil)
function allowed_node? (line 255) | def allowed_node?(node, user, project)
function map (line 271) | def map(menu_name)
function items (line 281) | def items(menu_name)
class Mapper (line 286) | class Mapper
method initialize (line 287) | def initialize(menu, items)
method push (line 308) | def push(name, url, options={})
method delete (line 350) | def delete(name)
method exists? (line 357) | def exists?(name)
method find (line 361) | def find(name)
method position_of (line 365) | def position_of(name)
class MenuItem (line 374) | class MenuItem < Tree::TreeNode
method initialize (line 378) | def initialize(name, url, options)
method caption (line 396) | def caption(project=nil)
method html_options (line 410) | def html_options(options={})
FILE: lib/redmine/mime_type.rb
type Redmine (line 4) | module Redmine
type MimeType (line 5) | module MimeType
function of (line 42) | def self.of(name)
function css_class_of (line 50) | def self.css_class_of(name)
function main_mimetype_of (line 55) | def self.main_mimetype_of(name)
function is_type? (line 62) | def self.is_type?(type, name)
FILE: lib/redmine/platform.rb
type Redmine (line 5) | module Redmine
type Platform (line 6) | module Platform
function mswin? (line 8) | def mswin?
FILE: lib/redmine/plugin.rb
type Redmine (line 4) | module Redmine #:nodoc:
class PluginNotFound (line 6) | class PluginNotFound < StandardError; end
class PluginRequirementError (line 7) | class PluginRequirementError < StandardError; end
class Plugin (line 31) | class Plugin
method def_field (line 37) | def def_field(*names)
method register (line 51) | def self.register(id, &block)
method all (line 63) | def self.all
method find (line 69) | def self.find(id)
method clear (line 75) | def self.clear
method initialize (line 79) | def initialize(id)
method <=> (line 83) | def <=>(plugin)
method requires_redmine (line 98) | def requires_redmine(arg)
method requires_redmine_plugin (line 132) | def requires_redmine_plugin(plugin_name, arg)
method menu (line 163) | def menu(menu, item, url, options={})
method delete_menu_item (line 169) | def delete_menu_item(menu, item)
method permission (line 195) | def permission(name, actions, options = {})
method project_module (line 210) | def project_module(name, &block)
method activity_provider (line 238) | def activity_provider(*args)
method wiki_format_provider (line 248) | def wiki_format_provider(name, formatter, helper)
method configurable? (line 253) | def configurable?
FILE: lib/redmine/search.rb
type Redmine (line 18) | module Redmine
type Search (line 19) | module Search
type Controller (line 20) | module Controller
function included (line 21) | def self.included(base)
type ClassMethods (line 25) | module ClassMethods
function default_search_scope (line 34) | def default_search_scope(id, options = {})
function default_search_scopes (line 44) | def default_search_scopes
function default_search_scope (line 49) | def default_search_scope
FILE: lib/redmine/themes.rb
type Redmine (line 4) | module Redmine
type Themes (line 5) | module Themes
function themes (line 8) | def self.themes
function rescan (line 13) | def self.rescan
function theme (line 18) | def self.theme(id)
class Theme (line 23) | class Theme
method initialize (line 26) | def initialize(path)
method id (line 33) | def id; dir end
method <=> (line 35) | def <=>(theme)
function scan_themes (line 42) | def self.scan_themes
type ApplicationHelper (line 52) | module ApplicationHelper
function stylesheet_path (line 53) | def stylesheet_path(source)
function path_to_stylesheet (line 59) | def path_to_stylesheet(source)
FILE: lib/redmine/unified_diff.rb
type Redmine (line 5) | module Redmine
class UnifiedDiff (line 7) | class UnifiedDiff < Array
method initialize (line 8) | def initialize(diff, options={})
method truncated? (line 31) | def truncated?; @truncated; end
class DiffTable (line 35) | class DiffTable < Hash
method initialize (line 40) | def initialize(type="inline")
method add_line (line 51) | def add_line(line)
method inspect (line 74) | def inspect
method sbs? (line 84) | def sbs?(type, func)
method escapeHTML (line 110) | def escapeHTML(line)
method parse_line (line 114) | def parse_line(line, type="inline")
class Diff (line 152) | class Diff
method initialize (line 160) | def initialize()
method inspect (line 169) | def inspect
FILE: lib/redmine/utils.rb
type Redmine (line 17) | module Redmine
type Utils (line 18) | module Utils
function relative_url_root (line 21) | def relative_url_root
function relative_url_root= (line 28) | def relative_url_root=(arg)
FILE: lib/redmine/version.rb
type Redmine (line 3) | module Redmine
type VERSION (line 4) | module VERSION #:nodoc:
function revision (line 15) | def self.revision
function to_a (line 40) | def self.to_a; ARRAY end
function to_s (line 41) | def self.to_s; STRING end
FILE: lib/redmine/views/my_page/block.rb
type Redmine (line 4) | module Redmine
type Views (line 5) | module Views
type MyPage (line 6) | module MyPage
type Block (line 7) | module Block
function additional_blocks (line 8) | def self.additional_blocks
FILE: lib/redmine/views/other_formats_builder.rb
type Redmine (line 4) | module Redmine
type Views (line 5) | module Views
class OtherFormatsBuilder (line 6) | class OtherFormatsBuilder
method initialize (line 7) | def initialize(view)
method link_to (line 11) | def link_to(name, options={})
FILE: lib/redmine/wiki_formatting.rb
type Redmine (line 5) | module Redmine
type WikiFormatting (line 6) | module WikiFormatting
function map (line 10) | def map
function register (line 14) | def register(name, formatter, helper)
function formatter_for (line 19) | def formatter_for(name)
function helper_for (line 24) | def helper_for(name)
function format_names (line 29) | def format_names
function to_html (line 33) | def to_html(format, text, options = {}, &block)
type NullFormatter (line 39) | module NullFormatter
class Formatter (line 40) | class Formatter
method initialize (line 45) | def initialize(text)
method to_html (line 49) | def to_html(*args)
type Helper (line 54) | module Helper
function initial_page_content (line 55) | def initial_page_content(page)
FILE: lib/redmine/wiki_formatting/macros.rb
type Redmine (line 4) | module Redmine
type WikiFormatting (line 5) | module WikiFormatting
type Macros (line 6) | module Macros
type Definitions (line 7) | module Definitions
function exec_macro (line 8) | def exec_macro(name, obj, args)
function extract_macro_options (line 13) | def extract_macro_options(args, *keys)
function register (line 39) | def register(&block)
function macro (line 45) | def macro(name, &block)
function desc (line 54) | def desc(txt)
FILE: lib/redmine/wiki_formatting/textile/formatter.rb
type Redmine (line 8) | module Redmine
type WikiFormatting (line 9) | module WikiFormatting
type Textile (line 10) | module Textile
class Formatter (line 11) | class Formatter < RedCloth3
method initialize (line 16) | def initialize(*args)
method to_html (line 23) | def to_html(*rules, &block)
method hard_break (line 33) | def hard_break( text )
method smooth_offtags (line 38) | def smooth_offtags( text )
method textile_p_withtoc (line 53) | def textile_p_withtoc(tag, atts, cite, content)
method inline_toc (line 77) | def inline_toc(text)
method inline_macros (line 102) | def inline_macros(text)
method inline_auto_link (line 138) | def inline_auto_link(text)
method inline_auto_mailto (line 158) | def inline_auto_mailto(text)
FILE: lib/redmine/wiki_formatting/textile/helper.rb
type Redmine (line 5) | module Redmine
type WikiFormatting (line 6) | module WikiFormatting
type Textile (line 7) | module Textile
type Helper (line 8) | module Helper
function initial_page_content (line 10) | def initial_page_content(page)
FILE: lib/string.rb
class String (line 3) | class String
method truncate_html (line 4) | def truncate_html(len = 30)
method attrs_to_s (line 36) | def attrs_to_s(attrs)
FILE: lib/tabular_form_builder.rb
class TabularFormBuilder (line 6) | class TabularFormBuilder < ActionView::Helpers::FormBuilder
method initialize (line 9) | def initialize(object_name, object, template, options, proc)
method select (line 23) | def select(field, choices, options = {}, html_options = {})
method label_for_field (line 28) | def label_for_field(field, options = {})
FILE: lib/tasks/autoaccept_commitrequests.rake
function helpers (line 6) | def helpers
FILE: lib/tasks/close_retros.rake
function helpers (line 3) | def helpers
FILE: lib/tasks/deprecated.rake
function deprecated_task (line 1) | def deprecated_task(name, new_name)
FILE: lib/tasks/migrate_from_mantis.rake
type MantisMigrate (line 13) | module MantisMigrate
class MantisUser (line 72) | class MantisUser < ActiveRecord::Base
method firstname (line 75) | def firstname
method lastname (line 81) | def lastname
method email (line 88) | def email
method username (line 97) | def username
class MantisProject (line 102) | class MantisProject < ActiveRecord::Base
method name (line 109) | def name
method identifier (line 113) | def identifier
class MantisVersion (line 118) | class MantisVersion < ActiveRecord::Base
method version (line 121) | def version
method description (line 125) | def description
class MantisCategory (line 130) | class MantisCategory < ActiveRecord::Base
class MantisProjectUser (line 134) | class MantisProjectUser < ActiveRecord::Base
class MantisBug (line 138) | class MantisBug < ActiveRecord::Base
class MantisBugText (line 146) | class MantisBugText < ActiveRecord::Base
method full_description (line 151) | def full_description
class MantisBugNote (line 159) | class MantisBugNote < ActiveRecord::Base
class MantisBugNoteText (line 165) | class MantisBugNoteText < ActiveRecord::Base
class MantisBugFile (line 169) | class MantisBugFile < ActiveRecord::Base
method size (line 172) | def size
method original_filename (line 176) | def original_filename
method content_type (line 180) | def content_type
method read (line 184) | def read(*args)
class MantisBugRelationship (line 194) | class MantisBugRelationship < ActiveRecord::Base
class MantisBugMonitor (line 198) | class MantisBugMonitor < ActiveRecord::Base
class MantisNews (line 202) | class MantisNews < ActiveRecord::Base
class MantisCustomField (line 206) | class MantisCustomField < ActiveRecord::Base
method format (line 212) | def format
method name (line 216) | def name
class MantisCustomFieldProject (line 221) | class MantisCustomFieldProject < ActiveRecord::Base
class MantisCustomFieldString (line 225) | class MantisCustomFieldString < ActiveRecord::Base
function migrate (line 230) | def self.migrate
function encoding (line 432) | def self.encoding(charset)
function establish_connection (line 438) | def self.establish_connection(params)
function encode (line 446) | def self.encode(text)
FILE: lib/tasks/migrate_from_trac.rake
type TracMigrate (line 25) | module TracMigrate
class ::Time (line 71) | class ::Time
method now (line 74) | def now
method fake (line 77) | def fake(time)
class TracComponent (line 86) | class TracComponent < ActiveRecord::Base
class TracMilestone (line 90) | class TracMilestone < ActiveRecord::Base
method due (line 93) | def due
method completed (line 101) | def completed
method description (line 109) | def description
class TracTicketCustom (line 115) | class TracTicketCustom < ActiveRecord::Base
class TracAttachment (line 119) | class TracAttachment < ActiveRecord::Base
method time (line 123) | def time; Time.at(read_attribute(:time)) end
method original_filename (line 125) | def original_filename
method content_type (line 129) | def content_type
method exist? (line 133) | def exist?
method open (line 137) | def open
method read (line 144) | def read(*args)
method description (line 148) | def description
method trac_fullpath (line 153) | def trac_fullpath
class TracTicket (line 160) | class TracTicket < ActiveRecord::Base
method ticket_type (line 172) | def ticket_type
method summary (line 176) | def summary
method description (line 180) | def description
method time (line 184) | def time; Time.at(read_attribute(:time)) end
method changetime (line 185) | def changetime; Time.at(read_attribute(:changetime)) end
class TracTicketChange (line 188) | class TracTicketChange < ActiveRecord::Base
method time (line 191) | def time; Time.at(read_attribute(:time)) end
class TracWikiPage (line 202) | class TracWikiPage < ActiveRecord::Base
method columns (line 211) | def self.columns
method time (line 216) | def time; Time.at(read_attribute(:time)) end
class TracPermission (line 219) | class TracPermission < ActiveRecord::Base
class TracSessionAttribute (line 223) | class TracSessionAttribute < ActiveRecord::Base
function find_or_create_user (line 227) | def self.find_or_create_user(username, project_member = false)
function convert_wiki_text (line 272) | def self.convert_wiki_text(text)
function migrate (line 365) | def self.migrate
function limit_for (line 596) | def self.limit_for(klass, attribute)
function encoding (line 600) | def self.encoding(charset)
function set_trac_directory (line 607) | def self.set_trac_directory(path)
function trac_directory (line 617) | def self.trac_directory
function set_trac_adapter (line 621) | def self.set_trac_adapter(adapter)
function set_trac_db_host (line 632) | def self.set_trac_db_host(host)
function set_trac_db_port (line 637) | def self.set_trac_db_port(port)
function set_trac_db_name (line 642) | def self.set_trac_db_name(name)
function set_trac_db_username (line 647) | def self.set_trac_db_username(username)
function set_trac_db_password (line 651) | def self.set_trac_db_password(password)
function set_trac_db_schema (line 655) | def self.set_trac_db_schema(schema)
function trac_db_path (line 661) | def self.trac_db_path; "#{trac_directory}/db/trac.db" end
function trac_attachments_directory (line 662) | def self.trac_attachments_directory; "#{trac_directory}/attachments" end
function target_project_identifier (line 664) | def self.target_project_identifier(identifier)
function connection_params (line 685) | def self.connection_params
function establish_connection (line 701) | def self.establish_connection
function encode (line 710) | def self.encode(text)
function prompt (line 731) | def prompt(text, options = {}, &block)
FILE: lib/tasks/plugins.rake
class PluginSourceAnnotationExtractor (line 5) | class PluginSourceAnnotationExtractor < SourceAnnotationExtractor
method find_in (line 10) | def find_in(dir)
FILE: lib/tasks/rspec.rake
type Spec (line 24) | module Spec
type Rake (line 25) | module Rake
class SpecTask (line 26) | class SpecTask
method initialize (line 27) | def initialize(name)
FILE: lib/tasks/steak.rake
type Spec (line 6) | module Spec
type Rake (line 7) | module Rake
class SpecTask (line 8) | class SpecTask
method initialize (line 9) | def initialize(name)
FILE: public/javascripts/application.js
function initialize (line 7) | function initialize(){
function break_long_words (line 14) | function break_long_words(){
function arm_fancybox (line 18) | function arm_fancybox(){
function arm_checkboxes (line 43) | function arm_checkboxes(){
function prep_jumpbox (line 58) | function prep_jumpbox(){
function adjust_jumpbox_width (line 81) | function adjust_jumpbox_width(){
function show_fancybox (line 88) | function show_fancybox(url,message){
function checkAll (line 108) | function checkAll (id, checked) {
function toggleCheckboxesBySelector (line 112) | function toggleCheckboxesBySelector(selector) {
function showAndScrollTo (line 119) | function showAndScrollTo(id, focus) {
function toggleRowGroup (line 125) | function toggleRowGroup(el) {
function toggleFieldset (line 135) | function toggleFieldset(el) {
function addFileField (line 143) | function addFileField() {
function showTab (line 161) | function showTab(name) {
function moveTabRight (line 169) | function moveTabRight(el) {
function moveTabLeft (line 188) | function moveTabLeft(el) {
function displayTabsButtons (line 199) | function displayTabsButtons() {
function setPredecessorFieldsVisibility (line 218) | function setPredecessorFieldsVisibility() {
function collapseScmEntry (line 227) | function collapseScmEntry(id) {
function expandScmEntry (line 238) | function expandScmEntry(id) {
function scmEntryClick (line 249) | function scmEntryClick(id) {
function scmEntryLoaded (line 267) | function scmEntryLoaded(id) {
function randomKey (line 273) | function randomKey(size) {
function url_for (line 314) | function url_for(options){
function h (line 335) | function h(s) {
function text_only (line 349) | function text_only(text){
function display_sparks (line 356) | function display_sparks(){
function humane_date (line 398) | function humane_date(date_str){
function promptToRemote (line 448) | function promptToRemote(text, param, url) {
function send_remote (line 457) | function send_remote(url,param,note){
function comment_prompt_to_remote (line 468) | function comment_prompt_to_remote(dataId,title,message,param,url,required){
function show_tip (line 957) | function show_tip(){
function create_wrapper (line 1011) | function create_wrapper(noTip){
function _HideWrapper (line 1079) | function _HideWrapper() {
function _Calculate (line 1108) | function _Calculate(firstTime) {
function innerHighlight (line 1447) | function innerHighlight(node, pat) {
function wbr (line 1616) | function wbr(string,length){
function getCaretPosition (line 1685) | function getCaretPosition(e) {
function setCaretPosition (line 1696) | function setCaretPosition(e, start, end) {
function getWordBeforeCaretPosition (line 1708) | function getWordBeforeCaretPosition(e) {
function getWordBeforeCaret (line 1717) | function getWordBeforeCaret(e) {
function replaceWordBeforeCaret (line 1723) | function replaceWordBeforeCaret(e, word) {
function bind_autocomplete_mentions (line 1837) | function bind_autocomplete_mentions(){
function bind_relations_autocomplete (line 1846) | function bind_relations_autocomplete(projectId){
function help_popup (line 1893) | function help_popup(){
FILE: public/javascripts/calendar/calendar-setup.js
function param_default (line 63) | function param_default(pname, def) { if (typeof params[pname] == "undefi...
function onSelect (line 105) | function onSelect(cal) {
FILE: public/javascripts/calendar/calendar.js
function setMonth (line 618) | function setMonth(m) {
function makeTimePart (line 847) | function makeTimePart(className, init, range_start, range_end) {
function setVars (line 1002) | function setVars() {
function prevMonth (line 1009) | function prevMonth() {
function nextMonth (line 1014) | function nextMonth() {
function fixPosition (line 1380) | function fixPosition(box) {
function getVisib (line 1465) | function getVisib(obj){
FILE: public/javascripts/context_menu.js
function toggleIssuesSelection (line 192) | function toggleIssuesSelection(el) {
function window_size (line 207) | function window_size() {
FILE: public/javascripts/controls.js
function addText (line 561) | function addText(mode, condition) {
function fallback (line 857) | function fallback(name, expr) {
FILE: public/javascripts/dashboard.js
function start (line 88) | function start(){
function set_sub_toggle (line 118) | function set_sub_toggle(){
function load_dashboard (line 141) | function load_dashboard(){
function parse_xml (line 171) | function parse_xml(xml){
function load_dashboard_data (line 181) | function load_dashboard_data(){
function refresh_local_data (line 221) | function refresh_local_data(){
function save_local_data (line 242) | function save_local_data(){
function get_local_data (line 258) | function get_local_data(){
function load_dashboard_data_for_statuses (line 290) | function load_dashboard_data_for_statuses(status_ids,name){
function data_ready (line 345) | function data_ready(html,name){
function replace_reloading_images_for_panels (line 375) | function replace_reloading_images_for_panels(){
function enable_refresh_button (line 411) | function enable_refresh_button(){
function disable_refresh_button (line 415) | function disable_refresh_button(){
function retros_ready (line 419) | function retros_ready(html,load_remaining_panels){
function insert_retros (line 424) | function insert_retros(){
function add_retro (line 431) | function add_retro(rdataId,position,scroll){
function make_text_boxes_toggle_keyboard_shortcuts (line 450) | function make_text_boxes_toggle_keyboard_shortcuts(){
function prepare_page (line 481) | function prepare_page(){
function start_timer (line 489) | function start_timer(){
function stop_timer (line 502) | function stop_timer(timer){
function prepare_item_lookup_array (line 507) | function prepare_item_lookup_array(){
function display_panels (line 515) | function display_panels(){
function wipe_panels (line 527) | function wipe_panels(){
function sort_panels (line 532) | function sort_panels(){
function add_items_to_panels (line 538) | function add_items_to_panels(last_item){
function adjust_button_container_widths (line 547) | function adjust_button_container_widths(){
function rdata_ready (line 569) | function rdata_ready(html,rdataId){
function show_item_fancybox (line 588) | function show_item_fancybox(dataId){
function show_details_flyover (line 601) | function show_details_flyover(dataId,callingElement,delayshow){
function show_estimate_flyover (line 614) | function show_estimate_flyover(dataId,callingElement){
function show_points_flyover (line 626) | function show_points_flyover(dataId,callingElement){
function hide_bubbletips (line 638) | function hide_bubbletips(){
function show_pri_flyover (line 643) | function show_pri_flyover(dataId,callingElement){
function show_agree_flyover (line 656) | function show_agree_flyover(dataId,callingElement){
function show_accept_flyover (line 669) | function show_accept_flyover(dataId,callingElement){
function is_visible (line 687) | function is_visible(item){
function is_startable (line 693) | function is_startable(item){
function add_item (line 703) | function add_item(dataId,position,scroll,panelid){
function generate_estimate_flyover (line 762) | function generate_estimate_flyover(dataId){
function generate_points_flyover (line 854) | function generate_points_flyover(dataId){
function prompt_for_number (line 873) | function prompt_for_number(message,default_data){
function prompt_for_custom_estimate (line 886) | function prompt_for_custom_estimate(dataId,points){
function generate_custom_estimate_button (line 893) | function generate_custom_estimate_button(dataId,user_estimate){
function convert_points_to_complexity (line 910) | function convert_points_to_complexity(points){
function generate_estimate_button (line 922) | function generate_estimate_button(points,credits, itemId, dataId, comment){
function generate_pri_action (line 944) | function generate_pri_action(points, itemId, dataId){
function pri_text (line 949) | function pri_text(points){
function agree_text (line 964) | function agree_text(points){
function accept_text (line 982) | function accept_text(points){
function generate_pri_flyover (line 1000) | function generate_pri_flyover(dataId){
function generate_flyover (line 1052) | function generate_flyover(dataId,type,title,you_voted,action_header,butt...
function generate_agree_flyover (line 1112) | function generate_agree_flyover(dataId){
function generate_accept_flyover (line 1172) | function generate_accept_flyover(dataId){
function generate_details_flyover_description (line 1232) | function generate_details_flyover_description(item){
function generate_comments_section (line 1254) | function generate_comments_section(dataId){
function generate_comments (line 1279) | function generate_comments(dataId,blank_if_no_comments){
function generate_comment (line 1323) | function generate_comment(author,note,created_at,itemId,last_comment,jou...
function generate_todos (line 1344) | function generate_todos(dataId,blank_if_no_todos, item_editable){
function generate_todo (line 1375) | function generate_todo(subject,completed_on,todoId,owner_login,dataId, i...
function edit_todo (line 1421) | function edit_todo(todoId, dataId){
function edit_comment (line 1439) | function edit_comment(journalId,dataId){
function edit_comment_cancel (line 1457) | function edit_comment_cancel(journalId,dataId){
function edit_comment_post (line 1463) | function edit_comment_post(journalId,dataId){
function edit_todo_post (line 1499) | function edit_todo_post(todoId, dataId){
function update_todo_buttons (line 1551) | function update_todo_buttons(todoId,show){
function credits_to_points (line 1563) | function credits_to_points(credits,base){
function has_current_user_estimated (line 1571) | function has_current_user_estimated(item){
function generate_item_estimate_button (line 1584) | function generate_item_estimate_button(dataId,points){
function add_new_link (line 1614) | function add_new_link(){
function remove_new_link (line 1618) | function remove_new_link(){
function generate_new_link (line 1623) | function generate_new_link(){
function generate_item (line 1642) | function generate_item(dataId){
function generate_tags (line 1692) | function generate_tags(tag_list){
function generate_item_lightbox (line 1717) | function generate_item_lightbox(dataId){
function update_lightbox_lock_version (line 1752) | function update_lightbox_lock_version(dataId){
function generate_retro (line 1756) | function generate_retro(rdataId){
function display_retro (line 1795) | function display_retro(rdataId){
function generate_notice (line 1835) | function generate_notice(noticeHtml, noticeId){
function is_cancelable (line 1856) | function is_cancelable(dataId){
function buttons_for (line 1888) | function buttons_for(dataId,expanded){
function is_part_of_team (line 1952) | function is_part_of_team(item){
function agree_buttons_root (line 1964) | function agree_buttons_root(dataId,include_start_button,expanded){
function accept_buttons_root (line 2076) | function accept_buttons_root(dataId,include_start_button,expanded){
function pri_button (line 2128) | function pri_button(dataId){
function generate_pri_button (line 2146) | function generate_pri_button(dataId,direction,pri){
function votes_button (line 2154) | function votes_button(dataId,votes_total,user_voted){
function dash_button (line 2183) | function dash_button(type,dataId,hide,options_param){
function click_start (line 2218) | function click_start(dataId,source,data){
function click_reject (line 2238) | function click_reject(dataId,source,data){
function click_estimate (line 2248) | function click_estimate(dataId,source,data,comment){
function click_estimate_from_flyover (line 2253) | function click_estimate_from_flyover(dataId,source,data,comment){
function click_finish (line 2268) | function click_finish(dataId,source,data){
function click_restart (line 2276) | function click_restart(dataId,source,data){
function click_agree (line 2288) | function click_agree(dataId,source,data){
function click_agree_root (line 2320) | function click_agree_root(dataId,source,data){
function click_accept_root (line 2325) | function click_accept_root(dataId,source,data){
function click_accept (line 2330) | function click_accept(dataId,source,data){
function click_release (line 2348) | function click_release(dataId,source,data){
function click_cancel (line 2356) | function click_cancel(dataId,source,data){
function click_leave (line 2364) | function click_leave(dataId,source,data){
function click_join (line 2372) | function click_join(dataId,source,data){
function click_pri (line 2382) | function click_pri(dataId,source,points){
function click_retro (line 2390) | function click_retro(dataId,source,data){
function submit_comment_prompt (line 2400) | function submit_comment_prompt(dataId,data,action){
function cancel_comment_prompt (line 2414) | function cancel_comment_prompt(dataId,source,data,action){
function comment_prompt (line 2422) | function comment_prompt(dataId,source,data,action,required,message){
function filter_select (line 2461) | function filter_select(){
function show_added_by_me (line 2525) | function show_added_by_me(){
function show_hide_touched (line 2538) | function show_hide_touched(show){
function show_tag (line 2550) | function show_tag(tag){
function hide_inactive (line 2567) | function hide_inactive(days){
function show_unvoted (line 2581) | function show_unvoted(statuses,vote_type){
function show_voted (line 2596) | function show_voted(statuses,vote_type,vote_value){
function has_vote_type (line 2611) | function has_vote_type(item,vote_type,vote_value){
function is_item_touched_by_user (line 2626) | function is_item_touched_by_user(item){
function search_for (line 2642) | function search_for(text){
function search_for_old (line 2690) | function search_for_old(text){
function clear_filters (line 2719) | function clear_filters(){
function send_item_action (line 2734) | function send_item_action(dataId,action,extradata){
function show_comment (line 2770) | function show_comment(item){
function resize (line 2780) | function resize(){
function insert_panel (line 2789) | function insert_panel(position, name, title, visible){
function generate_and_append_panel (line 2804) | function generate_and_append_panel(position,name,title, visible){
function update_panel_counts (line 2829) | function update_panel_counts(){
function update_panel_count (line 2841) | function update_panel_count(name, skip_button){
function close_panel (line 2861) | function close_panel(name){
function show_panel (line 2872) | function show_panel(name){
function sort_panel (line 2880) | function sort_panel(name){
function recalculate_widths (line 2938) | function recalculate_widths(){
function expand_item (line 2945) | function expand_item(dataId){
function collapse_item (line 3004) | function collapse_item(dataId,check_for_save){
function save_new_item (line 3021) | function save_new_item(prioritize){
function save_edit_item (line 3070) | function save_edit_item(dataId){
function cancel_new_item (line 3111) | function cancel_new_item(dataId){
function item_added (line 3119) | function item_added(item){
function item_actioned (line 3132) | function item_actioned(item, dataId, action){
function item_prioritized (line 3199) | function item_prioritized(item, dataId,action){
function item_estimated (line 3211) | function item_estimated(item, dataId){
function item_updated (line 3222) | function item_updated(item, dataId){
function comment_added (line 3233) | function comment_added(item, dataId){
function todo_added (line 3241) | function todo_added(item, dataId){
function todo_updated (line 3246) | function todo_updated(item, dataId){
function ensure_numericality_of_num_hours (line 3251) | function ensure_numericality_of_num_hours(num_hours) {
function isNumeric (line 3264) | function isNumeric(form_value)
function sortoptions (line 3272) | function sortoptions(sort)
function generate_complexity_row (line 3282) | function generate_complexity_row(){
function generate_complexity_dropdown (line 3308) | function generate_complexity_dropdown() {
function new_item (line 3338) | function new_item(){
function is_item_editable (line 3532) | function is_item_editable(dataId) {
function is_item_todos_editable (line 3544) | function is_item_todos_editable(dataId) {
function is_item_joinable (line 3558) | function is_item_joinable(item) {
function is_item_estimatable (line 3562) | function is_item_estimatable(item) {
function is_tracker_editable (line 3568) | function is_tracker_editable(dataId) {
function generate_expense_amount_editor (line 3572) | function generate_expense_amount_editor(points,dataId){
function generate_item_edit (line 3583) | function generate_item_edit(dataId){
function generate_attachments_section (line 3736) | function generate_attachments_section(dataId){
function generate_todo_section (line 3769) | function generate_todo_section(dataId){
function generate_todo_section_lightbox (line 3801) | function generate_todo_section_lightbox(dataId){
function post_comment (line 3830) | function post_comment(dataId,from_prompt,action){
function post_todo (line 3900) | function post_todo(dataId){
function update_todo (line 3949) | function update_todo(todoId, dataId){
function delete_todo (line 3998) | function delete_todo(todoId, dataId){
function update_todo_count (line 4031) | function update_todo_count(dataId){
function full_screen (line 4041) | function full_screen(dataId,update){
function show_issue_full (line 4047) | function show_issue_full(itemId,update){
function show_retro_full (line 4066) | function show_retro_full(retroId){
function timer_beat (line 4073) | function timer_beat(timer){
function new_dash_data (line 4083) | function new_dash_data(){
function new_dash_data_response (line 4128) | function new_dash_data_response(data){
function is_user_logged_in (line 4193) | function is_user_logged_in(){
function ask_for_login (line 4203) | function ask_for_login(){
function handle_error (line 4208) | function handle_error (xhr, textStatus, errorThrown, dataId, action) {
FILE: public/javascripts/effects.js
function codeForEvent (line 231) | function codeForEvent(options,eventName){
function dispatch (line 248) | function dispatch(effect, eventName) {
function parseColor (line 952) | function parseColor(color){
FILE: public/javascripts/enterprise_map.js
function init (line 29) | function init() {
function refresh_data (line 188) | function refresh_data(){
FILE: public/javascripts/fancybox/jquery.fancybox-1.3.0.pack.js
function H (line 16) | function H(){v.hide();r.onerror=r.onload=null;F&&F.abort();l.empty()}
function Q (line 16) | function Q(){b.fancybox('<p id="fancybox_error">The requested content ca...
function B (line 16) | function B(){H();var a=q[s];e=b.extend({},b.fn.fancybox.defaults,typeof ...
function U (line 21) | function U(){h=true;e.width=r.width;e.height=r.height;b("<img />").attr(...
function G (line 21) | function G(){l.width(e.width);l.height(e.height);if(e.width=="auto")e.wi...
function J (line 21) | function J(){v.hide();if(g.is(":visible")&&b.isFunction(c.onCleanup))if(...
function M (line 24) | function M(a){var d=Math.round(k.width+(m.width-k.width)*a),
function L (line 25) | function L(){i.css("overflow",overflow=c.scrolling=="auto"?c.type=="imag...
function V (line 26) | function V(){var a=N(),d={},f=
function S (line 28) | function S(){var a=e.orig?b(e.orig):false,d={};if(a&&a.length){a=Z(a);d=...
function X (line 29) | function X(){b(document).unbind("keydown.fb").bind("keydown.fb",function...
function Y (line 30) | function Y(){if(j.length-1>n){var a=j[n+1].href;if(typeof a!=="undefined...
function $ (line 30) | function $(){if(v.is(":visible")){b("div",v).css("top",O*-40+"px");O=(O+...
function N (line 30) | function N(){return[b(window).width(),b(window).height(),b(document).scr...
function Z (line 30) | function Z(a){var d=a.offset();d.top+=parseFloat(a.css("paddingTop"))||
function W (line 31) | function W(){b("#fancybox-title").remove();x=0;if(c.titleShow!=false){va...
function aa (line 32) | function aa(a){if(a&&a.length)switch(c.titlePosition){case "inside":retu...
function ba (line 33) | function ba(){if(!b("#fancybox-wrap").length){b("body").append(l=b('<div...
function a (line 39) | function a(){y.fadeOut("fast");
FILE: public/javascripts/fancybox/jquery.mousewheel-3.0.2.pack.js
function d (line 12) | function d(a){var f=[].slice.call(arguments,1),e=0;a=b.event.fix(a||wind...
FILE: public/javascripts/fileuploader.js
function r (line 434) | function r(name, replacement){ message = message.replace(name, replaceme...
FILE: public/javascripts/jQuery.bubbletip-1.0.4.js
function _Calculate (line 244) | function _Calculate() {
FILE: public/javascripts/jScrollPane.js
function c (line 1) | function c(){var p=(F-u)/C.animateStep;if(p>1||p<-1){y(u+p)}else{y(F);n()}}
FILE: public/javascripts/jit-yc.js
function C (line 24) | function C(L,K,J){if(J<0){J+=1}if(J>1){J-=1}if(J<1/6){return L+(K-L)*6*J...
function D (line 24) | function D(G){var F={x:0,y:0};while(G&&!A(G)){F.x+=G.offsetLeft;F.y+=G.o...
function C (line 24) | function C(G){var F={x:0,y:0};while(G&&!A(G)){F.x+=G.scrollLeft;F.y+=G.s...
function A (line 24) | function A(F){return(/^(?:body|html)$/i).test(F.tagName)}
function A (line 24) | function A(C,D){var E=document.createElement(C);for(var F in D){if(typeo...
function D (line 24) | function D(V,U){var N=(V.x*U.y-V.y*U.x),J=N;var M=V.squaredNorm(),L=U.sq...
function A (line 24) | function A(J,K){return(J<K)?((J+Math.PI>K)?false:true):((K+Math.PI>J)?tr...
function G (line 24) | function G(S,N,K,Q,L){var P=N.Node;var M=N.multitree;if(P.overridable){v...
function J (line 24) | function J(L,O,N,K){var M=(K=="left"||K=="right")?"y":"x";L.getPos(O)[M]...
function E (line 24) | function E(L,M){var K=[];d.each(L,function(N){N=I.call(N);N[0]+=M;N[1]+=...
function H (line 24) | function H(N,K){if(N.length==0){return K}if(K.length==0){return N}var M=...
function C (line 24) | function C(K,L){L=L||[];if(K.length==0){return L}var M=K.pop();return C(...
function F (line 24) | function F(N,L,O,K,M){if(N.length<=M||L.length<=M){return 0}var Q=N[M][1...
function D (line 24) | function D(N,L,K){function M(Q,S,P){if(S.length<=P){return[]}var R=S[P],...
function A (line 24) | function A(O,N,M){function K(R,T,Q){if(T.length<=Q){return[]}var S=T[Q],...
function z (line 24) | function z(Q,O,L,R){var M=D(Q,O,L),P=A(Q,O,L);if(R=="left"){P=M}else{if(...
function B (line 24) | function B(K,U,L,ab,Z){var N=ab.multitree;var T=["x","y"],Q=["width","he...
function B (line 24) | function B(G){G=G||this.clickedNode;if(!this.config.constrained){return[...
function z (line 24) | function z(E){var D=[],C=this.config;E=E||this.clickedNode;this.clickedN...
function G (line 24) | function G(I){if(I==null||I.selected){return}I.selected=true;d.each(E.gr...
function F (line 24) | function F(){if(this.config.multitree&&D.data.$orn){var L=D.data.$orn;va...
FILE: public/javascripts/jit.js
function hue2rgb (line 375) | function hue2rgb(p, q, t) {
function getOffsets (line 511) | function getOffsets(elem) {
function getScrolls (line 524) | function getScrolls(elem) {
function isBody (line 537) | function isBody(element) {
function $E (line 2719) | function $E(tag, props) {
function computeArcThroughTwoPoints (line 6333) | function computeArcThroughTwoPoints(p1, p2){
function sense (line 6379) | function sense(angleBegin, angleEnd){
function getBoundaries (line 7829) | function getBoundaries(graph, config, level, orn, prop) {
function movetree (line 7853) | function movetree(node, prop, val, orn) {
function moveextent (line 7859) | function moveextent(extent, val) {
function merge (line 7871) | function merge(ps, qs) {
function mergelist (line 7881) | function mergelist(ls, def) {
function fit (line 7890) | function fit(ext1, ext2, subtreeOffset, siblingOffset, i) {
function fitlistl (line 7900) | function fitlistl(es, subtreeOffset, siblingOffset) {
function fitlistr (line 7912) | function fitlistr(es, subtreeOffset, siblingOffset) {
function fitlist (line 7926) | function fitlist(es, subtreeOffset, siblingOffset, align) {
function design (line 7942) | function design(graph, node, prop, config, orn) {
function getNodesToHide (line 8118) | function getNodesToHide(node) {
function getNodesToShow (line 8150) | function getNodesToShow(node) {
function path (line 8402) | function path(node) {
function $setRoot (line 8445) | function $setRoot() {
FILE: public/javascripts/jquery-ui.js
function k (line 10) | function k(a){return!c(a).parents().andSelf().filter(function(){return c...
function d (line 13) | function d(f,g,l,m){c.each(e,function(){g-=parseFloat(c.curCSS(f,"paddin...
function a (line 384) | function a(f){return{position:f.position,offset:f.offset}}
function b (line 385) | function b(f){return{originalPosition:f.originalPosition,originalSize:f....
function u (line 443) | function u(){return++v}
function w (line 443) | function w(){return++x}
function e (line 445) | function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0]....
function K (line 477) | function K(){this.debug=false;this._curInst=null;this._keyEvent=false;th...
function E (line 480) | function E(a,b){d.extend(a,b);for(var c in b)if(b[c]==
function n (line 571) | function n(c){var a;if(c&&c.constructor==Array&&c.length==3)return c;if(...
function s (line 572) | function s(c,a){var b;do{b=f.curCSS(c,a);if(b!=""&&b!="transparent"||f.n...
function p (line 572) | function p(){var c=document.defaultView?document.defaultView.getComputed...
function q (line 573) | function q(c){var a,b;for(a in c){b=c[a];if(b==null||f.isFunction(b)||a ...
function u (line 573) | function u(c,a){var b={_:0},d;for(d in a)if(c[d]!=a[d])b[d]=a[d];return b}
function k (line 573) | function k(c,a,b,d){if(typeof c=="object"){d=
function m (line 574) | function m(c){if(!c||typeof c==="number"||f.fx.speeds[c])return true;if(...
FILE: public/javascripts/jquery.autocomplete.js
function findValueCallback (line 173) | function findValueCallback(q, data) {
function selectCurrent (line 203) | function selectCurrent() {
function onChange (line 239) | function onChange(crap, skipPrevCheck) {
function trimWords (line 264) | function trimWords(value) {
function lastWord (line 274) | function lastWord(value) {
function autoFill (line 292) | function autoFill(q, sValue){
function hideResults (line 303) | function hideResults() {
function hideResultsNow (line 308) | function hideResultsNow() {
function receiveData (line 333) | function receiveData(q, data) {
function request (line 344) | function request(term, success, failure) {
function parse (line 385) | function parse(data) {
function stopLoading (line 402) | function stopLoading() {
function matchSubset (line 440) | function matchSubset(s, sub) {
function add (line 451) | function add(q, value) {
function populate (line 461) | function populate(){
function flush (line 516) | function flush(){
function init (line 588) | function init() {
function target (line 620) | function target(event) {
function moveSelect (line 630) | function moveSelect(step) {
function movePosition (line 647) | function movePosition(step) {
function limitNumberOfItems (line 656) | function limitNumberOfItems(available) {
function fillList (line 662) | function fillList() {
FILE: public/javascripts/jquery.fancybox-1.3.0.js
function _cleanup (line 199) | function _cleanup() {
function fancybox_abort (line 291) | function fancybox_abort() {
function fancybox_error (line 301) | function fancybox_error() {
function fancybox_start (line 310) | function fancybox_start() {
function fancybox_process_image (line 483) | function fancybox_process_image() {
function fancybox_process_inline (line 498) | function fancybox_process_inline() {
function fancybox_show (line 508) | function fancybox_show() {
function fancybox_draw (line 628) | function fancybox_draw(pos) {
function _finish (line 653) | function _finish() {
function fancybox_get_zoom_to (line 681) | function fancybox_get_zoom_to() {
function fancybox_get_zoom_from (line 735) | function fancybox_get_zoom_from() {
function fancybox_set_navigation (line 763) | function fancybox_set_navigation() {
function fancybox_preload_images (line 804) | function fancybox_preload_images() {
function fancybox_animate_loading (line 824) | function fancybox_animate_loading() {
function fancybox_get_viewport (line 835) | function fancybox_get_viewport() {
function fancybox_get_obj_pos (line 839) | function fancybox_get_obj_pos(obj) {
function fancybox_process_title (line 854) | function fancybox_process_title() {
function fancybox_format_title (line 899) | function fancybox_format_title(title) {
function fancybox_init (line 919) | function fancybox_init() {
FILE: public/javascripts/jquery.fancybox-1.3.0.pack.js
function H (line 16) | function H(){v.hide();r.onerror=r.onload=null;F&&F.abort();l.empty()}
function Q (line 16) | function Q(){b.fancybox('<p id="fancybox_error">The requested content ca...
function B (line 16) | function B(){H();var a=q[s];e=b.extend({},b.fn.fancybox.defaults,typeof ...
function U (line 21) | function U(){h=true;e.width=r.width;e.height=r.height;b("<img />").attr(...
function G (line 21) | function G(){l.width(e.width);l.height(e.height);if(e.width=="auto")e.wi...
function J (line 21) | function J(){v.hide();if(g.is(":visible")&&b.isFunction(c.onCleanup))if(...
function M (line 24) | function M(a){var d=Math.round(k.width+(m.width-k.width)*a),
function L (line 25) | function L(){i.css("overflow",overflow=c.scrolling=="auto"?c.type=="imag...
function V (line 26) | function V(){var a=N(),d={},f=
function S (line 28) | function S(){var a=e.orig?b(e.orig):false,d={};if(a&&a.length){a=Z(a);d=...
function X (line 29) | function X(){b(document).unbind("keydown.fb").bind("keydown.fb",function...
function Y (line 30) | function Y(){if(j.length-1>n){var a=j[n+1].href;if(typeof a!=="undefined...
function $ (line 30) | function $(){if(v.is(":visible")){b("div",v).css("top",O*-40+"px");O=(O+...
function N (line 30) | function N(){return[b(window).width(),b(window).height(),b(document).scr...
function Z (line 30) | function Z(a){var d=a.offset();d.top+=parseFloat(a.css("paddingTop"))||
function W (line 31) | function W(){b("#fancybox-title").remove();x=0;if(c.titleShow!=false){va...
function aa (line 32) | function aa(a){if(a&&a.length)switch(c.titlePosition){case "inside":retu...
function ba (line 33) | function ba(){if(!b("#fancybox-wrap").length){b("body").append(l=b('<div...
function a (line 39) | function a(){y.fadeOut("fast");
FILE: public/javascripts/jquery.fancybox-1.3.4.js
function _cleanup (line 954) | function _cleanup() {
FILE: public/javascripts/jquery.fancybox-1.3.4.pack.js
function a (line 39) | function a(){u.fadeOut("fast");n.empty().hide();f.hide();b.event.trigger...
FILE: public/javascripts/jquery.js
function ka (line 16) | function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b)...
function U (line 16) | function U(){return false}
function ca (line 16) | function ca(){return true}
function la (line 16) | function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}
function Ka (line 16) | function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.no...
function Y (line 18) | function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La,
function ma (line 19) | function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){retu...
function na (line 19) | function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d...
function Oa (line 20) | function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"})...
function oa (line 20) | function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==...
function da (line 21) | function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d|...
function S (line 21) | function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),functi...
function qa (line 21) | function qa(a){if(!ea[a]){var b=c("<"+
function fa (line 22) | function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.pa...
function a (line 22) | function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch...
function d (line 72) | function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e....
function a (line 78) | function a(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y)...
function b (line 78) | function b(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y)...
function e (line 152) | function e(l){return f.step(l)}
FILE: public/javascripts/jquery.mousewheel-3.0.2.pack.js
function d (line 12) | function d(a){var f=[].slice.call(arguments,1),e=0;a=b.event.fix(a||wind...
FILE: public/javascripts/jquery.mousewheel-3.0.4.pack.js
function g (line 13) | function g(a){var b=a||window.event,i=[].slice.call(arguments,1),c=0,h=0...
FILE: public/javascripts/jquery.scrollTo-min.js
function t (line 1) | function t(a){r.animate(g,j,b.easing,a&&function(){a.call(this,n,b)})}
function p (line 1) | function p(a){return typeof a=='object'?a:{top:a,left:a}}
FILE: public/javascripts/jquery.tagsinput.js
function update_issue_tags (line 83) | function update_issue_tags(tags){
FILE: public/javascripts/json2.js
function f (line 168) | function f(n) {
function quote (line 209) | function quote(string) {
function str (line 227) | function str(key, holder) {
function walk (line 410) | function walk(holder, key) {
FILE: public/javascripts/jstoolbar/jstoolbar.js
function jsToolBar (line 25) | function jsToolBar(textarea) {
function jsButton (line 69) | function jsButton(title, fn, scope, className) {
function jsSpace (line 101) | function jsSpace(id) {
function jsCombo (line 115) | function jsCombo(title, options, scope, fn, className) {
FILE: public/javascripts/lightbox.js
function getBrowserInfo (line 18) | function getBrowserInfo() {
function checkIt (line 46) | function checkIt(string) {
function initialize (line 179) | function initialize(){
function addLightboxMarkup (line 190) | function addLightboxMarkup() {
function add_lightbox (line 206) | function add_lightbox(id) {
function dismiss (line 214) | function dismiss() {
FILE: public/javascripts/prototype.js
function klass (line 50) | function klass() {
function $A (line 812) | function $A(iterable) {
function $w (line 945) | function $w(string) {
function $H (line 993) | function $H(object) {
function toQueryPair (line 999) | function toQueryPair(key, value) {
function $ (line 1513) | function $(element) {
function stripAlpha (line 2289) | function stripAlpha(filter){
function extend (line 2627) | function extend(tagName) {
function copy (line 2634) | function copy(methods, destination, onlyIfAbsent) {
function findDOMClass (line 2644) | function findDOMClass(tagName) {
function $$ (line 3443) | function $$() {
function getEventID (line 3935) | function getEventID(element) {
function getDOMEventName (line 3941) | function getDOMEventName(eventName) {
function getCacheForID (line 3946) | function getCacheForID(id) {
function getWrappersForEventName (line 3950) | function getWrappersForEventName(id, eventName) {
function createWrapper (line 3955) | function createWrapper(element, eventName, handler) {
function findWrapper (line 3974) | function findWrapper(id, eventName, handler) {
function destroyWrapper (line 3979) | function destroyWrapper(id, eventName, handler) {
function destroyCache (line 3985) | function destroyCache() {
function fireContentLoadedEvent (line 4102) | function fireContentLoadedEvent() {
function iter (line 4251) | function iter(name) {
FILE: public/javascripts/retro.js
function calculate_sum (line 63) | function calculate_sum(){
function save_retro (line 82) | function save_retro(retroId){
function saved (line 127) | function saved(){
FILE: public/javascripts/select_list_move.js
function addOption (line 3) | function addOption(theSel, theText, theValue)
function swapOptions (line 10) | function swapOptions(theSel, index1, index2)
function deleteOption (line 21) | function deleteOption(theSel, theIndex)
function moveOptions (line 30) | function moveOptions(theSelFrom, theSelTo)
function moveOptionUp (line 59) | function moveOptionUp(theSel) {
function moveOptionDown (line 67) | function moveOptionDown(theSel) {
function selectAllOptions (line 75) | function selectAllOptions(id)
FILE: public/javascripts/static/css_browser_selector.js
function css_browser_selector (line 8) | function css_browser_selector(u){var ua = u.toLowerCase(),is=function(t)...
FILE: public/javascripts/static/cufon-yui.js
function C (line 7) | function C(K){return K.disabled||G(K.sheet,K.media||"screen")}
function G (line 7) | function G(M,P){if(!n.recognizesMedia(P||"all")){return true}if(!M||M.di...
function F (line 7) | function F(){if(document.createStyleSheet){return true}var L,K;for(K=0;L...
function s (line 7) | function s(D){var C=this.face=D.face,B={"\u0020":1,"\u00a0":1,"\u3000":1...
function f (line 7) | function f(){var C={},B={oblique:"italic",italic:"oblique"};this.add=fun...
function r (line 7) | function r(){function D(F,G){if(F.contains){return F.contains(G)}return ...
function u (line 7) | function u(){var C=[],D={};function B(H){var E=[],G;for(var F=0;G=H[F];+...
function A (line 7) | function A(){var D={},B=0;function C(E){return E.cufid||(E.cufid=++B)}th...
function a (line 7) | function a(B){var D={},C={};this.extend=function(E){for(var F in E){if(k...
function q (line 7) | function q(C,B,D){if(C.addEventListener){C.addEventListener(B,D,false)}e...
function v (line 7) | function v(C,B){var D=d.get(C);if(D.options){return C}if(B.hover&&B.hove...
function j (line 7) | function j(B){var C={};return function(D){if(!k(C,D)){C[D]=B.apply(null,...
function c (line 7) | function c(F,E){var B=n.quotedList(E.get("fontFamily").toLowerCase()),D;...
function g (line 7) | function g(B){return document.getElementsByTagName(B)}
function k (line 7) | function k(C,B){return C.hasOwnProperty(B)}
function h (line 7) | function h(){var C={},B,F;for(var E=0,D=arguments.length;B=arguments[E],...
function o (line 7) | function o(E,M,C,N,F,D){var K=document.createDocumentFragment(),H;if(M==...
function l (line 7) | function l(D,M){var C=D.nodeName.toLowerCase();if(M.ignore[C]){return}va...
function d (line 7) | function d(p,h){var n=0,m=0;var g=[],o=/([mrvxe])([^a-z]*)/g,k;generate:...
function c (line 7) | function c(m,k){for(var j=0,h=m.length;j<h;++j){var g=m[j];k[g.m].apply(...
function T (line 7) | function T(){var x=V.glyphs,ab,l=-1,g=-1,y;X.scale(G,1);while(y=Z[++l]){...
function c (line 7) | function c(i,j){return a(i,/(?:em|ex|%)$|^[a-z-]+$/i.test(j)?"1em":j)}
function a (line 7) | function a(l,m){if(m==="0"){return 0}if(/px$/i.test(m)){return parseFloa...
function f (line 7) | function f(l,k,j,n){var i="computed"+n,m=k[i];if(isNaN(m)){m=k.get(n);k[...
function d (line 7) | function d(p){var q=p.id;if(!g[q]){var n=p.stops,o=document.createElemen...
FILE: public/javascripts/static/jquery-galleryview-1.1/jquery.galleryview-1.1.js
function showItem (line 41) | function showItem(i) {
function showNextItem (line 119) | function showNextItem() {
function showPrevItem (line 127) | function showPrevItem() {
function getPos (line 136) | function getPos(el) {
function enableFrameClicking (line 156) | function enableFrameClicking() {
function buildPanels (line 173) | function buildPanels() {
function buildFilmstrip (line 255) | function buildFilmstrip() {
function mouseIsOverPanels (line 371) | function mouseIsOverPanels(x,y) {
FILE: public/javascripts/store.js
function createStorage (line 27) | function createStorage() {
FILE: public/javascripts/textile-editor.js
function TextileEditorButton (line 38) | function TextileEditorButton(id, display, tagStart, tagEnd, access, titl...
function TextileEditorButtonSeparator (line 51) | function TextileEditorButtonSeparator(sve) {
FILE: spec/acceptance/support/helpers.rb
type HelperMethods (line 1) | module HelperMethods
FILE: spec/acceptance/support/paths.rb
type NavigationHelpers (line 1) | module NavigationHelpers
function homepage (line 4) | def homepage
FILE: spec/controllers/projects/new_dash_data_spec.rb
function given_the_project_last_had_an_item_updated_at (line 88) | def given_the_project_last_had_an_item_updated_at(_when)
function given_the_time_now_is (line 92) | def given_the_time_now_is(what); DateTime.stub(:now).and_return what; end
function given_project_has_issue_count (line 93) | def given_project_has_issue_count(how_many)
FILE: spec/models/project_spec.rb
function initialize (line 5) | def initialize(admin = false, memberships = [])
function admin? (line 9) | def admin?; @admin; end
function memberships (line 10) | def memberships; @memberships end
function fake_admin (line 64) | def fake_admin
function fake_admin (line 82) | def fake_admin
FILE: spec/spec_helper.rb
function login (line 33) | def login
FILE: vendor/plugins/acts-as-taggable-on/generators/acts_as_taggable_on_migration/acts_as_taggable_on_migration_generator.rb
class ActsAsTaggableOnMigrationGenerator (line 1) | class ActsAsTaggableOnMigrationGenerator < Rails::Generator::Base
method manifest (line 2) | def manifest
FILE: vendor/plugins/acts-as-taggable-on/generators/acts_as_taggable_on_migration/templates/migration.rb
class ActsAsTaggableOnMigration (line 1) | class ActsAsTaggableOnMigration < ActiveRecord::Migration
method up (line 2) | def self.up
method down (line 25) | def self.down
FILE: vendor/plugins/acts-as-taggable-on/lib/acts_as_taggable_on/acts_as_tagger.rb
type ActsAsTaggableOn (line 1) | module ActsAsTaggableOn
type Tagger (line 2) | module Tagger
function included (line 3) | def self.included(base)
type ClassMethods (line 7) | module ClassMethods
function acts_as_tagger (line 16) | def acts_as_tagger(opts={})
function is_tagger? (line 27) | def is_tagger?
type InstanceMethods (line 32) | module InstanceMethods
function tag (line 43) | def tag(taggable, opts={})
function is_tagger? (line 56) | def is_tagger?
type SingletonMethods (line 61) | module SingletonMethods
function is_tagger? (line 62) | def is_tagger?
FILE: vendor/plugins/acts-as-taggable-on/lib/acts_as_taggable_on/compatibility/active_record_backports.rb
type ActsAsTaggableOn (line 1) | module ActsAsTaggableOn
type ActiveRecord (line 2) | module ActiveRecord
type Backports (line 3) | module Backports
function included (line 4) | def self.included(base)
FILE: vendor/plugins/acts-as-taggable-on/lib/acts_as_taggable_on/tag.rb
type ActsAsTaggableOn (line 1) | module ActsAsTaggableOn
class Tag (line 2) | class Tag < ::ActiveRecord::Base
method using_postgresql? (line 18) | def self.using_postgresql?
method named (line 22) | def self.named(name)
method named_any (line 26) | def self.named_any(list)
method named_like (line 30) | def self.named_like(name)
method named_like_any (line 34) | def self.named_like_any(list)
method find_or_create_with_like_by_name (line 40) | def self.find_or_create_with_like_by_name(name)
method find_or_create_all_with_like_by_name (line 44) | def self.find_or_create_all_with_like_by_name(*list)
method == (line 61) | def ==(object)
method to_s (line 65) | def to_s
method count (line 69) | def count
method like_operator (line 75) | def like_operator
method comparable_name (line 79) | def comparable_name(str)
FILE: vendor/plugins/acts-as-taggable-on/lib/acts_as_taggable_on/tag_list.rb
type ActsAsTaggableOn (line 1) | module ActsAsTaggableOn
class TagList (line 2) | class TagList < Array
method initialize (line 8) | def initialize(*args)
method from (line 18) | def self.from(string)
method add (line 40) | def add(*names)
method remove (line 54) | def remove(*names)
method to_s (line 67) | def to_s
method clean! (line 79) | def clean!
method extract_and_apply_options! (line 85) | def extract_and_apply_options!(args)
FILE: vendor/plugins/acts-as-taggable-on/lib/acts_as_taggable_on/taggable.rb
type ActsAsTaggableOn (line 1) | module ActsAsTaggableOn
type Taggable (line 2) | module Taggable
function taggable? (line 3) | def taggable?
function acts_as_taggable (line 14) | def acts_as_taggable
function acts_as_taggable_on (line 27) | def acts_as_taggable_on(*tag_types)
FILE: vendor/plugins/acts-as-taggable-on/lib/acts_as_taggable_on/taggable/cache.rb
type ActsAsTaggableOn::Taggable (line 1) | module ActsAsTaggableOn::Taggable
type Cache (line 2) | module Cache
function included (line 3) | def self.included(base)
type ClassMethods (line 17) | module ClassMethods
function initialize_acts_as_taggable_on_cache (line 18) | def initialize_acts_as_taggable_on_cache
function acts_as_taggable_on (line 28) | def acts_as_taggable_on(*args)
function caching_tag_list_on? (line 33) | def caching_tag_list_on?(context)
type InstanceMethods (line 38) | module InstanceMethods
function save_cached_tag_list (line 39) | def save_cached_tag_list
FILE: vendor/plugins/acts-as-taggable-on/lib/acts_as_taggable_on/taggable/collection.rb
type ActsAsTaggableOn::Taggable (line 1) | module ActsAsTaggableOn::Taggable
type Collection (line 2) | module Collection
function included (line 3) | def self.included(base)
type ClassMethods (line 9) | module ClassMethods
function initialize_acts_as_taggable_on_collection (line 10) | def initialize_acts_as_taggable_on_collection
function acts_as_taggable_on (line 32) | def acts_as_taggable_on(*args)
function tag_counts_on (line 37) | def tag_counts_on(context, options = {})
function all_tag_counts (line 53) | def all_tag_counts(options = {})
type InstanceMethods (line 133) | module InstanceMethods
function tag_counts_on (line 134) | def tag_counts_on(context, options={})
FILE: vendor/plugins/acts-as-taggable-on/lib/acts_as_taggable_on/taggable/core.rb
type ActsAsTaggableOn::Taggable (line 1) | module ActsAsTaggableOn::Taggable
type Core (line 2) | module Core
function included (line 3) | def self.included(base)
type ClassMethods (line 15) | module ClassMethods
function initialize_acts_as_taggable_on_core (line 16) | def initialize_acts_as_taggable_on_core
function acts_as_taggable_on (line 44) | def acts_as_taggable_on(*args)
function grouped_column_names_for (line 50) | def grouped_column_names_for(object)
function tagged_with (line 68) | def tagged_with(tags, options = {})
function is_taggable? (line 126) | def is_taggable?
type InstanceMethods (line 131) | module InstanceMethods
function grouped_column_names_for (line 133) | def grouped_column_names_for(object)
function custom_contexts (line 137) | def custom_contexts
function is_taggable? (line 141) | def is_taggable?
function add_custom_context (line 145) | def add_custom_context(value)
function cached_tag_list_on (line 149) | def cached_tag_list_on(context)
function tag_list_cache_set_on (line 153) | def tag_list_cache_set_on(context)
function tag_list_cache_on (line 158) | def tag_list_cache_on(context)
function tag_list_on (line 163) | def tag_list_on(context)
function all_tags_list_on (line 168) | def all_tags_list_on(context)
function all_tags_on (line 177) | def all_tags_on(context)
function tags_on (line 196) | def tags_on(context)
function set_tag_list_on (line 200) | def set_tag_list_on(context, new_list)
function tagging_contexts (line 207) | def tagging_contexts
function reload (line 211) | def reload(*args)
function save_tags (line 220) | def save_tags
FILE: vendor/plugins/acts-as-taggable-on/lib/acts_as_taggable_on/taggable/ownership.rb
type ActsAsTaggableOn::Taggable (line 1) | module ActsAsTaggableOn::Taggable
type Ownership (line 2) | module Ownership
function included (line 3) | def self.included(base)
type ClassMethods (line 14) | module ClassMethods
function acts_as_taggable_on (line 15) | def acts_as_taggable_on(*args)
function initialize_acts_as_taggable_on_ownership (line 20) | def initialize_acts_as_taggable_on_ownership
type InstanceMethods (line 31) | module InstanceMethods
function owner_tags_on (line 32) | def owner_tags_on(owner, context)
function cached_owned_tag_list_on (line 42) | def cached_owned_tag_list_on(context)
function owner_tag_list_on (line 47) | def owner_tag_list_on(owner, context)
function set_owner_tag_list_on (line 56) | def set_owner_tag_list_on(owner, context, new_list)
function reload (line 65) | def reload(*args)
function save_owned_tags (line 73) | def save_owned_tags
FILE: vendor/plugins/acts-as-taggable-on/lib/acts_as_taggable_on/taggable/related.rb
type ActsAsTaggableOn::Taggable (line 1) | module ActsAsTaggableOn::Taggable
type Related (line 2) | module Related
function included (line 3) | def self.included(base)
type ClassMethods (line 9) | module ClassMethods
function initialize_acts_as_taggable_on_related (line 10) | def initialize_acts_as_taggable_on_related
function acts_as_taggable_on (line 33) | def acts_as_taggable_on(*args)
type InstanceMethods (line 39) | module InstanceMethods
function matching_contexts_for (line 40) | def matching_contexts_for(search_context, result_context, klass, o...
function related_tags_for (line 54) | def related_tags_for(context, klass, options = {})
FILE: vendor/plugins/acts-as-taggable-on/lib/acts_as_taggable_on/tagging.rb
type ActsAsTaggableOn (line 1) | module ActsAsTaggableOn
class Tagging (line 2) | class Tagging < ::ActiveRecord::Base #:nodoc:
method before_save (line 25) | def before_save
FILE: vendor/plugins/acts-as-taggable-on/lib/acts_as_taggable_on/tags_helper.rb
type ActsAsTaggableOn (line 1) | module ActsAsTaggableOn
type TagsHelper (line 2) | module TagsHelper
function tag_cloud (line 4) | def tag_cloud(tags, classes)
FILE: vendor/plugins/acts-as-taggable-on/lib/generators/acts_as_taggable_on/migration/migration_generator.rb
type ActsAsTaggableOn (line 3) | module ActsAsTaggableOn
class MigrationGenerator (line 4) | class MigrationGenerator < Rails::Generators::Base
method orm (line 9) | def self.orm
method source_root (line 13) | def self.source_root
method orm_has_migration? (line 17) | def self.orm_has_migration?
method next_migration_number (line 21) | def self.next_migration_number(path)
method create_migration_file (line 25) | def create_migration_file
FILE: vendor/plugins/acts-as-taggable-on/lib/generators/acts_as_taggable_on/migration/templates/active_record/migration.rb
class ActsAsTaggableOnMigration (line 1) | class ActsAsTaggableOnMigration < ActiveRecord::Migration
method up (line 2) | def self.up
method down (line 24) | def self.down
FILE: vendor/plugins/acts-as-taggable-on/spec/acts_as_taggable_on/tags_helper_spec.rb
class Helper (line 11) | class Helper
FILE: vendor/plugins/acts-as-taggable-on/spec/bm.rb
class TaggableModel (line 42) | class TaggableModel < ActiveRecord::Base
FILE: vendor/plugins/acts-as-taggable-on/spec/models.rb
class TaggableModel (line 1) | class TaggableModel < ActiveRecord::Base
class CachedModel (line 9) | class CachedModel < ActiveRecord::Base
class OtherTaggableModel (line 13) | class OtherTaggableModel < ActiveRecord::Base
class InheritingTaggableModel (line 18) | class InheritingTaggableModel < TaggableModel
class AlteredInheritingTaggableModel (line 21) | class AlteredInheritingTaggableModel < TaggableModel
class TaggableUser (line 25) | class TaggableUser < ActiveRecord::Base
class UntaggableModel (line 29) | class UntaggableModel < ActiveRecord::Base
FILE: vendor/plugins/acts-as-taggable-on/spec/spec_helper.rb
class Array (line 23) | class Array
method freq (line 24) | def freq
function clean_database! (line 52) | def clean_database!
FILE: vendor/plugins/acts_as_attachable/lib/acts_as_attachable.rb
type Redmine (line 5) | module Redmine
type Acts (line 6) | module Acts
type Attachable (line 7) | module Attachable
function included (line 8) | def self.included(base)
type ClassMethods (line 12) | module ClassMethods
function acts_as_attachable (line 13) | def acts_as_attachable(options = {})
type InstanceMethods (line 26) | module InstanceMethods
function included (line 27) | def self.included(base)
function attachments_visible? (line 31) | def attachments_visible?(user=User.current)
function attachments_deletable? (line 35) | def attachments_deletable?(user=User.current)
type ClassMethods (line 39) | module ClassMethods
FILE: vendor/plugins/acts_as_event/lib/acts_as_event.rb
type Redmine (line 4) | module Redmine
type Acts (line 5) | module Acts
type Event (line 6) | module Event
function included (line 7) | def self.included(base)
type ClassMethods (line 11) | module ClassMethods
function acts_as_event (line 12) | def acts_as_event(options = {})
type InstanceMethods (line 27) | module InstanceMethods
function included (line 28) | def self.included(base)
function event_date (line 48) | def event_date
function event_url (line 52) | def event_url(options = {})
type ClassMethods (line 57) | module ClassMethods
FILE: vendor/plugins/acts_as_list/lib/active_record/acts/list.rb
type ActiveRecord (line 1) | module ActiveRecord
type Acts (line 2) | module Acts #:nodoc:
type List (line 3) | module List #:nodoc:
function included (line 4) | def self.included(base)
type ClassMethods (line 25) | module ClassMethods
function acts_as_list (line 33) | def acts_as_list(options = {})
type InstanceMethods (line 76) | module InstanceMethods
function insert_at (line 78) | def insert_at(position = 1)
function move_lower (line 83) | def move_lower
function move_higher (line 93) | def move_higher
function move_to_bottom (line 104) | def move_to_bottom
function move_to_top (line 114) | def move_to_top
function move_to= (line 123) | def move_to=(pos)
function remove_from_list (line 137) | def remove_from_list
function increment_position (line 145) | def increment_position
function decrement_position (line 151) | def decrement_position
function first? (line 157) | def first?
function last? (line 163) | def last?
function higher_item (line 169) | def higher_item
function lower_item (line 177) | def lower_item
function in_list? (line 185) | def in_list?
function add_to_list_top (line 190) | def add_to_list_top
function add_to_list_bottom (line 194) | def add_to_list_bottom
function scope_condition (line 199) | def scope_condition() "1" end
function bottom_position_in_list (line 203) | def bottom_position_in_list(except = nil)
function bottom_item (line 209) | def bottom_item(except = nil)
function assume_bottom_position (line 216) | def assume_bottom_position
function assume_top_position (line 221) | def assume_top_position
function decrement_positions_on_higher_items (line 226) | def decrement_positions_on_higher_items(position)
function decrement_positions_on_lower_items (line 233) | def decrement_positions_on_lower_items
function increment_positions_on_higher_items (line 241) | def increment_positions_on_higher_items
function increment_positions_on_lower_items (line 249) | def increment_positions_on_lower_items(position)
function increment_positions_on_all_items (line 256) | def increment_positions_on_all_items
function insert_at_position (line 262) | def insert_at_position(position)
FILE: vendor/plugins/acts_as_list/test/list_test.rb
function setup_db (line 11) | def setup_db
function teardown_db (line 22) | def teardown_db
class Mixin (line 28) | class Mixin < ActiveRecord::Base
class ListMixin (line 31) | class ListMixin < Mixin
method table_name (line 34) | def self.table_name() "mixins" end
class ListMixinSub1 (line 37) | class ListMixinSub1 < ListMixin
class ListMixinSub2 (line 40) | class ListMixinSub2 < ListMixin
class ListWithStringScopeMixin (line 43) | class ListWithStringScopeMixin < ActiveRecord::Base
method table_name (line 46) | def self.table_name() "mixins" end
class ListTest (line 50) | class ListTest < Test::Unit::TestCase
method setup (line 52) | def setup
method teardown (line 57) | def teardown
method test_reordering (line 61) | def test_reordering
method test_move_to_bottom_with_next_to_last_item (line 83) | def test_move_to_bottom_with_next_to_last_item
method test_next_prev (line 89) | def test_next_prev
method test_injection (line 96) | def test_injection
method test_insert (line 102) | def test_insert
method test_insert_at (line 124) | def test_insert_at
method test_delete_middle (line 159) | def test_delete_middle
method test_with_string_based_scope (line 178) | def test_with_string_based_scope
method test_nil_scope (line 185) | def test_nil_scope
method test_remove_from_list_should_then_fail_in_list? (line 192) | def test_remove_from_list_should_then_fail_in_list?
method test_remove_from_list_should_set_position_to_nil (line 198) | def test_remove_from_list_should_set_position_to_nil
method test_remove_before_destroy_does_not_shift_lower_items_twice (line 211) | def test_remove_before_destroy_does_not_shift_lower_items_twice
class ListSubTest (line 226) | class ListSubTest < Test::Unit::TestCase
method setup (line 228) | def setup
method teardown (line 233) | def teardown
method test_reordering (line 237) | def test_reordering
method test_move_to_bottom_with_next_to_last_item (line 259) | def test_move_to_bottom_with_next_to_last_item
method test_next_prev (line 265) | def test_next_prev
method test_injection (line 272) | def test_injection
method test_insert_at (line 278) | def test_insert_at
method test_delete_middle (line 313) | def test_delete_middle
FILE: vendor/plugins/acts_as_searchable/lib/acts_as_searchable.rb
type Redmine (line 4) | module Redmine
type Acts (line 5) | module Acts
type Searchable (line 6) | module Searchable
function included (line 7) | def self.included(base)
type ClassMethods (line 11) | module ClassMethods
function acts_as_searchable (line 18) | def acts_as_searchable(options = {})
Condensed preview — 1916 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (8,815K chars).
[
{
"path": ".gitignore",
"chars": 473,
"preview": "/db/*.sqlite3\n/db/pgdump_full.sql\n/log/*.log\n/tmp/**/*\n/config/additional_environment.rb\n/config/database.yml\n/config/em"
},
{
"path": ".gitmodules",
"chars": 0,
"preview": ""
},
{
"path": ".rspec",
"chars": 51,
"preview": "--colour\n--format profile\n--loadby mtime\n--reverse\n"
},
{
"path": ".rvmrc",
"chars": 2308,
"preview": "#!/usr/bin/env bash\n\n# This is an RVM Project .rvmrc file, used to automatically load the ruby\n# development environment"
},
{
"path": "Gemfile",
"chars": 1040,
"preview": "source :rubygems\n\ngem 'rake', '0.8.7'\n\ngem 'rails', '2.3.14'\n\ngem 'ruby-debug', '0.10.4'\ngem 'rubytree', '0.7.0'\ngem 'rp"
},
{
"path": "Guardfile",
"chars": 1655,
"preview": "# A sample Guardfile\n# More info at https://github.com/guard/guard#readme\nguard 'spork', :rspec_env => { 'RAILS_ENV' => "
},
{
"path": "README.md",
"chars": 1783,
"preview": "BetterMeans\n-----------\n\nBetterMeans is giving birth to a new kind of company. An Open Enterprise.\n\nMore details can be "
},
{
"path": "Rakefile",
"chars": 307,
"preview": "# Add your own tasks in files placed in lib/tasks ending in .rake,\n# for example lib/tasks/switchtower.rake, and they wi"
},
{
"path": "app/controllers/account_controller.rb",
"chars": 14056,
"preview": "# TODO: rename this to something like SessionsController after integration specs are done\nclass AccountController < Appl"
},
{
"path": "app/controllers/activity_stream_preferences_controller.rb",
"chars": 355,
"preview": "#--\n# Copyright (c) 2008 Matson Systems, Inc.\n# Released under the BSD license found in the file\n# LICENSE included with"
},
{
"path": "app/controllers/activity_stream_preferences_module.rb",
"chars": 3022,
"preview": "#--\n# Copyright (c) 2008 Matson Systems, Inc.\n# Released under the BSD license found in the file\n# LICENSE included with"
},
{
"path": "app/controllers/activity_streams_controller.rb",
"chars": 1993,
"preview": "#--\n# Copyright (c) 2008 Matson Systems, Inc.\n# Released under the BSD license found in the file\n# LICENSE included with"
},
{
"path": "app/controllers/activity_streams_module.rb",
"chars": 2801,
"preview": "#--\n# Copyright (c) 2008 Matson Systems, Inc.\n# Released under the BSD license found in the file\n# LICENSE included with"
},
{
"path": "app/controllers/admin_controller.rb",
"chars": 2555,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass AdminController < Applica"
},
{
"path": "app/controllers/application_controller.rb",
"chars": 10753,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nrequire 'uri'\nrequire 'cgi'\nreq"
},
{
"path": "app/controllers/attachments_controller.rb",
"chars": 2909,
"preview": "# Redmine - project management software\n# Copyright (C) 2006-2011 See readme for details and license\n#\n\nclass Attachmen"
},
{
"path": "app/controllers/auth_sources_controller.rb",
"chars": 1819,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass AuthSourcesController < A"
},
{
"path": "app/controllers/boards_controller.rb",
"chars": 2426,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass BoardsController < Applic"
},
{
"path": "app/controllers/comments_controller.rb",
"chars": 1098,
"preview": "class CommentsController < ApplicationController\n unloadable\n before_filter :find_issue, :only => [:index, :create ]\n "
},
{
"path": "app/controllers/credit_distributions_controller.rb",
"chars": 2128,
"preview": "class CreditDistributionsController < ApplicationController\n before_filter :require_admin\n ssl_required :all\n\n\n def i"
},
{
"path": "app/controllers/credit_transfers_controller.rb",
"chars": 2324,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license\n#\n\nclass CreditTransfersControlle"
},
{
"path": "app/controllers/credits_controller.rb",
"chars": 4583,
"preview": "class CreditsController < ApplicationController\n\n before_filter :require_admin, :except => [:disable, :enable]\n before"
},
{
"path": "app/controllers/documents_controller.rb",
"chars": 2799,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass DocumentsController < App"
},
{
"path": "app/controllers/email_updates_controller.rb",
"chars": 1283,
"preview": "class EmailUpdatesController < ApplicationController\n before_filter :require_login\n ssl_required :all\n\n def new\n @"
},
{
"path": "app/controllers/enterprises_controller.rb",
"chars": 1818,
"preview": "class EnterprisesController < ApplicationController\n ssl_required :all\n\n def index\n @enterprises = Enterprise.all\n\n"
},
{
"path": "app/controllers/enumerations_controller.rb",
"chars": 1933,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass EnumerationsController < "
},
{
"path": "app/controllers/help_controller.rb",
"chars": 95,
"preview": "class HelpController < ApplicationController\n def show\n @help_key = params[:key]\n end\nend\n"
},
{
"path": "app/controllers/help_sections_controller.rb",
"chars": 2099,
"preview": "class HelpSectionsController < ApplicationController\n before_filter :authorize, :except => :dont_show\n ssl_required :a"
},
{
"path": "app/controllers/home_controller.rb",
"chars": 429,
"preview": "class HomeController < ApplicationController\n ssl_required :index\n layout 'static'\n def index\n if User.current.log"
},
{
"path": "app/controllers/hourly_types_controller.rb",
"chars": 1006,
"preview": "class HourlyTypesController < ApplicationController\n before_filter :find_project\n ssl_required :all\n\n def new\n @ho"
},
{
"path": "app/controllers/invitations_controller.rb",
"chars": 5472,
"preview": "class InvitationsController < ApplicationController\n before_filter :find_project, :except => :accept\n before_filter :a"
},
{
"path": "app/controllers/issue_invitations_controller.rb",
"chars": 623,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass IssueInvitationsControlle"
},
{
"path": "app/controllers/issue_relations_controller.rb",
"chars": 1541,
"preview": "# Redmine - project management software\n# Copyright (C) 2006-2011 See readme for details and license\n#\n\n\nclass IssueRel"
},
{
"path": "app/controllers/issue_statuses_controller.rb",
"chars": 1438,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass IssueStatusesController <"
},
{
"path": "app/controllers/issue_votes_controller.rb",
"chars": 1808,
"preview": "class IssueVotesController < ApplicationController\n ssl_required :all\n\n def index\n @issue_votes = IssueVote.all\n\n "
},
{
"path": "app/controllers/issues_controller.rb",
"chars": 32812,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass IssuesController < Applic"
},
{
"path": "app/controllers/journals_controller.rb",
"chars": 1771,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license\n#\n\nclass JournalsController < App"
},
{
"path": "app/controllers/mail_handler_controller.rb",
"chars": 1824,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license\n#\n\nclass MailHandlerController < "
},
{
"path": "app/controllers/mails_controller.rb",
"chars": 1400,
"preview": "class MailsController < ApplicationController\n\n before_filter :set_user\n\n def index\n if params[:mailbox] == \"sent\"\n"
},
{
"path": "app/controllers/members_controller.rb",
"chars": 2411,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass MembersController < Appli"
},
{
"path": "app/controllers/messages_controller.rb",
"chars": 5168,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass MessagesController < Appl"
},
{
"path": "app/controllers/motion_votes_controller.rb",
"chars": 2120,
"preview": "class MotionVotesController < ApplicationController\n ssl_required :all\n\n def index\n @motion_votes = MotionVote.all\n"
},
{
"path": "app/controllers/motions_controller.rb",
"chars": 4830,
"preview": "class MotionsController < ApplicationController\n\n before_filter :find_project, :only => [:new,:index,:create,:show, :ed"
},
{
"path": "app/controllers/my_controller.rb",
"chars": 11578,
"preview": "# Redmine - project management software\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass MyControll"
},
{
"path": "app/controllers/news_controller.rb",
"chars": 3564,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass NewsController < Applicat"
},
{
"path": "app/controllers/notifications_controller.rb",
"chars": 2393,
"preview": "class NotificationsController < ApplicationController\n ssl_required :all\n def index\n @notifications = Notification."
},
{
"path": "app/controllers/projects_controller.rb",
"chars": 21827,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass ProjectsController < Appl"
},
{
"path": "app/controllers/queries_controller.rb",
"chars": 2367,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass QueriesController < Appli"
},
{
"path": "app/controllers/quotes_controller.rb",
"chars": 1695,
"preview": "class QuotesController < ApplicationController\n ssl_required :all\n\n def index\n @quotes = Quote.all\n\n respond_to "
},
{
"path": "app/controllers/recurly_notifications_controller.rb",
"chars": 1271,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass RecurlyNotificationsContr"
},
{
"path": "app/controllers/reports_controller.rb",
"chars": 5417,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass ReportsController < Appli"
},
{
"path": "app/controllers/reputations_controller.rb",
"chars": 1818,
"preview": "class ReputationsController < ApplicationController\n ssl_required :all\n\n def index\n @reputations = Reputation.all\n\n"
},
{
"path": "app/controllers/retro_ratings_controller.rb",
"chars": 2542,
"preview": "class RetroRatingsController < ApplicationController\n ssl_required :all\n\n def index\n @retro_ratings = RetroRating.a"
},
{
"path": "app/controllers/retros_controller.rb",
"chars": 11830,
"preview": "class RetrosController < ApplicationController\n before_filter :find_retro, :only => [:show]\n before_filter :find_proje"
},
{
"path": "app/controllers/roles_controller.rb",
"chars": 2029,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass RolesController < Applica"
},
{
"path": "app/controllers/search_controller.rb",
"chars": 3341,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass SearchController < Applic"
},
{
"path": "app/controllers/settings_controller.rb",
"chars": 2345,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n# This program is free software;"
},
{
"path": "app/controllers/shares_controller.rb",
"chars": 1739,
"preview": "class SharesController < ApplicationController\n ssl_required :all\n\n def index\n @shares = Share.all\n @project = P"
},
{
"path": "app/controllers/todos_controller.rb",
"chars": 1995,
"preview": "class TodosController < ApplicationController\n\n before_filter :find_issue, :only => [:index, :create, :update, :destroy"
},
{
"path": "app/controllers/trackers_controller.rb",
"chars": 1578,
"preview": "# Redmine - project management software\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass TrackersCo"
},
{
"path": "app/controllers/users_controller.rb",
"chars": 5038,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass UsersController < Applica"
},
{
"path": "app/controllers/votes_controller.rb",
"chars": 2746,
"preview": "# An example controller for \"votes\" that are nested resources under users. See examples/routes.rb\n\nclass VotesController"
},
{
"path": "app/controllers/watchers_controller.rb",
"chars": 2534,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass WatchersController < Appl"
},
{
"path": "app/controllers/welcome_controller.rb",
"chars": 1413,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass WelcomeController < Appli"
},
{
"path": "app/controllers/wiki_controller.rb",
"chars": 8313,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nrequire 'diff'\n\nclass WikiContr"
},
{
"path": "app/controllers/wikis_controller.rb",
"chars": 950,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass WikisController < Applica"
},
{
"path": "app/controllers/workflows_controller.rb",
"chars": 2642,
"preview": "# Redmine - project management software\n# Copyright (C) 2006-2011 See readme for details and license\n#\n\nclass Workflows"
},
{
"path": "app/helpers/admin_helper.rb",
"chars": 455,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nmodule AdminHelper\n def projec"
},
{
"path": "app/helpers/application_helper.rb",
"chars": 50540,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nrequire 'coderay'\nrequire 'code"
},
{
"path": "app/helpers/attachments_helper.rb",
"chars": 1014,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nmodule AttachmentsHelper\n # Di"
},
{
"path": "app/helpers/groups_helper.rb",
"chars": 802,
"preview": "# Redmine - project management software\n# Copyright (C) 2006-2011 See readme for details and license#\n\nmodule GroupsHel"
},
{
"path": "app/helpers/issue_relations_helper.rb",
"chars": 309,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nmodule IssueRelationsHelper\n d"
},
{
"path": "app/helpers/issues_helper.rb",
"chars": 3515,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nmodule IssuesHelper\n include A"
},
{
"path": "app/helpers/journals_helper.rb",
"chars": 2233,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license\n#\n\nmodule JournalsHelper\n def re"
},
{
"path": "app/helpers/messages_helper.rb",
"chars": 572,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nmodule MessagesHelper\n\n def li"
},
{
"path": "app/helpers/motions_helper.rb",
"chars": 354,
"preview": "module MotionsHelper\n def render_title_date\n end_date = @motion.ends_on\n if (!@motion.active?)\n logger.info "
},
{
"path": "app/helpers/my_helper.rb",
"chars": 4189,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nmodule MyHelper\n def describe("
},
{
"path": "app/helpers/news_helper.rb",
"chars": 111,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nmodule NewsHelper\nend\n"
},
{
"path": "app/helpers/projects_helper.rb",
"chars": 6367,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nmodule ProjectsHelper\n def pro"
},
{
"path": "app/helpers/queries_helper.rb",
"chars": 1222,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nmodule QueriesHelper\n\n def ope"
},
{
"path": "app/helpers/reports_helper.rb",
"chars": 556,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nmodule ReportsHelper\n\n def agg"
},
{
"path": "app/helpers/retros_helper.rb",
"chars": 648,
"preview": "module RetrosHelper\n def render_title_date\n end_date = @retro.created_at.advance(:days => Setting::DEFAULT_RETROSPEC"
},
{
"path": "app/helpers/search_helper.rb",
"chars": 1955,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nmodule SearchHelper\n def highl"
},
{
"path": "app/helpers/settings_helper.rb",
"chars": 2511,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nmodule SettingsHelper\n def adm"
},
{
"path": "app/helpers/sort_helper.rb",
"chars": 6167,
"preview": "# Helpers to sort tables using clickable column headers.\n#\n# Author: Stuart Rackham <srackham@methods.co.nz>, March 200"
},
{
"path": "app/helpers/users_helper.rb",
"chars": 2299,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nmodule UsersHelper\n def users_"
},
{
"path": "app/helpers/watchers_helper.rb",
"chars": 2095,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nmodule WatchersHelper\n\n # Vali"
},
{
"path": "app/helpers/wiki_helper.rb",
"chars": 1584,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nmodule WikiHelper\n\n def wiki_p"
},
{
"path": "app/models/activity_stream.rb",
"chars": 5210,
"preview": "# Copyright (c) 2008 Matson Systems, Inc.\n# Released under the BSD license found in the file\n# LICENSE included with thi"
},
{
"path": "app/models/activity_stream_preference.rb",
"chars": 389,
"preview": "# Copyright (c) 2008 Matson Systems, Inc.\n# Released under the BSD license found in the file\n# LICENSE included with thi"
},
{
"path": "app/models/activity_stream_total.rb",
"chars": 396,
"preview": "# Copyright (c) 2008 Matson Systems, Inc.\n# Released under the BSD license found in the file\n# LICENSE included with thi"
},
{
"path": "app/models/attachment.rb",
"chars": 4348,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nrequire \"digest/md5\"\n\nclass Att"
},
{
"path": "app/models/auth_source.rb",
"chars": 917,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass AuthSource < ActiveRecord"
},
{
"path": "app/models/auth_source_ldap.rb",
"chars": 3121,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nrequire 'net/ldap'\nrequire 'ico"
},
{
"path": "app/models/board.rb",
"chars": 1424,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass Board < ActiveRecord::Bas"
},
{
"path": "app/models/comment.rb",
"chars": 1141,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass Comment < ActiveRecord::B"
},
{
"path": "app/models/credit.rb",
"chars": 4187,
"preview": "class Credit < ActiveRecord::Base\n\n default_value_for :issued_on do\n Time.now\n end\n\n #Constants\n ROUNDING_LEVEL ="
},
{
"path": "app/models/credit_distribution.rb",
"chars": 1075,
"preview": "class CreditDistribution < ActiveRecord::Base\n after_create :add_credits\n belongs_to :project\n belongs_to :retro\n be"
},
{
"path": "app/models/credit_transfer.rb",
"chars": 791,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass CreditTransfer < ActiveRe"
},
{
"path": "app/models/daily_digest.rb",
"chars": 430,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass DailyDigest < ActiveRecor"
},
{
"path": "app/models/document.rb",
"chars": 1375,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass Document < ActiveRecord::"
},
{
"path": "app/models/document_observer.rb",
"chars": 286,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass DocumentObserver < Active"
},
{
"path": "app/models/email_update.rb",
"chars": 337,
"preview": "class EmailUpdate < ActiveRecord::Base\n belongs_to :user\n\n def before_create\n self.token = Token.generate_token_val"
},
{
"path": "app/models/enabled_module.rb",
"chars": 542,
"preview": "# Redmine - project management software\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass EnabledMod"
},
{
"path": "app/models/enterprise.rb",
"chars": 492,
"preview": "class Enterprise < ActiveRecord::Base\n has_one :root_project, :class_name => 'Project', :conditions => \"parent_id is "
},
{
"path": "app/models/enumeration.rb",
"chars": 3021,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass Enumeration < ActiveRecor"
},
{
"path": "app/models/help_section.rb",
"chars": 62,
"preview": "class HelpSection < ActiveRecord::Base\n belongs_to :user\nend\n"
},
{
"path": "app/models/hourly_type.rb",
"chars": 626,
"preview": "class HourlyType < ActiveRecord::Base\n belongs_to :project\n has_many :issues\n\n validates_presence_of :name, :project,"
},
{
"path": "app/models/invitation.rb",
"chars": 2203,
"preview": "class Invitation < ActiveRecord::Base\n belongs_to :project\n belongs_to :user\n belongs_to :role\n\n PENDING = 0\n ACCEP"
},
{
"path": "app/models/issue.rb",
"chars": 23369,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass Issue < ActiveRecord::Bas"
},
{
"path": "app/models/issue_observer.rb",
"chars": 269,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass IssueObserver < ActiveRec"
},
{
"path": "app/models/issue_relation.rb",
"chars": 2936,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass IssueRelation < ActiveRec"
},
{
"path": "app/models/issue_status.rb",
"chars": 3249,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass IssueStatus < ActiveRecor"
},
{
"path": "app/models/issue_vote.rb",
"chars": 1274,
"preview": "class IssueVote < ActiveRecord::Base\n belongs_to :user\n belongs_to :issue\n before_create :remove_similar\n before_sav"
},
{
"path": "app/models/journal.rb",
"chars": 3014,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass Journal < ActiveRecord::B"
},
{
"path": "app/models/journal_detail.rb",
"chars": 324,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass JournalDetail < ActiveRec"
},
{
"path": "app/models/journal_observer.rb",
"chars": 627,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass JournalObserver < ActiveR"
},
{
"path": "app/models/mail.rb",
"chars": 275,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass Mail < ActiveRecord::Base"
},
{
"path": "app/models/mail_handler.rb",
"chars": 12593,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass MailHandler < ActiveRecor"
},
{
"path": "app/models/mailer.rb",
"chars": 19347,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass Mailer < ActionMailer::Ba"
},
{
"path": "app/models/member.rb",
"chars": 1761,
"preview": "# Redmine - project management software\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass Member < A"
},
{
"path": "app/models/member_role.rb",
"chars": 2665,
"preview": "# Redmine - project management software\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass MemberRole"
},
{
"path": "app/models/message.rb",
"chars": 3708,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass Message < ActiveRecord::B"
},
{
"path": "app/models/message_observer.rb",
"chars": 283,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass MessageObserver < ActiveR"
},
{
"path": "app/models/motion.rb",
"chars": 9288,
"preview": "class Motion < ActiveRecord::Base\n include ActionController::UrlWriter\n STATE_ACTIVE = 0\n STATE_PASSED = 1\n STATE_DE"
},
{
"path": "app/models/motion_vote.rb",
"chars": 2214,
"preview": "class MotionVote < ActiveRecord::Base\n belongs_to :user\n belongs_to :motion\n before_create :remove_similar_votes\n be"
},
{
"path": "app/models/news.rb",
"chars": 2011,
"preview": "# Redmine - project management software\n# Copyright (C) 2006-2011 See readme for details and license\n#\n\nclass News < Ac"
},
{
"path": "app/models/news_observer.rb",
"chars": 266,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass NewsObserver < ActiveReco"
},
{
"path": "app/models/notification.rb",
"chars": 2306,
"preview": "class Notification < ActiveRecord::Base\n serialize :params\n\n belongs_to :recipient, :class_name => 'User', :foreign_ke"
},
{
"path": "app/models/open_id_authentication_association.rb",
"chars": 63,
"preview": "class OpenIdAuthenticationAssociation < ActiveRecord::Base\nend\n"
},
{
"path": "app/models/open_id_authentication_nonces.rb",
"chars": 58,
"preview": "class OpenIdAuthenticationNonces < ActiveRecord::Base\nend\n"
},
{
"path": "app/models/personal_welcome.rb",
"chars": 664,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass PersonalWelcome < ActiveR"
},
{
"path": "app/models/plan.rb",
"chars": 156,
"preview": "class Plan < ActiveRecord::Base\n FREE_CODE = 0\n\n def free?\n return self.code == FREE_CODE\n end\n\n def self.free\n "
},
{
"path": "app/models/plugin_schema_info.rb",
"chars": 86,
"preview": "class PluginSchemaInfo < ActiveRecord::Base\n set_table_name 'plugin_schema_info'\nend\n"
},
{
"path": "app/models/project.rb",
"chars": 35034,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass Project < ActiveRecord::B"
},
{
"path": "app/models/query.rb",
"chars": 17030,
"preview": "# Redmine - project management software\n# Copyright (C) 2006-2011 See readme for details and license\n#\n\nclass QueryColu"
},
{
"path": "app/models/quote.rb",
"chars": 133,
"preview": "class Quote < ActiveRecord::Base\n belongs_to :user\n\n def self.random\n Quote.find :first, :offset => rand(Quote.coun"
},
{
"path": "app/models/reputation.rb",
"chars": 2617,
"preview": "class Reputation < ActiveRecord::Base\n belongs_to :user\n belongs_to :project\n\n VARIATION_SELF_BIAS = 1\n VARIATION_SC"
},
{
"path": "app/models/retro.rb",
"chars": 8061,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass Retro < ActiveRecord::Bas"
},
{
"path": "app/models/retro_rating.rb",
"chars": 854,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass RetroRating < ActiveRecor"
},
{
"path": "app/models/role.rb",
"chars": 6932,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass Role < ActiveRecord::Base"
},
{
"path": "app/models/setting.rb",
"chars": 8761,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass Setting < ActiveRecord::B"
},
{
"path": "app/models/share.rb",
"chars": 1433,
"preview": "class Share < ActiveRecord::Base\n\n default_value_for :issued_on do\n Time.now\n end\n\n #Constants\n VARIATION_FOUNDER"
},
{
"path": "app/models/todo.rb",
"chars": 328,
"preview": "class Todo < ActiveRecord::Base\n belongs_to :author, :class_name => 'User', :foreign_key => 'author_id'\n belongs_to :o"
},
{
"path": "app/models/token.rb",
"chars": 873,
"preview": "# Redmine - project management software\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass Token < Ac"
},
{
"path": "app/models/track.rb",
"chars": 504,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass Track < ActiveRecord::Bas"
},
{
"path": "app/models/tracker.rb",
"chars": 1925,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass Tracker < ActiveRecord::B"
},
{
"path": "app/models/user.rb",
"chars": 27560,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\n\nrequire \"digest/sha1\"\n\nclass U"
},
{
"path": "app/models/user_preference.rb",
"chars": 1202,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass UserPreference < ActiveRe"
},
{
"path": "app/models/watcher.rb",
"chars": 1365,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass Watcher < ActiveRecord::B"
},
{
"path": "app/models/wiki.rb",
"chars": 2144,
"preview": "# Redmine - project management software\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass Wiki < Act"
},
{
"path": "app/models/wiki_content.rb",
"chars": 2326,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nrequire 'zlib'\n\nclass WikiConte"
},
{
"path": "app/models/wiki_content_observer.rb",
"chars": 506,
"preview": "# Redmine - project management software\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass WikiConten"
},
{
"path": "app/models/wiki_page.rb",
"chars": 5759,
"preview": "# Redmine - project management software\n# Copyright (C) 2006-2011 See readme for details and license#\n\nrequire 'diff'\nr"
},
{
"path": "app/models/wiki_redirect.rb",
"chars": 261,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass WikiRedirect < ActiveReco"
},
{
"path": "app/models/workflow.rb",
"chars": 3280,
"preview": "# BetterMeans - Work 2.0\n# Copyright (C) 2006-2011 See readme for details and license#\n\nclass Workflow < ActiveRecord::"
},
{
"path": "app/views/account/login.html.erb",
"chars": 3832,
"preview": "<div id=\"inner-page\">\n <div class=\"container\">\n <%= render :partial => '/home/header', :locals => {:page => 'login'} "
},
{
"path": "app/views/account/lost_password.html.erb",
"chars": 404,
"preview": "<h2><%=l(:label_password_lost)%></h2>\n\n<div class=\"gt-content-box padded\">\n<% form_tag({:action=> \"lost_password\"}, :cla"
},
{
"path": "app/views/account/password_recovery.html.erb",
"chars": 688,
"preview": "<h2><%=l(:label_password_lost)%></h2>\n\n<%= error_messages_for 'user' %>\n\n<% form_tag({:token => @token.value}) do %>\n<di"
},
{
"path": "app/views/account/register.html.erb",
"chars": 2498,
"preview": "<div id=\"inner-page\">\n <div class=\"container\">\n <%= render :partial => '/home/header', :locals => {:page => 'register"
},
{
"path": "app/views/activity_stream_preferences/index.html.erb",
"chars": 1664,
"preview": "<% html_title('Configure Your Activity Stream Access') %>\n\n<script type='text/javascript'>\nfunction all_clicked(checkbox"
},
{
"path": "app/views/activity_streams/_activity_comment.html.erb",
"chars": 754,
"preview": "<tr id=\"input_comment_<%= as.object_id %>\" class=\"hidden\">\n <td class=\"gt-avatar\" id=\"gravatar_for_comment_<%= as.objec"
},
{
"path": "app/views/activity_streams/_activity_stream.html.erb",
"chars": 1629,
"preview": "<tr class=\"gt-activity-header\">\n <td colspan=\"2\">\n <h4 class=\"long-words\">\n <%= link_to as.actor_name, {:controll"
},
{
"path": "app/views/activity_streams/_activity_stream_feed.atom.builder",
"chars": 903,
"preview": "\nthis_url = \"http://#{request.host_with_port}/feeds/your_activities/#{@user.activity_stream_token}\"\n\natom_feed(:url => t"
},
{
"path": "app/views/activity_streams/_activity_stream_group.erb",
"chars": 818,
"preview": "<%= render :partial => 'activity_streams/activity_stream', :locals => {:as => asg[0], :refresh_link => refresh_link} %>\n"
},
{
"path": "app/views/activity_streams/_activity_stream_list.html.erb",
"chars": 4213,
"preview": " <% activities_by_item = ActivityStream.fetch(user_id,project_id, with_subprojects, limit, max_created_at) %>\n <%li"
},
{
"path": "app/views/activity_streams/_activity_stream_sub.html.erb",
"chars": 579,
"preview": "<tr>\n <td class=\"gt-avatar\">\n <%= avatar(as.actor_email, :size => \"24\") %>\n\n </td>\n <td>\n <span class=\"auth"
},
{
"path": "app/views/activity_streams/_indirect_object.html.erb",
"chars": 277,
"preview": "<% if as.indirect_object_type.to_s == \"Journal\" && as.indirect_object_phrase == \"GENERATEDETAILS\" %>\n <%= render_journa"
},
{
"path": "app/views/activity_streams/_table_header.html.erb",
"chars": 43,
"preview": "<tr>\n<th>Date</th>\n<th>Activity</th>\n</tr>\n"
},
{
"path": "app/views/activity_streams/edit.html.erb",
"chars": 817,
"preview": "<h1>Editing activity_stream</h1>\n\n<% form_for(@activity_stream) do |f| %>\n <%= f.error_messages %>\n\n <p>\n <%= f.lab"
},
{
"path": "app/views/activity_streams/index.html.erb",
"chars": 320,
"preview": "<% @page_header_name = l(:label_browse_activity) %>\n<div class = \"clear\">\n<h2>All Site ActivityStreams</h2>\n\n<% @grouped"
},
{
"path": "app/views/activity_streams/new.html.erb",
"chars": 771,
"preview": "<h1>New activity_stream</h1>\n\n<% form_for(@activity_stream) do |f| %>\n <%= f.error_messages %>\n\n <p>\n <%= f.label :"
},
{
"path": "app/views/activity_streams/show.html.erb",
"chars": 566,
"preview": "<p>\n <b>Activity:</b>\n <%=h @activity_stream.activity %>\n</p>\n\n<p>\n <b>Actor:</b>\n <%=h @activity_stream.actor_id %>"
},
{
"path": "app/views/admin/_menu.html.erb",
"chars": 1535,
"preview": "<div id=\"admin-menu\">\n <ul>\n <li><%= link_to l(:label_project_plural), {:controller => 'admin', :action => 'projects"
},
{
"path": "app/views/admin/_no_data.html.erb",
"chars": 435,
"preview": "<div class=\"nodata\">\n<% form_tag({:action => 'default_configuration'}) do %>\n <%= simple_format(l(:text_no_configurat"
},
{
"path": "app/views/admin/index.html.erb",
"chars": 214,
"preview": "<h2><%=l(:label_administration)%></h2>\n\n<div id=\"admin-index\">\n <%= render :partial => 'no_data' if @no_configuration_d"
},
{
"path": "app/views/admin/info.html.erb",
"chars": 466,
"preview": "<h2><%=l(:label_information_plural)%></h2>\n\n<p><strong><%= Redmine::Info.versioned_name %></strong> (<%= @db_adapter_nam"
},
{
"path": "app/views/admin/plugins.html.erb",
"chars": 938,
"preview": "<h2><%= l(:label_plugins) %></h2>\n\n<% if @plugins.any? %>\n<table class=\"gt-table plugins\">\n <% @plugins.each do |plug"
},
{
"path": "app/views/admin/projects.html.erb",
"chars": 2363,
"preview": "<div class=\"contextual\">\n<%= link_to l(:label_project_new), {:controller => 'projects', :action => 'add'}, :class => 'ic"
},
{
"path": "app/views/admin/user_stats.html.erb",
"chars": 1028,
"preview": "<%= javascript_include_tag 'raphael.min', 'g.raphael.min', 'g.line.min', 'g.bar.min' %>\n\n<div class=\"gt-content-box padd"
},
{
"path": "app/views/attachments/_form.html.erb",
"chars": 704,
"preview": "<div id=\"attachments_form_link\">\n <a href=\"#\" class=\"icon icon-attachment\" onclick=\"$('#attachments_form_details').show"
},
{
"path": "app/views/attachments/_links.html.erb",
"chars": 882,
"preview": "<div class=\"attachments\">\n<% for attachment in attachments %>\n<p><%= link_to_attachment attachment, :class => 'icon icon"
},
{
"path": "app/views/attachments/_table.erb",
"chars": 902,
"preview": "<table class=\"attachments\">\n<% for attachment in attachments %>\n<tr>\n <td>\n<%= link_to_attachment attachment, :class =>"
},
{
"path": "app/views/attachments/diff.html.erb",
"chars": 662,
"preview": "<h2><%=h @attachment.filename %></h2>\n\n<div class=\"attachments\">\n<p><%= h(\"#{@attachment.description} - \") unless @attac"
},
{
"path": "app/views/attachments/file.html.erb",
"chars": 677,
"preview": "<h2><%=h @attachment.filename %></h2>\n\n<div class=\"attachments\">\n<p><%= h(\"#{@attachment.description} - \") unless @attac"
},
{
"path": "app/views/auth_sources/_form.html.erb",
"chars": 2150,
"preview": "<%= error_messages_for 'auth_source' %>\n\n<div class=\"gt-content-box\">\n<p><label for=\"auth_source_name\"><%=l(:field_name)"
},
{
"path": "app/views/auth_sources/edit.html.erb",
"chars": 283,
"preview": "<h2><%=l(:label_auth_source)%> (<%= @auth_source.auth_method_name %>)</h2>\n\n<% form_tag({:action => 'update', :id => @au"
},
{
"path": "app/views/auth_sources/list.html.erb",
"chars": 1289,
"preview": "<div class=\"contextual\">\n<%= link_to l(:label_auth_source_new), {:action => 'new'}, :class => 'icon icon-add' %>\n</div>\n"
},
{
"path": "app/views/auth_sources/new.html.erb",
"chars": 267,
"preview": "<h2><%=l(:label_auth_source_new)%> (<%= @auth_source.auth_method_name %>)</h2>\n\n<% form_tag({:action => 'create'}, :clas"
},
{
"path": "app/views/boards/_form.html.erb",
"chars": 195,
"preview": "<%= error_messages_for 'board' %>\n\n<div class=\"gt-content-box\">\n<p><%= f.text_field :name, :required => true %></p>\n<p><"
},
{
"path": "app/views/boards/edit.html.erb",
"chars": 313,
"preview": "<h2><%= l(:label_board) %></h2>\n\n<% labelled_tabular_form_for :board, @board, :url => {:action => 'edit', :id => @board}"
},
{
"path": "app/views/boards/index.html.erb",
"chars": 953,
"preview": "<%= help_section \"project_discussion\" %>\n<h2><%= l(:label_board_plural) %></h2>\n\n<table class=\"gt-table boards\">\n <thea"
},
{
"path": "app/views/boards/new.html.erb",
"chars": 307,
"preview": "<h2><%= l(:label_board_new) %></h2>\n\n<% labelled_tabular_form_for :board, @board, :url => {:action => 'new'} do |f| %>\n "
},
{
"path": "app/views/boards/show.html.erb",
"chars": 3397,
"preview": "<%= help_section \"project_discussion\" %>\n<%= breadcrumb link_to(l(:label_board_plural), {:controller => 'boards', :actio"
},
{
"path": "app/views/common/403.html.erb",
"chars": 130,
"preview": "<h2>403</h2>\n\n<p><%= l(:notice_not_authorized) %></p>\n<p><a href=\"javascript:history.back()\">Back</a></p>\n\n<% html_title"
},
{
"path": "app/views/common/404.html.erb",
"chars": 129,
"preview": "<h2>404</h2>\n<p><%= l(:notice_file_not_found) %></p>\n<p><a href=\"javascript:history.back()\">Back</a></p>\n\n<% html_title "
},
{
"path": "app/views/common/_calendar.html.erb",
"chars": 1209,
"preview": "<table class=\"cal\">\n<thead>\n<tr><td></td><% 7.times do |i| %><th><%= day_name( (calendar.first_wday+i)%7 ) %></th><% end"
},
{
"path": "app/views/common/_diff.html.erb",
"chars": 2513,
"preview": "<% diff = Redmine::UnifiedDiff.new(diff, :type => diff_type, :max_lines => Setting.diff_max_lines_displayed.to_i) -%>\n<%"
},
{
"path": "app/views/common/_file.html.erb",
"chars": 368,
"preview": "<div class=\"autoscroll\">\n<table class=\"filecontent CodeRay\">\n<tbody>\n<% line_num = 1 %>\n<% syntax_highlight(filename, to"
},
{
"path": "app/views/common/_main_menu_home.html.erb",
"chars": 814,
"preview": "<ul>\n <li>\n <%= link_to l(:label_my_page), {:controller => \"welcome\", :action => \"index\"}, :class => (active_page =="
}
]
// ... and 1716 more files (download for full content)
About this extraction
This page contains the full source code of the Bettermeans/bettermeans GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1916 files (7.9 MB), approximately 2.2M tokens, and a symbol index with 6068 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.