your_platform 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +39 -11
- data/Rakefile +15 -1
- data/app/assets/images/file.png +0 -0
- data/app/assets/images/img/excel2013_file_128.png +0 -0
- data/app/assets/images/img/excel2013_file_bw_107.png +0 -0
- data/app/assets/images/img/excel2013_file_bw_semitransparent_107.png +0 -0
- data/app/assets/images/img/glyphicons-halflings-white.png +0 -0
- data/app/assets/images/img/glyphicons-halflings.png +0 -0
- data/app/assets/images/img/gmaps_yellow_marker.png +0 -0
- data/app/assets/images/img/gmaps_yellow_marker_38.png +0 -0
- data/app/assets/images/markdown_help.png +0 -0
- data/app/assets/images/your_platform/breadcrumb-sep.png +0 -0
- data/app/assets/javascripts/app-ng.js.coffee +5 -0
- data/app/assets/javascripts/attachments.js +2 -0
- data/app/assets/javascripts/controllers-ng/bookmark_list_controller.js.coffee +30 -0
- data/app/assets/javascripts/controllers-ng/box_controller.js.coffee +37 -0
- data/app/assets/javascripts/controllers-ng/profile_angular.js.coffee +151 -0
- data/app/assets/javascripts/directives-ng/box_directive.js.coffee +91 -0
- data/app/assets/javascripts/directives-ng/star_tool_directive.js.coffee +111 -0
- data/app/assets/javascripts/filters-ng/some_filter.js.coffee +0 -0
- data/app/assets/javascripts/jquery.appear-1.1.1.js +138 -0
- data/app/assets/javascripts/make-js-more-like-ruby.js.coffee +32 -0
- data/app/assets/javascripts/mercury.js +456 -0
- data/app/assets/javascripts/models-ng/bookmark.js.coffee +28 -0
- data/app/assets/javascripts/services-ng/current_user_bookmarks.js.coffee +39 -0
- data/app/assets/javascripts/your_platform.js +27 -0
- data/app/assets/javascripts/your_platform/address_labels.js.coffee +40 -0
- data/app/assets/javascripts/your_platform/attachments.js.coffee +61 -0
- data/app/assets/javascripts/your_platform/auto-completion.js.coffee +90 -0
- data/app/assets/javascripts/your_platform/best_in_place.js.coffee +8 -0
- data/app/assets/javascripts/your_platform/best_in_place_hyperlinks.js.coffee +25 -0
- data/app/assets/javascripts/your_platform/best_in_place_tab_key.js.coffee +28 -0
- data/app/assets/javascripts/your_platform/boxes.js.coffee +11 -0
- data/app/assets/javascripts/your_platform/change_password.js.coffee +22 -0
- data/app/assets/javascripts/your_platform/close_dropdowns.js.coffee +18 -0
- data/app/assets/javascripts/your_platform/copy_to_clipboard.js.coffee +6 -0
- data/app/assets/javascripts/your_platform/datatables.coffee +112 -0
- data/app/assets/javascripts/your_platform/datepicker_settings.js.coffee +16 -0
- data/app/assets/javascripts/your_platform/edit_tools.js.coffee +19 -0
- data/app/assets/javascripts/your_platform/editable_dbl_click.js.coffee +42 -0
- data/app/assets/javascripts/your_platform/events.js.coffee +126 -0
- data/app/assets/javascripts/your_platform/fix_textarea.js.coffee +11 -0
- data/app/assets/javascripts/your_platform/galleria.js.coffee +112 -0
- data/app/assets/javascripts/your_platform/groups.js.coffee +36 -0
- data/app/assets/javascripts/your_platform/hidden.js.coffee +5 -0
- data/app/assets/javascripts/your_platform/links_to_external_sites.js.coffee +12 -0
- data/app/assets/javascripts/your_platform/maps.js.coffee +13 -0
- data/app/assets/javascripts/your_platform/may_need_review.js.coffee +10 -0
- data/app/assets/javascripts/your_platform/navable_title_rename.js.coffee +17 -0
- data/app/assets/javascripts/your_platform/officers.js.coffee +35 -0
- data/app/assets/javascripts/your_platform/popovers.js.coffee +38 -0
- data/app/assets/javascripts/your_platform/posts.js.coffee +58 -0
- data/app/assets/javascripts/your_platform/profile_fields.js.coffee +61 -0
- data/app/assets/javascripts/your_platform/search.js.coffee +26 -0
- data/app/assets/javascripts/your_platform/tooltips.js.coffee +10 -0
- data/app/assets/javascripts/your_platform/turbolinks_loading_spinner.js.coffee +83 -0
- data/app/assets/javascripts/your_platform/user_avatars.js.coffee +33 -0
- data/app/assets/javascripts/your_platform/user_group_memberships.js.coffee +11 -0
- data/app/assets/javascripts/your_platform/user_settings.js.coffee +18 -0
- data/app/assets/javascripts/your_platform/users_new.js.coffee +54 -0
- data/app/assets/stylesheets/bootstrap_layout.css.sass +3 -0
- data/app/assets/stylesheets/bootstrap_layout/attachments.css.sass +3 -0
- data/app/assets/stylesheets/bootstrap_layout/boxes.css.sass +11 -0
- data/app/assets/stylesheets/bootstrap_layout/breadcrumb.css.sass +25 -0
- data/app/assets/stylesheets/bootstrap_layout/category_indicator.css.sass +5 -0
- data/app/assets/stylesheets/bootstrap_layout/footer.css.sass +14 -0
- data/app/assets/stylesheets/bootstrap_layout/galleria.css.sass +8 -0
- data/app/assets/stylesheets/bootstrap_layout/header_bar.css.sass +11 -0
- data/app/assets/stylesheets/bootstrap_layout/headings.css.sass +10 -0
- data/app/assets/stylesheets/bootstrap_layout/logged_in_bar.css.sass +40 -0
- data/app/assets/stylesheets/bootstrap_layout/logo.css.sass +2 -0
- data/app/assets/stylesheets/bootstrap_layout/modal_fix.css.sass +8 -0
- data/app/assets/stylesheets/bootstrap_layout/profiles.css.sass +10 -0
- data/app/assets/stylesheets/bootstrap_layout/session_bar.css.sass +60 -0
- data/app/assets/stylesheets/bootstrap_layout/stars.css.sass +4 -0
- data/app/assets/stylesheets/bootstrap_layout/turbolinks_progress_bar.css.sass +3 -0
- data/app/assets/stylesheets/bootstrap_layout/vertical_menu.css.sass +15 -0
- data/app/assets/stylesheets/bootstrap_setup.css.sass +4 -0
- data/app/assets/stylesheets/your_platform.css.sass +11 -0
- data/app/assets/stylesheets/your_platform/address_labels_modal.css.sass +8 -0
- data/app/assets/stylesheets/your_platform/attachments.css.sass +75 -0
- data/app/assets/stylesheets/your_platform/authorization_info.css.sass +16 -0
- data/app/assets/stylesheets/your_platform/auto-completion.css.sass +3 -0
- data/app/assets/stylesheets/your_platform/center.css.sass +14 -0
- data/app/assets/stylesheets/your_platform/change_password.css.sass +13 -0
- data/app/assets/stylesheets/your_platform/corporate_vita.css.sass +2 -0
- data/app/assets/stylesheets/your_platform/datatables.css.sass +23 -0
- data/app/assets/stylesheets/your_platform/datepicker.css.sass +2 -0
- data/app/assets/stylesheets/your_platform/dropdowns.css.sass +8 -0
- data/app/assets/stylesheets/your_platform/events.css.sass +68 -0
- data/app/assets/stylesheets/your_platform/forms.css.sass +25 -0
- data/app/assets/stylesheets/your_platform/galleria.css.sass +12 -0
- data/app/assets/stylesheets/your_platform/groups.css.sass +8 -0
- data/app/assets/stylesheets/your_platform/groups_table.css.sass +8 -0
- data/app/assets/stylesheets/your_platform/hidden.css.sass +3 -0
- data/app/assets/stylesheets/your_platform/images.css.sass +50 -0
- data/app/assets/stylesheets/your_platform/last_activities.css.sass +17 -0
- data/app/assets/stylesheets/your_platform/latest_members.css.sass +7 -0
- data/app/assets/stylesheets/your_platform/login.css.sass +4 -0
- data/app/assets/stylesheets/your_platform/maps.css.sass +22 -0
- data/app/assets/stylesheets/your_platform/markdown_help.css.sass +5 -0
- data/app/assets/stylesheets/your_platform/may_need_review.css.sass +3 -0
- data/app/assets/stylesheets/your_platform/pages.css.sass +12 -0
- data/app/assets/stylesheets/your_platform/password_strength.css.sass +73 -0
- data/app/assets/stylesheets/your_platform/picture_attachments.css.sass +7 -0
- data/app/assets/stylesheets/your_platform/popovers.css.sass +13 -0
- data/app/assets/stylesheets/your_platform/posts.css.sass +32 -0
- data/app/assets/stylesheets/your_platform/profiles.css.sass +153 -0
- data/app/assets/stylesheets/your_platform/search_preview.css.sass +4 -0
- data/app/assets/stylesheets/your_platform/star_tool.css.sass +2 -0
- data/app/assets/stylesheets/your_platform/tooltips.css.sass +7 -0
- data/app/assets/stylesheets/your_platform/turbolinks_loading_spinner.css.sass +3 -0
- data/app/assets/stylesheets/your_platform/user_avatars.css.sass +8 -0
- data/app/assets/stylesheets/your_platform/user_group_memberships.css.sass +4 -0
- data/app/assets/stylesheets/your_platform/vertical_nav.css.sass +7 -0
- data/app/controllers/activities_controller.rb +6 -0
- data/app/controllers/application_controller.rb +236 -0
- data/app/controllers/attachments_controller.rb +97 -0
- data/app/controllers/blog_posts_controller.rb +50 -0
- data/app/controllers/bookmarks_controller.rb +33 -0
- data/app/controllers/corporations_controller.rb +22 -0
- data/app/controllers/errors_controller.rb +27 -0
- data/app/controllers/events_controller.rb +262 -0
- data/app/controllers/groups_controller.rb +257 -0
- data/app/controllers/officers_controller.rb +28 -0
- data/app/controllers/pages_controller.rb +67 -0
- data/app/controllers/posts_controller.rb +81 -0
- data/app/controllers/profile_fields_controller.rb +132 -0
- data/app/controllers/root_controller.rb +35 -0
- data/app/controllers/search_controller.rb +149 -0
- data/app/controllers/sessions_controller.rb +21 -0
- data/app/controllers/setup_controller.rb +80 -0
- data/app/controllers/statistics_controller.rb +38 -0
- data/app/controllers/status_group_memberships_controller.rb +28 -0
- data/app/controllers/terms_of_use_controller.rb +35 -0
- data/app/controllers/user_accounts_controller.rb +55 -0
- data/app/controllers/user_group_memberships_controller.rb +75 -0
- data/app/controllers/user_settings_controller.rb +57 -0
- data/app/controllers/users_controller.rb +125 -0
- data/app/controllers/workflows_controller.rb +19 -0
- data/app/helpers/application_helper.rb +25 -0
- data/app/helpers/attachments_helper.rb +2 -0
- data/app/helpers/auto_completion_helper.rb +33 -0
- data/app/helpers/avatar_helper.rb +70 -0
- data/app/helpers/bookmarks_helper.rb +22 -0
- data/app/helpers/box_helper.rb +56 -0
- data/app/helpers/breadcrumbs_helper.rb +62 -0
- data/app/helpers/corporate_vita_helper.rb +34 -0
- data/app/helpers/events_helper.rb +28 -0
- data/app/helpers/flash_helper.rb +60 -0
- data/app/helpers/footer_helper.rb +13 -0
- data/app/helpers/galleria_helper.rb +13 -0
- data/app/helpers/groups_helper.rb +66 -0
- data/app/helpers/horizontal_nav_helper.rb +11 -0
- data/app/helpers/i18n_helper.rb +10 -0
- data/app/helpers/icon_helper.rb +35 -0
- data/app/helpers/mailer_helper.rb +7 -0
- data/app/helpers/map_helper.rb +26 -0
- data/app/helpers/markdown_helper.rb +22 -0
- data/app/helpers/markup_helper.rb +25 -0
- data/app/helpers/officers_helper.rb +13 -0
- data/app/helpers/password_helper.rb +23 -0
- data/app/helpers/profile_field_helper.rb +40 -0
- data/app/helpers/profile_helper.rb +69 -0
- data/app/helpers/quick_link_helper.rb +53 -0
- data/app/helpers/special_pages_helper.rb +9 -0
- data/app/helpers/structureable_helper.rb +11 -0
- data/app/helpers/sublime_helper.rb +16 -0
- data/app/helpers/title_helper.rb +52 -0
- data/app/helpers/tool_buttons_helper.rb +74 -0
- data/app/helpers/unicode_helper.rb +9 -0
- data/app/helpers/users_helper.rb +13 -0
- data/app/helpers/vertical_nav_helper.rb +84 -0
- data/app/helpers/workflows_helper.rb +37 -0
- data/app/mailers/event_mailer.rb +13 -0
- data/app/mailers/post_mailer.rb +11 -0
- data/app/mailers/user_account_mailer.rb +17 -0
- data/app/models/ability.rb +321 -0
- data/app/models/active_record_associations_patches.rb +26 -0
- data/app/models/active_record_cache_extension.rb +152 -0
- data/app/models/active_record_find_by_extension.rb +20 -0
- data/app/models/active_record_json_url_extension.rb +51 -0
- data/app/models/active_record_metric_events_extension.rb +22 -0
- data/app/models/active_record_read_only_extension.rb +35 -0
- data/app/models/active_record_update_attributes_bip_extension.rb +24 -0
- data/app/models/address_label.rb +50 -0
- data/app/models/app_version.rb +49 -0
- data/app/models/array.rb +15 -0
- data/app/models/attachment.rb +76 -0
- data/app/models/bashpass_password.rb +32 -0
- data/app/models/blog_post.rb +2 -0
- data/app/models/bookmark.rb +67 -0
- data/app/models/cache_additions.rb +15 -0
- data/app/models/cache_store_extension.rb +78 -0
- data/app/models/concerns/user_avatar.rb +16 -0
- data/app/models/concerns/user_corporations.rb +44 -0
- data/app/models/concerns/user_date_of_birth.rb +74 -0
- data/app/models/concerns/user_profile.rb +102 -0
- data/app/models/corporation.rb +80 -0
- data/app/models/dag_link.rb +29 -0
- data/app/models/event.rb +235 -0
- data/app/models/flag.rb +18 -0
- data/app/models/flagable.rb +62 -0
- data/app/models/geo_location.rb +92 -0
- data/app/models/group.rb +224 -0
- data/app/models/group_mixins/corporations.rb +141 -0
- data/app/models/group_mixins/developers.rb +41 -0
- data/app/models/group_mixins/everyone.rb +72 -0
- data/app/models/group_mixins/guests.rb +61 -0
- data/app/models/group_mixins/hidden_users.rb +43 -0
- data/app/models/group_mixins/import.rb +321 -0
- data/app/models/group_mixins/memberships.rb +207 -0
- data/app/models/group_mixins/officers.rb +47 -0
- data/app/models/group_mixins/roles.rb +41 -0
- data/app/models/horizontal_nav.rb +32 -0
- data/app/models/last_seen_activity.rb +10 -0
- data/app/models/list_export.rb +359 -0
- data/app/models/may_need_review.rb +54 -0
- data/app/models/metric_logger.rb +83 -0
- data/app/models/nav_node.rb +169 -0
- data/app/models/navable.rb +46 -0
- data/app/models/object_to_b_extension.rb +12 -0
- data/app/models/page.rb +212 -0
- data/app/models/password.rb +28 -0
- data/app/models/post.rb +199 -0
- data/app/models/profile.rb +36 -0
- data/app/models/profile_field.rb +196 -0
- data/app/models/profile_field_mixins/has_child_profile_fields.rb +114 -0
- data/app/models/profile_field_types/about.rb +9 -0
- data/app/models/profile_field_types/academic_degree.rb +10 -0
- data/app/models/profile_field_types/address.rb +88 -0
- data/app/models/profile_field_types/bank_account.rb +12 -0
- data/app/models/profile_field_types/competence.rb +7 -0
- data/app/models/profile_field_types/custom.rb +12 -0
- data/app/models/profile_field_types/date.rb +14 -0
- data/app/models/profile_field_types/description.rb +15 -0
- data/app/models/profile_field_types/email.rb +20 -0
- data/app/models/profile_field_types/employment.rb +24 -0
- data/app/models/profile_field_types/general.rb +9 -0
- data/app/models/profile_field_types/homepage.rb +19 -0
- data/app/models/profile_field_types/name_surrounding.rb +11 -0
- data/app/models/profile_field_types/organization.rb +24 -0
- data/app/models/profile_field_types/phone.rb +37 -0
- data/app/models/profile_field_types/professional_category.rb +8 -0
- data/app/models/profile_field_types/study.rb +18 -0
- data/app/models/profile_section.rb +49 -0
- data/app/models/profileable.rb +58 -0
- data/app/models/profileable_mixins/address.rb +118 -0
- data/app/models/relationship.rb +78 -0
- data/app/models/role.rb +164 -0
- data/app/models/setting.rb +9 -0
- data/app/models/status_group.rb +28 -0
- data/app/models/status_group_membership.rb +189 -0
- data/app/models/status_group_membership_info.rb +54 -0
- data/app/models/structureable.rb +164 -0
- data/app/models/structureable_mixins/has_special_groups.rb +127 -0
- data/app/models/structureable_mixins/roles.rb +275 -0
- data/app/models/user.rb +878 -0
- data/app/models/user_account.rb +162 -0
- data/app/models/user_alias.rb +112 -0
- data/app/models/user_group_membership.rb +300 -0
- data/app/models/user_group_membership_mixins/validity_range.rb +206 -0
- data/app/models/user_group_membership_mixins/validity_range_for_indirect_memberships.rb +160 -0
- data/app/models/user_mixins/identification.rb +36 -0
- data/app/models/user_mixins/memberships.rb +75 -0
- data/app/models/workflow.rb +40 -0
- data/app/models/workflow_kit/add_to_group_brick.rb +21 -0
- data/app/models/workflow_kit/destroy_account_and_end_memberships_if_needed_brick.rb +19 -0
- data/app/models/workflow_kit/last_membership_needs_review_brick.rb +19 -0
- data/app/models/workflow_kit/mark_as_deceased_brick.rb +17 -0
- data/app/models/workflow_kit/remove_from_group_brick.rb +27 -0
- data/app/models/workflow_kit/test_brick.rb +13 -0
- data/app/pdfs/address_labels_pdf.rb +157 -0
- data/app/presenters/base_presenter.rb +52 -0
- data/app/presenters/horizontal_nav_presenter.rb +106 -0
- data/app/uploaders/attachment_uploader.rb +148 -0
- data/app/views/activities/index.html.haml +25 -0
- data/app/views/attachments/_attachment.html.haml +20 -0
- data/app/views/attachments/_description.html.haml +11 -0
- data/app/views/attachments/_documents.html.haml +17 -0
- data/app/views/attachments/_drop_field.html.haml +46 -0
- data/app/views/attachments/_picture.html.haml +2 -0
- data/app/views/attachments/_pictures.html.haml +10 -0
- data/app/views/attachments/_video.html.haml +8 -0
- data/app/views/attachments/create.js.erb +1 -0
- data/app/views/attachments/destroy.js.erb +1 -0
- data/app/views/blog_posts/create.js.erb +17 -0
- data/app/views/bookmarks/_list.html.haml +7 -0
- data/app/views/bookmarks/update.js.erb +4 -0
- data/app/views/devise/mailer/reset_password_instructions.html.haml +8 -0
- data/app/views/devise/passwords/edit.html.haml +1 -0
- data/app/views/devise/passwords/new.html.haml +12 -0
- data/app/views/devise/registrations/edit.html.haml +1 -0
- data/app/views/devise/sessions/new.html.haml +14 -0
- data/app/views/devise/shared/_links.haml +26 -0
- data/app/views/errors/show.html.haml +5 -0
- data/app/views/errors/unauthorized.html.haml +7 -0
- data/app/views/event_mailer/invitation_email.html.erb +63 -0
- data/app/views/events/_event_details.html.haml +54 -0
- data/app/views/events/_events_lis.html.haml +29 -0
- data/app/views/events/_invitation_text.html.erb +8 -0
- data/app/views/events/_pictures.html.haml +5 -0
- data/app/views/events/_public_index.html.haml +16 -0
- data/app/views/events/index.html.haml +24 -0
- data/app/views/events/show.html.haml +50 -0
- data/app/views/groups/_address_labels_modal.html.haml +27 -0
- data/app/views/groups/_export_button.html.haml +66 -0
- data/app/views/groups/_group_list.html.haml +25 -0
- data/app/views/groups/_member_avatars.html.haml +4 -0
- data/app/views/groups/_member_list.html.haml +15 -0
- data/app/views/groups/index.html.erb +11 -0
- data/app/views/groups/index_mine.html.haml +7 -0
- data/app/views/groups/show.html.haml +79 -0
- data/app/views/last_seen_activities/_index.html.haml +19 -0
- data/app/views/layouts/_add_structureable_additions.html.haml +15 -0
- data/app/views/layouts/_box.html.haml +16 -0
- data/app/views/layouts/_help_button.html.haml +1 -0
- data/app/views/layouts/_role_preview_switcher.html.haml +20 -0
- data/app/views/layouts/_session_bar_avatar.html.haml +1 -0
- data/app/views/layouts/_vertical_nav.html.haml +5 -0
- data/app/views/layouts/bootstrap.html.haml +146 -0
- data/app/views/layouts/mercury.html.erb +23 -0
- data/app/views/officers/_history_notice.html.haml +4 -0
- data/app/views/officers/_officers_box.html.haml +33 -0
- data/app/views/officers/_officers_group_entry.html.haml +45 -0
- data/app/views/pages/_attachments.html.haml +21 -0
- data/app/views/pages/_page.html.haml +28 -0
- data/app/views/pages/_pictures.html.haml +2 -0
- data/app/views/pages/_videos.html.erb +8 -0
- data/app/views/pages/show.html.haml +39 -0
- data/app/views/post_mailer/post_email.html.erb +17 -0
- data/app/views/posts/_new_post_template_text.html.haml +6 -0
- data/app/views/posts/_post.html.haml +13 -0
- data/app/views/posts/_post_quote.html.haml +18 -0
- data/app/views/posts/_posts.html.haml +6 -0
- data/app/views/posts/index.html.haml +9 -0
- data/app/views/posts/new.html.haml +42 -0
- data/app/views/posts/show.html.haml +8 -0
- data/app/views/profile_fields/_postal_address_flag_switch.html.haml +21 -0
- data/app/views/profile_fields/_profile_field.html.haml +41 -0
- data/app/views/profile_fields/create.js.erb +26 -0
- data/app/views/profile_fields/destroy.js.erb +3 -0
- data/app/views/profiles/_add_profile_field_button.html.haml +15 -0
- data/app/views/profiles/_profile_section_ul.html.haml +8 -0
- data/app/views/profiles/_section.html.haml +28 -0
- data/app/views/profiles/_send_group_message_button.html.haml +4 -0
- data/app/views/root/_latest_members_box.html.haml +19 -0
- data/app/views/root/_start_page_elements.html.haml +0 -0
- data/app/views/root/_what_is_new.html.haml +21 -0
- data/app/views/search/_preview_blog_post.html.haml +1 -0
- data/app/views/search/_preview_corporation.html.haml +5 -0
- data/app/views/search/_preview_group.html.haml +4 -0
- data/app/views/search/_preview_page.html.haml +11 -0
- data/app/views/search/_preview_user.html.haml +14 -0
- data/app/views/search/index.html.haml +42 -0
- data/app/views/setup/index.html.haml +56 -0
- data/app/views/shared/_add_structureable.html.haml +22 -0
- data/app/views/shared/_authorization_info.html.haml +22 -0
- data/app/views/shared/_flags.html.haml +5 -0
- data/app/views/shared/_markdown_help.html.haml +4 -0
- data/app/views/shared/_search_box.html.haml +2 -0
- data/app/views/shared/_upcoming_events.html.haml +33 -0
- data/app/views/statistics/index.html.haml +16 -0
- data/app/views/statistics/show.html.haml +13 -0
- data/app/views/terms_of_use/_checkbox.html.haml +1 -0
- data/app/views/terms_of_use/_terms.html.haml +1 -0
- data/app/views/terms_of_use/index.html.haml +19 -0
- data/app/views/user_account_mailer/welcome_email.html.erb +32 -0
- data/app/views/user_accounts/_change_password.html.haml +149 -0
- data/app/views/user_accounts/_user_account.html.haml +39 -0
- data/app/views/user_group_memberships/_list_item.html.haml +9 -0
- data/app/views/user_group_memberships/_memberships_table.html.haml +56 -0
- data/app/views/user_group_memberships/_new.html.haml +18 -0
- data/app/views/user_group_memberships/create.js.erb +9 -0
- data/app/views/user_group_memberships/index.html.haml +5 -0
- data/app/views/user_settings/show.html.haml +36 -0
- data/app/views/users/_avatar.html.haml +16 -0
- data/app/views/users/_communication_box.html.haml +8 -0
- data/app/views/users/_corporate_vita.html.haml +23 -0
- data/app/views/users/_dead_badge.html.haml +3 -0
- data/app/views/users/_deceased_modal.html.haml +24 -0
- data/app/views/users/_hidden_badge.html.haml +4 -0
- data/app/views/users/_hidden_flag_switch.html.haml +20 -0
- data/app/views/users/_special_general_info_fields.html.haml +10 -0
- data/app/views/users/_user_corporation_attribute.html.haml +6 -0
- data/app/views/users/_user_name_attribute.html.haml +4 -0
- data/app/views/users/_user_title.html.haml +5 -0
- data/app/views/users/_workflow_triggers.html.haml +23 -0
- data/app/views/users/new.html.haml +55 -0
- data/app/views/users/show.html.haml +79 -0
- data/config/environment.rb +5 -0
- data/config/initializers/active_record_cache_extension.rb +1 -0
- data/config/initializers/active_record_find_by_extension.rb +1 -0
- data/config/initializers/active_record_flagable_extension.rb +2 -0
- data/config/initializers/active_record_json_url_extension.rb +1 -0
- data/config/initializers/active_record_may_need_review_extension.rb +2 -0
- data/config/initializers/active_record_metric_events_extension.rb +1 -0
- data/config/initializers/active_record_navable_extension.rb +6 -0
- data/config/initializers/active_record_profileable_extension.rb +4 -0
- data/config/initializers/active_record_read_only_extension.rb +1 -0
- data/config/initializers/active_record_structureable_extension.rb +3 -0
- data/config/initializers/active_record_update_attributes_bip_extension.rb +1 -0
- data/config/initializers/array_extension.rb +1 -0
- data/config/initializers/best_in_place_display_definitions.rb +31 -0
- data/config/initializers/cache_store_extension.rb +1 -0
- data/config/initializers/devise.rb +240 -0
- data/config/initializers/fnordmetric.rb +14 -0
- data/config/initializers/formtastic.rb +76 -0
- data/config/initializers/group_type_column_patches.rb +11 -0
- data/config/initializers/mime_types.rb +1 -0
- data/config/initializers/mini_profiler.rb +32 -0
- data/config/initializers/object_to_b_extension.rb +1 -0
- data/config/initializers/refile.rb +22 -0
- data/config/initializers/sidekiq.rb +12 -0
- data/config/locales/attachments/de.yml +33 -0
- data/config/locales/bookmarks/de.yml +3 -0
- data/config/locales/bookmarks/en.yml +3 -0
- data/config/locales/common_expressions/de.yml +5 -0
- data/config/locales/common_expressions/en.yml +5 -0
- data/config/locales/companies/de.yml +4 -0
- data/config/locales/companies/en.yml +4 -0
- data/config/locales/de.yml +30 -0
- data/config/locales/devise/de.yml +60 -0
- data/config/locales/devise/en.yml +62 -0
- data/config/locales/en.yml +25 -0
- data/config/locales/events/de.yml +34 -0
- data/config/locales/events/en.yml +34 -0
- data/config/locales/forms/de.yml +3 -0
- data/config/locales/groups/de.yml +56 -0
- data/config/locales/groups/en.yml +47 -0
- data/config/locales/officers/de.yml +10 -0
- data/config/locales/pages/de.yml +15 -0
- data/config/locales/pages/en.yml +14 -0
- data/config/locales/pagination/de.yml +6 -0
- data/config/locales/pagination/en.yml +5 -0
- data/config/locales/password_strength/de.yml +9 -0
- data/config/locales/password_strength/en.yml +9 -0
- data/config/locales/posts/de.yml +9 -0
- data/config/locales/profile_fields/de.yml +78 -0
- data/config/locales/profile_fields/en.yml +22 -0
- data/config/locales/profiles/de.yml +47 -0
- data/config/locales/profiles/en.yml +44 -0
- data/config/locales/roles/de.yml +9 -0
- data/config/locales/root/de.yml +3 -0
- data/config/locales/root/en.yml +3 -0
- data/config/locales/search/de.yml +11 -0
- data/config/locales/search/en.yml +11 -0
- data/config/locales/sessions/de.yml +37 -0
- data/config/locales/sessions/en.yml +37 -0
- data/config/locales/setup/de.yml +26 -0
- data/config/locales/setup/en.yml +26 -0
- data/config/locales/statistics/de.yml +6 -0
- data/config/locales/terms_of_use/de.yml +6 -0
- data/config/locales/tools/de.yml +9 -0
- data/config/locales/tools/en.yml +9 -0
- data/config/locales/user_accounts/de.yml +16 -0
- data/config/locales/user_accounts/en.yml +13 -0
- data/config/locales/user_settings/de.yml +9 -0
- data/config/locales/users/de.yml +82 -0
- data/config/locales/users/en.yml +51 -0
- data/config/locales/workflows/de.yml +4 -0
- data/config/locales/workflows/en.yml +4 -0
- data/config/routes.rb +104 -0
- data/db/migrate/20120403002734_create_users.rb +12 -0
- data/db/migrate/20120403011601_create_profile_fields.rb +11 -0
- data/db/migrate/20120403161549_remove_user_email_column.rb +5 -0
- data/db/migrate/20120405222050_encrypt_password.rb +8 -0
- data/db/migrate/20120425161138_create_dag_links.rb +14 -0
- data/db/migrate/20120425162644_create_pages.rb +10 -0
- data/db/migrate/20120426023322_create_groups.rb +9 -0
- data/db/migrate/20120426090436_create_nav_nodes.rb +18 -0
- data/db/migrate/20120427021934_create_user_accounts.rb +12 -0
- data/db/migrate/20120427044338_add_foreign_key_to_user_accounts.rb +7 -0
- data/db/migrate/20120427150156_add_group_token.rb +8 -0
- data/db/migrate/20120507165551_make_profile_fields_polymorphic.rb +11 -0
- data/db/migrate/20120508130729_add_profile_field_acts_as_tree.rb +9 -0
- data/db/migrate/20120508152233_change_profile_field_value_to_text.rb +9 -0
- data/db/migrate/20120508201550_add_group_internal_token.rb +11 -0
- data/db/migrate/20120511090234_create_workflows.rb +9 -0
- data/db/migrate/20120701115059_add_password_digest_to_user_accounts.rb +5 -0
- data/db/migrate/20120710193308_remove_salt_from_user_accounts.rb +5 -0
- data/db/migrate/20120713102445_add_deleted_at_to_dag_links.rb +5 -0
- data/db/migrate/20120722005022_create_workflow_kit_workflows.workflow_kit.rb +11 -0
- data/db/migrate/20120722005023_create_workflow_kit_steps.workflow_kit.rb +12 -0
- data/db/migrate/20120722005024_create_workflow_kit_parameters.workflow_kit.rb +12 -0
- data/db/migrate/20120723165226_add_female_to_users.rb +5 -0
- data/db/migrate/20120811140509_create_flags.rb +11 -0
- data/db/migrate/20120814100529_create_attachments.rb +13 -0
- data/db/migrate/20120815205610_add_content_type_and_file_size_to_attachments.rb +6 -0
- data/db/migrate/20130118220014_add_relationships_table_without_dag.rb +10 -0
- data/db/migrate/20130207214331_create_events.rb +12 -0
- data/db/migrate/20130208215253_create_status_group_membership_infos.rb +11 -0
- data/db/migrate/20130220184943_create_stars.rb +11 -0
- data/db/migrate/20130309193623_add_devise_to_user_accounts.rb +72 -0
- data/db/migrate/20130310003840_rename_stars_to_bookmarks.rb +9 -0
- data/db/migrate/20130310004622_fix_column_names_for_bookmarks.rb +6 -0
- data/db/migrate/20130313211414_create_geo_infos.rb +13 -0
- data/db/migrate/20130313234131_create_geo_locations.rb +16 -0
- data/db/migrate/20130314011638_drop_geo_infos.rb +5 -0
- data/db/migrate/20130315072759_add_invalid_to_geo_location.rb +5 -0
- data/db/migrate/20130315073149_exchange_invalid_for_queried_at_in_geo_location.rb +8 -0
- data/db/migrate/20130320003051_add_redirect_to_to_page.rb +5 -0
- data/db/migrate/20130329231657_create_posts.rb +15 -0
- data/db/migrate/20130404223735_add_entire_message_to_posts.rb +5 -0
- data/db/migrate/20130409192959_add_author_to_page.rb +5 -0
- data/db/migrate/20130908011215_add_type_to_pages.rb +5 -0
- data/db/migrate/20131115114715_validity_range_for_dag_links.rb +16 -0
- data/db/migrate/20140611170430_create_activities.rb +23 -0
- data/db/migrate/20140808223512_create_last_seen_activities.rb +12 -0
- data/db/migrate/20141008101744_add_location_to_events.rb +5 -0
- data/db/migrate/20141010130344_add_publish_on_website_to_events.rb +6 -0
- data/db/migrate/20141010134227_add_auth_token_to_user_accounts.rb +5 -0
- data/db/migrate/20141018143323_add_accepted_terms_to_users.rb +6 -0
- data/db/migrate/20141018221659_add_author_to_attachments.rb +5 -0
- data/db/migrate/20141102223954_add_body_to_groups.rb +5 -0
- data/db/migrate/20141110193830_create_settings.rb +17 -0
- data/db/migrate/20141202140522_add_indices.rb +6 -0
- data/db/migrate/20141209161946_add_keys.rb +20 -0
- data/db/migrate/20150127013809_add_incognito_to_users.rb +5 -0
- data/db/migrate/20150129194501_add_indices_for_polymorphic_references.rb +13 -0
- data/db/migrate/20150304192448_add_type_to_groups.rb +5 -0
- data/db/migrate/20150313221004_add_avatar_id_to_users.rb +5 -0
- data/lib/best_in_place/controller_extensions.rb +25 -0
- data/lib/best_in_place/helper.rb +127 -0
- data/lib/tasks/db_bootstrap.rake +37 -0
- data/lib/tasks/your_platform_tasks.rake +4 -0
- data/lib/templates/erb/scaffold/_form.html.erb +11 -0
- data/lib/your_platform.rb +6 -2
- data/lib/your_platform/engine.rb +127 -0
- data/lib/your_platform/version.rb +1 -1
- data/spec/factories/attachment.rb +12 -0
- data/spec/factories/blog_post.rb +10 -0
- data/spec/factories/company.rb +7 -0
- data/spec/factories/corporation.rb +20 -0
- data/spec/factories/event.rb +13 -0
- data/spec/factories/group.rb +36 -0
- data/spec/factories/html_email.eml +1059 -0
- data/spec/factories/mail_message.rb +30 -0
- data/spec/factories/page.rb +10 -0
- data/spec/factories/relationship.rb +13 -0
- data/spec/factories/status_group_membership.rb +21 -0
- data/spec/factories/user.rb +97 -0
- data/spec/factories/workflow.rb +44 -0
- data/spec/features/blog_post_spec.rb +46 -0
- data/spec/features/corporate_vita_events_spec.rb +114 -0
- data/spec/features/corporate_vita_spec.rb +258 -0
- data/spec/features/edit_mode_after_clicking_a_link_spec.rb +20 -0
- data/spec/features/events_spec.rb +356 -0
- data/spec/features/group_export_spec.rb +19 -0
- data/spec/features/group_post_spec.rb +89 -0
- data/spec/features/groups_of_groups_page_spec.rb +67 -0
- data/spec/features/groups_page_spec.rb +66 -0
- data/spec/features/groups_table_spec.rb +32 -0
- data/spec/features/help_page_spec.rb +22 -0
- data/spec/features/intranet_root_page_spec.rb +18 -0
- data/spec/features/locales_spec.rb +36 -0
- data/spec/features/maps_spec.rb +53 -0
- data/spec/features/mini_profiler_spec.rb +37 -0
- data/spec/features/officers_spec.rb +61 -0
- data/spec/features/page_redirects_spec.rb +23 -0
- data/spec/features/page_spec.rb +20 -0
- data/spec/features/postal_address_flag_spec.rb +46 -0
- data/spec/features/relationships_on_user_page_spec.rb +78 -0
- data/spec/features/review_membership_spec.rb +44 -0
- data/spec/features/search_field_spec.rb +121 -0
- data/spec/features/setup_spec.rb +63 -0
- data/spec/features/user_change_date_of_birth_spec.rb +26 -0
- data/spec/features/vertical_nav_spec.rb +27 -0
- data/spec/features/what_is_new_box_spec.rb +33 -0
- data/spec/helpers/attachments_helper_spec.rb +15 -0
- data/spec/models/ability_spec.rb +93 -0
- data/spec/models/active_record_cache_extension_spec.rb +177 -0
- data/spec/models/active_record_find_by_extension_spec.rb +26 -0
- data/spec/models/active_record_json_url_extension_spec.rb +79 -0
- data/spec/models/address_label_spec.rb +144 -0
- data/spec/models/app_version_spec.rb +38 -0
- data/spec/models/attachment_spec.rb +5 -0
- data/spec/models/bookmark_spec.rb +70 -0
- data/spec/models/concerns/user_corporations_spec.rb +71 -0
- data/spec/models/corporation_spec.rb +128 -0
- data/spec/models/dag_link_spec.rb +48 -0
- data/spec/models/event_spec.rb +267 -0
- data/spec/models/flag_spec.rb +20 -0
- data/spec/models/flagable_spec.rb +55 -0
- data/spec/models/geo_location_spec.rb +126 -0
- data/spec/models/group_mixins/corporations_spec.rb +95 -0
- data/spec/models/group_mixins/everyone_spec.rb +64 -0
- data/spec/models/group_mixins/guests_spec.rb +75 -0
- data/spec/models/group_mixins/hidden_users_spec.rb +21 -0
- data/spec/models/group_mixins/import_spec.rb +93 -0
- data/spec/models/group_mixins/memberships_spec.rb +303 -0
- data/spec/models/group_mixins/officers_spec.rb +63 -0
- data/spec/models/group_mixins/roles_spec.rb +46 -0
- data/spec/models/group_spec.rb +341 -0
- data/spec/models/list_export_spec.rb +155 -0
- data/spec/models/may_need_review_spec.rb +114 -0
- data/spec/models/nav_node_spec.rb +277 -0
- data/spec/models/navable_spec.rb +54 -0
- data/spec/models/page_spec.rb +185 -0
- data/spec/models/post_spec.rb +271 -0
- data/spec/models/profile_field_mixins/has_child_profile_fields_spec.rb +73 -0
- data/spec/models/profile_field_spec.rb +482 -0
- data/spec/models/profile_section_spec.rb +89 -0
- data/spec/models/profile_spec.rb +74 -0
- data/spec/models/profileable_mixins/adress_spec.rb +93 -0
- data/spec/models/profileable_spec.rb +152 -0
- data/spec/models/relationship_spec.rb +113 -0
- data/spec/models/status_group_membership_spec.rb +350 -0
- data/spec/models/status_group_spec.rb +103 -0
- data/spec/models/structureable_mixins/has_special_groups_spec.rb +479 -0
- data/spec/models/structureable_mixins/roles_spec.rb +517 -0
- data/spec/models/structureable_spec.rb +128 -0
- data/spec/models/user_account_spec.rb +142 -0
- data/spec/models/user_alias_spec.rb +57 -0
- data/spec/models/user_group_membership_mixins/validity_range_for_indirect_memberships_spec.rb +291 -0
- data/spec/models/user_group_membership_mixins/validity_range_spec.rb +293 -0
- data/spec/models/user_group_membership_spec.rb +428 -0
- data/spec/models/user_mixins/identification_spec.rb +27 -0
- data/spec/models/user_mixins/memberships_spec.rb +138 -0
- data/spec/models/user_spec.rb +1794 -0
- data/spec/old_yp_spec_helper.rb +46 -0
- data/spec/spec_helper.rb +350 -0
- data/spec/support/auto_complete.rb +22 -0
- data/spec/support/capybara/flash_helpers.rb +37 -0
- data/spec/support/capybara/profile_steps.rb +73 -0
- data/spec/support/capybara/session_steps.rb +53 -0
- data/spec/support/capybara/user_account_helpers.rb +15 -0
- data/spec/support/debug.rb +8 -0
- data/spec/support/devise-controller_macros.rb +15 -0
- data/spec/support/geocoder/stubs.rb +60 -0
- data/spec/support/press_enter.rb +15 -0
- data/spec/support/time_travel.rb +9 -0
- data/spec/support/uploads/image-upload.png +0 -0
- data/spec/support/uploads/pdf-upload.pdf +0 -0
- data/spec/support/wait_for_ajax.rb +39 -0
- data/spec/support/wait_for_cache.rb +7 -0
- data/spec/uploaders/attachment_uploader_spec.rb +47 -0
- data/vendor/assets/images/flags.png +0 -0
- data/vendor/assets/images/galleria/classic-loader.gif +0 -0
- data/vendor/assets/images/galleria/classic-map.png +0 -0
- data/vendor/assets/javascripts/best_in_place_datetime.js.coffee +45 -0
- data/vendor/assets/javascripts/galleria-classic.js +100 -0
- data/vendor/assets/javascripts/galleria.js +6919 -0
- data/vendor/assets/javascripts/gmaps4rails.js +2 -0
- data/vendor/assets/javascripts/gmaps4rails/all.js +1 -0
- data/vendor/assets/javascripts/gmaps4rails/base.coffee +1 -0
- data/vendor/assets/javascripts/gmaps4rails/base/common.coffee +43 -0
- data/vendor/assets/javascripts/gmaps4rails/base/configuration.coffee +7 -0
- data/vendor/assets/javascripts/gmaps4rails/base/gmaps.coffee +13 -0
- data/vendor/assets/javascripts/gmaps4rails/base/interfaces/basic_interface.coffee +15 -0
- data/vendor/assets/javascripts/gmaps4rails/base/interfaces/controller_interface.coffee +15 -0
- data/vendor/assets/javascripts/gmaps4rails/base/interfaces/map_interface.coffee +27 -0
- data/vendor/assets/javascripts/gmaps4rails/base/interfaces/marker_interface.coffee +15 -0
- data/vendor/assets/javascripts/gmaps4rails/base/main.coffee +124 -0
- data/vendor/assets/javascripts/gmaps4rails/base/main_controller_extensions/circle_controller.coffee +29 -0
- data/vendor/assets/javascripts/gmaps4rails/base/main_controller_extensions/kml_controller.coffee +5 -0
- data/vendor/assets/javascripts/gmaps4rails/base/main_controller_extensions/marker_controller.coffee +76 -0
- data/vendor/assets/javascripts/gmaps4rails/base/main_controller_extensions/polygon_controller.coffee +29 -0
- data/vendor/assets/javascripts/gmaps4rails/base/main_controller_extensions/polyline_controller.coffee +29 -0
- data/vendor/assets/javascripts/gmaps4rails/base/objects/circle.coffee +12 -0
- data/vendor/assets/javascripts/gmaps4rails/base/objects/kml.coffee +8 -0
- data/vendor/assets/javascripts/gmaps4rails/base/objects/map.coffee +62 -0
- data/vendor/assets/javascripts/gmaps4rails/base/objects/marker.coffee +24 -0
- data/vendor/assets/javascripts/gmaps4rails/base/objects/polygon.coffee +11 -0
- data/vendor/assets/javascripts/gmaps4rails/base/objects/polyline.coffee +11 -0
- data/vendor/assets/javascripts/gmaps4rails/bing.coffee +1 -0
- data/vendor/assets/javascripts/gmaps4rails/bing/main.coffee +29 -0
- data/vendor/assets/javascripts/gmaps4rails/bing/objects/map.coffee +63 -0
- data/vendor/assets/javascripts/gmaps4rails/bing/objects/marker.coffee +78 -0
- data/vendor/assets/javascripts/gmaps4rails/bing/shared.coffee +20 -0
- data/vendor/assets/javascripts/gmaps4rails/google.coffee +1 -0
- data/vendor/assets/javascripts/gmaps4rails/google/main.coffee +47 -0
- data/vendor/assets/javascripts/gmaps4rails/google/objects/circle.coffee +38 -0
- data/vendor/assets/javascripts/gmaps4rails/google/objects/kml.coffee +16 -0
- data/vendor/assets/javascripts/gmaps4rails/google/objects/map.coffee +71 -0
- data/vendor/assets/javascripts/gmaps4rails/google/objects/marker.coffee +114 -0
- data/vendor/assets/javascripts/gmaps4rails/google/objects/polygon.coffee +38 -0
- data/vendor/assets/javascripts/gmaps4rails/google/objects/polyline.coffee +49 -0
- data/vendor/assets/javascripts/gmaps4rails/google/shared.coffee +27 -0
- data/vendor/assets/javascripts/gmaps4rails/openlayers.coffee +1 -0
- data/vendor/assets/javascripts/gmaps4rails/openlayers/main.coffee +138 -0
- data/vendor/assets/javascripts/gmaps4rails/openlayers/objects/map.coffee +49 -0
- data/vendor/assets/javascripts/gmaps4rails/openlayers/objects/marker.coffee +68 -0
- data/vendor/assets/javascripts/gmaps4rails/openlayers/objects/polyline.coffee +39 -0
- data/vendor/assets/javascripts/gmaps4rails/openlayers/shared.coffee +19 -0
- data/vendor/assets/javascripts/jquery-ui-timepicker-addon.js +2223 -0
- data/vendor/assets/javascripts/jquery-ui-timepicker-de.js +26 -0
- data/vendor/assets/javascripts/jquery.ui.datepicker-de.js +23 -0
- data/vendor/assets/javascripts/password_strength.js +149 -0
- data/vendor/assets/javascripts/zxcvbn.js +43 -0
- data/vendor/assets/stylesheets/flags.css.scss +259 -0
- data/vendor/assets/stylesheets/galleria-classic.css.scss +239 -0
- data/vendor/assets/stylesheets/gmaps4rails.css +24 -0
- data/vendor/assets/stylesheets/mercury.css +24 -0
- data/vendor/scripts/bashpass/README.md +29 -0
- data/vendor/scripts/bashpass/bashpass +124 -0
- data/vendor/scripts/bashpass/bashpass-APACHE-LICENSE +201 -0
- data/vendor/scripts/bashpass/german.dic +40794 -0
- metadata +1540 -16
- data/.gitignore +0 -17
- data/Gemfile +0 -4
- data/LICENSE.txt +0 -4
- data/your_platform.gemspec +0 -19
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#
|
|
2
|
+
# A StatusGroup is a sub-Group of a Corporation that memberships model the
|
|
3
|
+
# current status of members within the corporation.
|
|
4
|
+
#
|
|
5
|
+
# At present time, the status of a user within a corporation is unique.
|
|
6
|
+
#
|
|
7
|
+
class StatusGroup < Group
|
|
8
|
+
|
|
9
|
+
def self.find_all_by_corporation(corporation)
|
|
10
|
+
corporation.leaf_groups.select do |group|
|
|
11
|
+
group.ancestor_events.count == 0
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.find_all_by_user(user, options = {})
|
|
16
|
+
user_groups = options[:with_invalid] ? user.parent_groups : user.direct_groups
|
|
17
|
+
user.corporations.collect do |corporation|
|
|
18
|
+
StatusGroup.find_all_by_corporation(corporation)
|
|
19
|
+
end.flatten & user_groups
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def self.find_by_user_and_corporation(user, corporation)
|
|
23
|
+
status_groups = (StatusGroup.find_all_by_corporation(corporation) & StatusGroup.find_all_by_user(user))
|
|
24
|
+
raise "Slection algorithm not unique, yet. Please correct this. Found possible status groups: #{status_groups.map(&:name).join(', ')}." if status_groups.count > 1
|
|
25
|
+
status_groups.last
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
#
|
|
3
|
+
# This class represents the membership of a user in a status group, i.e. a subgroup of a corporation
|
|
4
|
+
# representing a member status, e.g. the subgroup 'guests' or 'presidents'.
|
|
5
|
+
#
|
|
6
|
+
class StatusGroupMembership < UserGroupMembership
|
|
7
|
+
|
|
8
|
+
# Status Group Memberships do have more properties than regular memberships;
|
|
9
|
+
# those new properties are, e.g., shown in the corporate_vita.
|
|
10
|
+
# Since rails apparently does not support Multi Table Inheritance,
|
|
11
|
+
# this associated model takes the additional properties.
|
|
12
|
+
#
|
|
13
|
+
has_one :status_group_membership_info, foreign_key: 'membership_id', inverse_of: :membership #, autosave: true
|
|
14
|
+
|
|
15
|
+
delegate( :promoted_by_workflow, :promoted_by_workflow=,
|
|
16
|
+
:promoted_on_event, :promoted_on_event=,
|
|
17
|
+
:workflow, :workflow=,
|
|
18
|
+
:event, :event=, # alias methods
|
|
19
|
+
to: :find_or_create_status_group_membership_info )
|
|
20
|
+
|
|
21
|
+
attr_accessible :event_by_name
|
|
22
|
+
|
|
23
|
+
# Alias Methods For Delegated Methods
|
|
24
|
+
# ==========================================================================================
|
|
25
|
+
|
|
26
|
+
def create_event( params )
|
|
27
|
+
find_or_create_status_group_membership_info.create_promoted_on_event( params )
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Access the event (promoted_on_event) by its name, since this is the way
|
|
31
|
+
# most likely done by a user interface.
|
|
32
|
+
#
|
|
33
|
+
# If a new event is created, assign the corporation associated with this status group
|
|
34
|
+
# as the group of the event.
|
|
35
|
+
#
|
|
36
|
+
def event_by_name
|
|
37
|
+
self.event.name if self.event
|
|
38
|
+
end
|
|
39
|
+
def event_by_name=( event_name )
|
|
40
|
+
if event_name.present?
|
|
41
|
+
if Event.find_by_name( event_name )
|
|
42
|
+
self.event = Event.find_by_name( event_name )
|
|
43
|
+
else
|
|
44
|
+
self.create_event( name: event_name )
|
|
45
|
+
self.event.group ||= self.corporation if self.corporation
|
|
46
|
+
self.event.start_at = self.created_at
|
|
47
|
+
self.event.save
|
|
48
|
+
end
|
|
49
|
+
else
|
|
50
|
+
self.event = nil
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
# Creator
|
|
56
|
+
# ==========================================================================================
|
|
57
|
+
|
|
58
|
+
def self.create( params )
|
|
59
|
+
super( params ).becomes StatusGroupMembership
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
# Finder Methods
|
|
64
|
+
# ==========================================================================================
|
|
65
|
+
|
|
66
|
+
# Returns all memberships in status groups that belong to the given corporation.
|
|
67
|
+
#
|
|
68
|
+
# corporation A
|
|
69
|
+
# |------------- status group 1
|
|
70
|
+
# | |-------- user 1
|
|
71
|
+
# | |-------- user 2
|
|
72
|
+
# |------------- status group 2
|
|
73
|
+
# |-------- user 3
|
|
74
|
+
#
|
|
75
|
+
# The method therefore will return all memberships of subgroups of the corporation.
|
|
76
|
+
#
|
|
77
|
+
def self.find_all_by_corporation( corporation )
|
|
78
|
+
raise 'Expect parameter to be a Corporation' unless corporation.kind_of? Corporation
|
|
79
|
+
status_groups = corporation.status_groups
|
|
80
|
+
status_group_ids = status_groups.collect { |group| group.id }
|
|
81
|
+
links = self
|
|
82
|
+
.where(:descendant_type => "User")
|
|
83
|
+
.where(:ancestor_type => "Group")
|
|
84
|
+
.where(:ancestor_id => status_group_ids)
|
|
85
|
+
.order('valid_from')
|
|
86
|
+
return links
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Returns all memberships of the given user in status groups.
|
|
90
|
+
#
|
|
91
|
+
def self.find_all_by_user( user )
|
|
92
|
+
raise 'Expect parameter to be a User' unless user.kind_of? User
|
|
93
|
+
status_groups = user.status_groups(with_invalid: true)
|
|
94
|
+
status_group_ids = status_groups.collect { |group| group.id }
|
|
95
|
+
links = self
|
|
96
|
+
.where(:descendant_type => "User")
|
|
97
|
+
.where(:descendant_id => user.id)
|
|
98
|
+
.where(:ancestor_type => "Group")
|
|
99
|
+
.where(:ancestor_id => status_group_ids)
|
|
100
|
+
.order('valid_from')
|
|
101
|
+
return links
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# Returns all memberships of the given user in the given corporation.
|
|
105
|
+
#
|
|
106
|
+
def self.find_all_by_user_and_corporation( user, corporation )
|
|
107
|
+
raise 'Expect parameter to be a User' unless user.kind_of? User
|
|
108
|
+
status_groups = user.status_groups(with_invalid: true)
|
|
109
|
+
status_groups &= corporation.status_groups
|
|
110
|
+
status_group_ids = status_groups.collect { |group| group.id }
|
|
111
|
+
links = self
|
|
112
|
+
.where(:descendant_type => "User")
|
|
113
|
+
.where(:descendant_id => user.id)
|
|
114
|
+
.where(:ancestor_type => "Group")
|
|
115
|
+
.where(:ancestor_id => status_group_ids)
|
|
116
|
+
.order('valid_from')
|
|
117
|
+
return links
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# This method overrides the default finder method in order to make
|
|
121
|
+
# sure the returned object is of the StatusGroupMembership type.
|
|
122
|
+
#
|
|
123
|
+
def self.find_by_user_and_group( user, group )
|
|
124
|
+
self
|
|
125
|
+
.where(ancestor_id: group.id, ancestor_type: 'Group')
|
|
126
|
+
.where(descendant_id: user.id, descendant_type: 'User')
|
|
127
|
+
.limit(1)
|
|
128
|
+
.first
|
|
129
|
+
|
|
130
|
+
# The #becomes method won't work here.
|
|
131
|
+
#membership = super( user, group )
|
|
132
|
+
#membership ? StatusGroupMembership.with_invalid.find(membership.id) : nil
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
# Save Method
|
|
137
|
+
# ==========================================================================================
|
|
138
|
+
|
|
139
|
+
# Since several important attributes of this model are delegated, it is likely to change
|
|
140
|
+
# a delegated attribute without changing a direct attribute. For example:
|
|
141
|
+
#
|
|
142
|
+
# membership.workflow = some_workflow # workflow is delegated
|
|
143
|
+
# membership.changed? # => false
|
|
144
|
+
# membership.status_group_membership_info.changed? # => true
|
|
145
|
+
# membership.save
|
|
146
|
+
#
|
|
147
|
+
# The regular `save` method would fail, because there are `no changes` to the membership
|
|
148
|
+
# itself.
|
|
149
|
+
#
|
|
150
|
+
# To circumvent this, this save method first saves the delegate model if necessary and
|
|
151
|
+
# then calls the regular `save` method.
|
|
152
|
+
#
|
|
153
|
+
def save(*args)
|
|
154
|
+
save_status_group_membership_info_if_changed
|
|
155
|
+
if changed?
|
|
156
|
+
return super(*args)
|
|
157
|
+
else
|
|
158
|
+
return true
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def update_attributes( attributes, options = {} )
|
|
163
|
+
self.assign_attributes( attributes, options )
|
|
164
|
+
save
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
# Callback Methods for the Delegation to status_group_membership_info
|
|
169
|
+
# ==========================================================================================
|
|
170
|
+
|
|
171
|
+
private
|
|
172
|
+
|
|
173
|
+
def find_or_create_status_group_membership_info
|
|
174
|
+
status_group_membership_info || create_status_group_membership_info
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# When .save is called on this instance, but only the associated object has changed through
|
|
178
|
+
# the delegated methods, this instance is not marked as changed. As a result, any call of
|
|
179
|
+
# .save will fail.
|
|
180
|
+
#
|
|
181
|
+
# This method compensates for the missing automatism.
|
|
182
|
+
#
|
|
183
|
+
def save_status_group_membership_info_if_changed
|
|
184
|
+
find_or_create_status_group_membership_info.promoted_by_workflow.try(:save)
|
|
185
|
+
find_or_create_status_group_membership_info.promoted_on_event.try(:save)
|
|
186
|
+
find_or_create_status_group_membership_info.save
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
class StatusGroupMembershipInfo < ActiveRecord::Base
|
|
2
|
+
|
|
3
|
+
attr_accessible
|
|
4
|
+
|
|
5
|
+
belongs_to :membership, touch: true, class_name: "StatusGroupMembership", inverse_of: :status_group_membership_info
|
|
6
|
+
|
|
7
|
+
belongs_to :promoted_by_workflow, foreign_key: 'promoted_by_workflow_id', class_name: "Workflow"
|
|
8
|
+
belongs_to :promoted_on_event, foreign_key: 'promoted_on_event_id', class_name: "Event"
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# Alias Methods
|
|
12
|
+
# ==========================================================================================
|
|
13
|
+
|
|
14
|
+
# Promoted By Workflow
|
|
15
|
+
# ------------------------------------------------------------------------------------------
|
|
16
|
+
#
|
|
17
|
+
# Status Group Memberships can store the workflow that has promoted the user to this
|
|
18
|
+
# status. This is used, for example, in the corporate vita, since the title of the
|
|
19
|
+
# promotion workflow is to be shown there, rather than the title of the new status group.
|
|
20
|
+
#
|
|
21
|
+
# Example:
|
|
22
|
+
# membership.promoted_by_workflow = workflow # long form
|
|
23
|
+
# membership.workflow = workflow # short form
|
|
24
|
+
# membership.promoted_by_workflow.title # long form
|
|
25
|
+
# membership.workflow.title # short form
|
|
26
|
+
#
|
|
27
|
+
def workflow
|
|
28
|
+
self.promoted_by_workflow
|
|
29
|
+
end
|
|
30
|
+
def workflow=( workflow )
|
|
31
|
+
self.promoted_by_workflow = workflow
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Promoted On Event
|
|
35
|
+
# ------------------------------------------------------------------------------------------
|
|
36
|
+
#
|
|
37
|
+
# This stores the event on which the promotion took place that caused the user to be
|
|
38
|
+
# in this status group.
|
|
39
|
+
#
|
|
40
|
+
# Example:
|
|
41
|
+
# membership.promoted_on_event = event # long form
|
|
42
|
+
# membership.event = event # short form
|
|
43
|
+
# membership.promoted_on_event.name # long form
|
|
44
|
+
# membership.event.title # short form
|
|
45
|
+
#
|
|
46
|
+
def event
|
|
47
|
+
self.promoted_on_event
|
|
48
|
+
end
|
|
49
|
+
def event=( event )
|
|
50
|
+
self.promoted_on_event = event
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
end
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
# This module provides the ActiveRecord::Base extension `is_structureable`, which characterizes
|
|
4
|
+
# a model as part of the global dag_link structure in this project. All structureable objects
|
|
5
|
+
# are nodes of this dag link.
|
|
6
|
+
#
|
|
7
|
+
# Examples:
|
|
8
|
+
# @page1.parent_pages << @page2
|
|
9
|
+
# @page1.parents # => [ @page2, ... ]
|
|
10
|
+
#
|
|
11
|
+
# @group.child_users << @user
|
|
12
|
+
# @group.children # => [ @user, ... ]
|
|
13
|
+
# @user.parents # => [ @group, ... ]
|
|
14
|
+
#
|
|
15
|
+
# For all methods that are provided, please consult the documentations of the
|
|
16
|
+
# `acts-as-dag` gem and of the `acts_as_paranoid_dag` gem.
|
|
17
|
+
#
|
|
18
|
+
# This module is included in ActiveRecord::Base via an initializer at
|
|
19
|
+
# config/initializers/active_record_structureable_extension.rb
|
|
20
|
+
#
|
|
21
|
+
module Structureable
|
|
22
|
+
|
|
23
|
+
# options: ancestor_class_names, descendant_class_names
|
|
24
|
+
|
|
25
|
+
# This method is used to declare a model as structureable, i.e. part of the global
|
|
26
|
+
# dag link structure.
|
|
27
|
+
#
|
|
28
|
+
# Options:
|
|
29
|
+
# ancestor_class_names
|
|
30
|
+
# descendant_class_names
|
|
31
|
+
# link_class_name (default: 'DagLink')
|
|
32
|
+
#
|
|
33
|
+
# For detailed information on the options, please see the documentation of the
|
|
34
|
+
# `acts-as-dag` gem, since these options are forwarded to the has_dag_links method.
|
|
35
|
+
# http://rubydoc.info/github/resgraph/acts-as-dag/Dag#has_dag_links-instance_method
|
|
36
|
+
#
|
|
37
|
+
# Example:
|
|
38
|
+
# class Group < ActiveRecord::Base
|
|
39
|
+
# is_structureable ancestor_class_names: %w(Group), descendant_class_names: %w(Group User)
|
|
40
|
+
# end
|
|
41
|
+
# class User < ActiveRecord::Base
|
|
42
|
+
# is_structureable ancestor_class_names: %w(Group)
|
|
43
|
+
# end
|
|
44
|
+
#
|
|
45
|
+
def is_structureable( options = {} )
|
|
46
|
+
|
|
47
|
+
# default options
|
|
48
|
+
conf = {
|
|
49
|
+
:link_class_name => 'DagLink'
|
|
50
|
+
}
|
|
51
|
+
conf.update( options )
|
|
52
|
+
|
|
53
|
+
# the model is part of the dag link structure. see gem `acts-as-dag`
|
|
54
|
+
has_dag_links conf
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
before_destroy :destroy_links
|
|
58
|
+
|
|
59
|
+
# see Flagable model.
|
|
60
|
+
has_many_flags
|
|
61
|
+
|
|
62
|
+
# Structureable objects may have special_groups as descendants, e.g. the admins_parent group.
|
|
63
|
+
# This mixin loads the necessary methods to interact with them.
|
|
64
|
+
#
|
|
65
|
+
include StructureableMixins::HasSpecialGroups
|
|
66
|
+
|
|
67
|
+
# To use `prepend` here allows to call `super` in the methods
|
|
68
|
+
# defined in the module `StructureableInstanceMethods`.
|
|
69
|
+
#
|
|
70
|
+
prepend StructureableInstanceMethods
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
module StructureableInstanceMethods
|
|
74
|
+
|
|
75
|
+
# Include Rules, e.g. let this object have admins.
|
|
76
|
+
#
|
|
77
|
+
include StructureableMixins::Roles
|
|
78
|
+
|
|
79
|
+
# When a dag node is destroyed, also destroy the corresponding dag links.
|
|
80
|
+
# Otherwise, there would remain ghost dag links in the database that would
|
|
81
|
+
# corrupt the integrity of the database.
|
|
82
|
+
#
|
|
83
|
+
# If the database gets ever messed up like this, delete the concerning
|
|
84
|
+
# *direct* dag links by hand and then run this rake task to re-create
|
|
85
|
+
# the indirect dag links:
|
|
86
|
+
#
|
|
87
|
+
# rake reconstruct_indirect_dag_links:all
|
|
88
|
+
#
|
|
89
|
+
def destroy_dag_links
|
|
90
|
+
|
|
91
|
+
# destory only child and parent links, since the indirect links
|
|
92
|
+
# are destroyed automatically by the DagLink model then.
|
|
93
|
+
links = self.links_as_parent + self.links_as_child
|
|
94
|
+
|
|
95
|
+
for link in links do
|
|
96
|
+
|
|
97
|
+
if link.destroyable?
|
|
98
|
+
link.destroy
|
|
99
|
+
else
|
|
100
|
+
|
|
101
|
+
# In facty, all these links should be destroyable. If this error should
|
|
102
|
+
# be raised, something really went wrong. Please send in a bug report then
|
|
103
|
+
# at http://github.com/fiedl/your_platform.
|
|
104
|
+
raise "Could not destroy dag links of the structureable object that should be deleted." +
|
|
105
|
+
" Please send in a bug report at http://github.com/fiedl/your_platform."
|
|
106
|
+
return false
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# This somehow identifies which are the ancestors of this structureable.
|
|
113
|
+
# For example, this is used in the breadcrumb helper.
|
|
114
|
+
#
|
|
115
|
+
def ancestors_cache_key
|
|
116
|
+
"Group#{ancestor_group_ids if respond_to?(:ancestor_group_ids)}Page#{ancestor_page_ids if respond_to?(:ancestor_page_ids)}User#{ancestor_user_ids if respond_to?(:ancestor_user_ids)}"
|
|
117
|
+
end
|
|
118
|
+
def children_cache_key
|
|
119
|
+
"Group#{child_group_ids.sum if respond_to?(:child_group_ids)}Page#{child_page_ids.sum if respond_to?(:child_page_ids)}User#{child_user_ids.sum if respond_to?(:child_user_ids)}"
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def destroy_links
|
|
123
|
+
self.destroy_dag_links
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# Move the node to another parent.
|
|
127
|
+
#
|
|
128
|
+
def move_to(parent_node)
|
|
129
|
+
raise 'Case not handled, yet. This node has several parents. Not moving.' if self.parents.count > 1
|
|
130
|
+
if parent_node != self.parents.first
|
|
131
|
+
self.links_as_child.destroy_all
|
|
132
|
+
parent_node << self
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# Adding child objects.
|
|
137
|
+
#
|
|
138
|
+
def <<(object)
|
|
139
|
+
if object.kind_of? User
|
|
140
|
+
raise 'Users can only be assigned to groups.' unless self.kind_of? Group
|
|
141
|
+
self.assign_user(object) unless self.child_users.include? object
|
|
142
|
+
elsif object.kind_of? Group
|
|
143
|
+
if self.kind_of?(Group) &&
|
|
144
|
+
(existing_link = DagLink.where(ancestor_type: 'Group', descendant_type: 'Group',
|
|
145
|
+
ancestor_id: self.id, descendant_id: object.id,
|
|
146
|
+
direct: false).first)
|
|
147
|
+
existing_link.make_direct
|
|
148
|
+
else
|
|
149
|
+
self.child_groups << object unless self.child_groups.include? object
|
|
150
|
+
end
|
|
151
|
+
elsif object.kind_of? Page
|
|
152
|
+
self.child_pages << object unless self.child_pages.include? object
|
|
153
|
+
elsif object.kind_of? Event
|
|
154
|
+
self.child_events << object unless self.child_events.include? object
|
|
155
|
+
elsif object.nil?
|
|
156
|
+
raise "Something is wrong! You've tried to add nil."
|
|
157
|
+
else
|
|
158
|
+
raise "Case not handled yet. Please implement this. It's easy :)"
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
end
|
|
164
|
+
end
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
# This module extends the Structureable models by methods for the interaction with special_groups
|
|
4
|
+
# that are descendants of the structureable object.
|
|
5
|
+
#
|
|
6
|
+
# For example,
|
|
7
|
+
#
|
|
8
|
+
# class Page
|
|
9
|
+
# is_structureable ...
|
|
10
|
+
# ...
|
|
11
|
+
# end
|
|
12
|
+
#
|
|
13
|
+
# one would want to access the `officers_parent` group, which contains all officers of the
|
|
14
|
+
# structureable object.
|
|
15
|
+
#
|
|
16
|
+
# some_page.find_officers_parent_group
|
|
17
|
+
# some_page.create_officers_parent_group
|
|
18
|
+
# some_page.find_or_create_officers_parent_group
|
|
19
|
+
# some_page.officers_parent
|
|
20
|
+
# some_page.officers_parent!
|
|
21
|
+
# some_page.officers
|
|
22
|
+
# some_page.officers << some_users
|
|
23
|
+
#
|
|
24
|
+
# Or, globally, one would use this mechanism to define, let's say, global special groups
|
|
25
|
+
# like the group 'everyone', which contains each and every user.
|
|
26
|
+
#
|
|
27
|
+
# class Group
|
|
28
|
+
# is_structureable ...
|
|
29
|
+
# ...
|
|
30
|
+
# end
|
|
31
|
+
#
|
|
32
|
+
# Group.find_everyone_group
|
|
33
|
+
# Group.create_everyone_group
|
|
34
|
+
# Group.find_or_create_everyone_group
|
|
35
|
+
# Group.everyone
|
|
36
|
+
# Group.everyone!
|
|
37
|
+
#
|
|
38
|
+
# The `officers_parent` special group is actually defined in `StructureableMixins::Roles`,
|
|
39
|
+
# the `everyone` group in `GroupMixins::GlobalSpecialGroups`, whereas the helper methods that
|
|
40
|
+
# are used by those definitions are defined here in this mixin below.
|
|
41
|
+
#
|
|
42
|
+
module StructureableMixins::HasSpecialGroups
|
|
43
|
+
|
|
44
|
+
extend ActiveSupport::Concern
|
|
45
|
+
|
|
46
|
+
included do
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Global Special Groups
|
|
50
|
+
# e.g. the everyone group: `Group.everyone`
|
|
51
|
+
# ==========================================================================================
|
|
52
|
+
#
|
|
53
|
+
# These class methods may be called on each structureable model.
|
|
54
|
+
# For example, one may call `Group.find_or_create_special_group(:everyone)`.
|
|
55
|
+
# This is, for example, used to define the `Group.everyone` accessor.
|
|
56
|
+
#
|
|
57
|
+
# class Group
|
|
58
|
+
# def self.everyone
|
|
59
|
+
# self.find_or_create_special_group(:everyone)
|
|
60
|
+
# end
|
|
61
|
+
# end
|
|
62
|
+
#
|
|
63
|
+
# The `options` hash allows to specify a `parent element`, which is a structureable element
|
|
64
|
+
# that is expected to be the parent element of the special group. Example:
|
|
65
|
+
#
|
|
66
|
+
# find_or_create_special_group( :corporations, parent_element:
|
|
67
|
+
# find_or_create_special_group(:everyone) )
|
|
68
|
+
#
|
|
69
|
+
module ClassMethods
|
|
70
|
+
|
|
71
|
+
def find_special_group( group_flag, options = {} )
|
|
72
|
+
object_to_search = options[:parent_element].try(:child_groups)
|
|
73
|
+
object_to_search ||= Group unless options[:local]
|
|
74
|
+
object_to_search.find_by_flag( group_flag.to_sym ) if object_to_search && object_to_search != []
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def create_special_group( group_flag, options = {} )
|
|
78
|
+
if find_special_group( group_flag, options )
|
|
79
|
+
raise "special group :#{group_flag} already exists."
|
|
80
|
+
end
|
|
81
|
+
object_to_create = options[:parent_element].try(:child_groups)
|
|
82
|
+
object_to_create ||= Group unless options[:local]
|
|
83
|
+
|
|
84
|
+
new_special_group = object_to_create.create
|
|
85
|
+
new_special_group.add_flag( group_flag.to_sym )
|
|
86
|
+
new_special_group.update_attribute( :name, group_flag.to_s.gsub(/_parent$/, "" ) )
|
|
87
|
+
|
|
88
|
+
return new_special_group
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def find_or_create_special_group( group_flag, options = {} )
|
|
92
|
+
find_special_group(group_flag, options) or
|
|
93
|
+
begin
|
|
94
|
+
create_special_group(group_flag, options)
|
|
95
|
+
rescue
|
|
96
|
+
nil
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
# Local Special Groups
|
|
104
|
+
# i.e. descendants of structureables, e.g. officers groups: `group_xy.officers_parent`
|
|
105
|
+
# ==========================================================================================
|
|
106
|
+
#
|
|
107
|
+
# These instance methods may be called on each structureable model instance.
|
|
108
|
+
# For example, one may call `my_group.find_or_create_special_group(:officers_parent)`.
|
|
109
|
+
#
|
|
110
|
+
# These methods use the same mechanism as for the global special groups above
|
|
111
|
+
# by specifying `self` (i.e. the structureable instance) as the `parent_element`.
|
|
112
|
+
#
|
|
113
|
+
|
|
114
|
+
def find_special_group( group_flag, options = {} )
|
|
115
|
+
self.class.find_special_group( group_flag, { parent_element: self, local: true }.merge(options) )
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
def create_special_group( group_flag, options = {} )
|
|
119
|
+
self.class.create_special_group( group_flag, { parent_element: self, local: true }.merge(options) )
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def find_or_create_special_group( group_flag, options = {} )
|
|
123
|
+
self.class.find_or_create_special_group( group_flag, { parent_element: self, local: true }.merge(options) )
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
end
|
|
127
|
+
|