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,61 @@
|
|
|
1
|
+
#
|
|
2
|
+
# All groups have associated special groups, for example the `guests_parent` group, which
|
|
3
|
+
# contains all guests of the group.
|
|
4
|
+
#
|
|
5
|
+
# This mixin provides the accessor methods for the guests_parent special group.
|
|
6
|
+
#
|
|
7
|
+
# The mechanism used in the mixin is defined in `StructureableMixins::HasSpecialGroups`.
|
|
8
|
+
#
|
|
9
|
+
module GroupMixins::Guests
|
|
10
|
+
|
|
11
|
+
extend ActiveSupport::Concern
|
|
12
|
+
|
|
13
|
+
included do
|
|
14
|
+
# see, for example, http://stackoverflow.com/questions/5241527/splitting-a-class-into-multiple-files-in-ruby-on-rails
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# Guests
|
|
19
|
+
# ==========================================================================================
|
|
20
|
+
|
|
21
|
+
def find_guests_parent_group
|
|
22
|
+
find_special_group(:guests_parent)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def create_guests_parent_group
|
|
26
|
+
create_special_group(:guests_parent)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def find_or_create_guests_parent_group
|
|
30
|
+
find_or_create_special_group(:guests_parent)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def guests_parent
|
|
34
|
+
find_or_create_guests_parent_group
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def guests_parent!
|
|
38
|
+
find_guests_parent_group || raise('special group :guests_parent does not exist.')
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def find_guest_users
|
|
42
|
+
guests_parent.descendant_users
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def guests
|
|
46
|
+
find_guest_users
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# This method lists all guest subgroups of self, but not of the subgroups of self.
|
|
50
|
+
# This is used, for example, if there are several kinds of guests.
|
|
51
|
+
#
|
|
52
|
+
# my_group
|
|
53
|
+
# |---------- guests_parent
|
|
54
|
+
# |----------- regular_guests <-- returned by this
|
|
55
|
+
# |----------- vip_guests <-- method.
|
|
56
|
+
#
|
|
57
|
+
def find_guests_groups
|
|
58
|
+
find_guests_parent_group.descendant_groups
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
#
|
|
2
|
+
# There are certain gloabl special groups, for example the `everyone` group, which contains
|
|
3
|
+
# all users.
|
|
4
|
+
#
|
|
5
|
+
# The mechanism used by this mixin is defined in `StructureableMixins::HasSpecialGroups`.
|
|
6
|
+
#
|
|
7
|
+
module GroupMixins::HiddenUsers
|
|
8
|
+
|
|
9
|
+
extend ActiveSupport::Concern
|
|
10
|
+
|
|
11
|
+
included do
|
|
12
|
+
# see, for example, http://stackoverflow.com/questions/5241527/splitting-a-class-into-multiple-files-in-ruby-on-rails
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Hidden Users
|
|
16
|
+
# ==========================================================================================
|
|
17
|
+
#
|
|
18
|
+
# This group contains all users that are hidden to normal users and only visible
|
|
19
|
+
# to their administrators.
|
|
20
|
+
#
|
|
21
|
+
module ClassMethods
|
|
22
|
+
def find_hidden_users_group
|
|
23
|
+
find_special_group(:hidden_users)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def create_hidden_users_group
|
|
27
|
+
create_special_group(:hidden_users)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def find_or_create_hidden_users_group
|
|
31
|
+
find_or_create_special_group(:hidden_users)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def hidden_users
|
|
35
|
+
find_or_create_hidden_users_group
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def hidden_users!
|
|
39
|
+
find_hidden_users_group || raise('special group :hidden_users does not exist.')
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
# This module extends the Group model by group import methods.
|
|
4
|
+
# This allows, for example, to import groups from a previous application or to auto-load
|
|
5
|
+
# a certain default group structure.
|
|
6
|
+
#
|
|
7
|
+
# The module is included in the Group model by `include GroupMixins::Import`.
|
|
8
|
+
# The methods of the module can be accessed just like any other Group model methods:
|
|
9
|
+
# Group.class_method()
|
|
10
|
+
# g = Group.new()
|
|
11
|
+
# g.instance_method()
|
|
12
|
+
#
|
|
13
|
+
module GroupMixins::Import
|
|
14
|
+
|
|
15
|
+
extend ActiveSupport::Concern
|
|
16
|
+
|
|
17
|
+
included do
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# Hash Array Import
|
|
22
|
+
# ==========================================================================================
|
|
23
|
+
|
|
24
|
+
module ClassMethods
|
|
25
|
+
|
|
26
|
+
# Import Hash Array of groups into a parent group.
|
|
27
|
+
# Each group in the array is represented by a hash. Each hash contains the attributes
|
|
28
|
+
# of the group. The group's children are represented by another hash array, which is
|
|
29
|
+
# stored at the `children` key.
|
|
30
|
+
#
|
|
31
|
+
# The hash array should like this:
|
|
32
|
+
# [
|
|
33
|
+
# {
|
|
34
|
+
# :name => "Group 1",
|
|
35
|
+
# :children => [
|
|
36
|
+
# {
|
|
37
|
+
# :name => "Group 1.1"
|
|
38
|
+
# },
|
|
39
|
+
# {
|
|
40
|
+
# :name => "Group 1.2"
|
|
41
|
+
# }
|
|
42
|
+
# ]
|
|
43
|
+
# }
|
|
44
|
+
# ]
|
|
45
|
+
#
|
|
46
|
+
# This is a helper method, which is used by other import methods like
|
|
47
|
+
# `json_import_groups_into_parent_group`.
|
|
48
|
+
#
|
|
49
|
+
def hash_array_import_groups_into_parent_group( hash_array_of_groups, parent_group )
|
|
50
|
+
return unless hash_array_of_groups
|
|
51
|
+
counter_for_created_groups = 0
|
|
52
|
+
|
|
53
|
+
for new_group_hash in hash_array_of_groups do
|
|
54
|
+
|
|
55
|
+
unless parent_group.children.select { |child| child.name == (new_group_hash["name"] || new_group_hash[:name]) }.count > 0
|
|
56
|
+
|
|
57
|
+
# get children from hash
|
|
58
|
+
sub_group_hash_array = new_group_hash[ "children" ]
|
|
59
|
+
sub_group_hash_array = new_group_hash[ :children ] unless sub_group_hash_array
|
|
60
|
+
new_group_hash.reject! { |key| key.to_sym == :children }
|
|
61
|
+
|
|
62
|
+
# get domain from hash
|
|
63
|
+
domain = new_group_hash[ "domain" ]
|
|
64
|
+
new_group_hash.reject! { |key| key.to_sym == :domain }
|
|
65
|
+
|
|
66
|
+
# create the new group
|
|
67
|
+
g = Group.create( new_group_hash )
|
|
68
|
+
g.parent_groups << parent_group
|
|
69
|
+
g.set_flags_based_on_group_name
|
|
70
|
+
g.save
|
|
71
|
+
|
|
72
|
+
# import the child's children as well
|
|
73
|
+
self.hash_array_import_groups_into_parent_group sub_group_hash_array, g if sub_group_hash_array
|
|
74
|
+
counter_for_created_groups += 1
|
|
75
|
+
|
|
76
|
+
# set domain as url component in navnode
|
|
77
|
+
g.navnode.update_attribute(:url_component, "#{domain}/")
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
return counter_for_created_groups.to_s + " groups created."
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Convert an array of group names, like
|
|
85
|
+
#
|
|
86
|
+
# [ "Group 1",
|
|
87
|
+
# { "Group 2" => [ "Group 2.1", "Group 2.2" ] },
|
|
88
|
+
# ... ]
|
|
89
|
+
#
|
|
90
|
+
# into an array of hashes as used by the `hash_array_import_groups_into_parent_group`
|
|
91
|
+
# method. The result looks like this:
|
|
92
|
+
#
|
|
93
|
+
# [
|
|
94
|
+
# { :name => "Group 1" },
|
|
95
|
+
# { :name => "Group 2", children: [
|
|
96
|
+
# { name: "Group 2.1" },
|
|
97
|
+
# { name: "Group 2.2" }
|
|
98
|
+
# ]
|
|
99
|
+
# },
|
|
100
|
+
# ...
|
|
101
|
+
# ]
|
|
102
|
+
#
|
|
103
|
+
# This method is used in the YAML import mechanism.
|
|
104
|
+
#
|
|
105
|
+
def convert_group_names_to_group_hashes( group_names )
|
|
106
|
+
group_names.map do |array_item|
|
|
107
|
+
if array_item.kind_of? String
|
|
108
|
+
{ name: array_item }
|
|
109
|
+
elsif array_item.kind_of? Hash
|
|
110
|
+
unless array_item[ :name ]
|
|
111
|
+
{ name: array_item.keys.first,
|
|
112
|
+
children: convert_group_names_to_group_hashes( array_item[ array_item.keys.first ] )
|
|
113
|
+
}
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
# CSV Import
|
|
123
|
+
# ==========================================================================================
|
|
124
|
+
|
|
125
|
+
module ClassMethods
|
|
126
|
+
|
|
127
|
+
# Import groups listed in a comma-separated-values file (CSV) into a parent group.
|
|
128
|
+
# The CSV format should look like this:
|
|
129
|
+
#
|
|
130
|
+
# token;name
|
|
131
|
+
# GA;Group A
|
|
132
|
+
# GB;Group B
|
|
133
|
+
#
|
|
134
|
+
# Feel free to use other attributes in the CSV file as well. They will simply be
|
|
135
|
+
# converted into a hash and then passed to a `create` method.
|
|
136
|
+
#
|
|
137
|
+
# Note: This script expects a semicolon (;) to be used as separator.
|
|
138
|
+
#
|
|
139
|
+
# The csv file is to be placed in the #{Rails.root}/import folder of the main
|
|
140
|
+
# application. For the file #{Rails.root}/import/foo_groups.csv, call:
|
|
141
|
+
#
|
|
142
|
+
# Group.csv_import_groups_into_parent_group( "foo_groups.csv", foo_parent_group )
|
|
143
|
+
#
|
|
144
|
+
def csv_import_groups_into_parent_group( csv_file_title, parent_group )
|
|
145
|
+
import_file_name = File.join( Rails.root, "import", csv_file_title )
|
|
146
|
+
require 'csv'
|
|
147
|
+
CSV.foreach import_file_name, headers: true, col_sep: ';' do |row|
|
|
148
|
+
|
|
149
|
+
new_child_group = Group.create row.to_hash
|
|
150
|
+
parent_group.child_groups << new_child_group
|
|
151
|
+
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
# JSON Import
|
|
159
|
+
# ==========================================================================================
|
|
160
|
+
|
|
161
|
+
module ClassMethods
|
|
162
|
+
|
|
163
|
+
# Import groups from a JSON format file into a parent group.
|
|
164
|
+
# The JSON file should look like this:
|
|
165
|
+
#
|
|
166
|
+
# [
|
|
167
|
+
# {
|
|
168
|
+
# "name": "Group 1",
|
|
169
|
+
# "children":
|
|
170
|
+
# [
|
|
171
|
+
# {
|
|
172
|
+
# "name": "Group 1.1"
|
|
173
|
+
# },
|
|
174
|
+
# {
|
|
175
|
+
# "name": "Group 1.2",
|
|
176
|
+
# "children":
|
|
177
|
+
# [
|
|
178
|
+
# {
|
|
179
|
+
# "name": "Group 1.2.1"
|
|
180
|
+
# },
|
|
181
|
+
# {
|
|
182
|
+
# "name": "Group 1.2.2"
|
|
183
|
+
# }
|
|
184
|
+
# ]
|
|
185
|
+
# }
|
|
186
|
+
# ]
|
|
187
|
+
# },
|
|
188
|
+
# {
|
|
189
|
+
# "name": "Group 2"
|
|
190
|
+
# }
|
|
191
|
+
# ]
|
|
192
|
+
#
|
|
193
|
+
# The json file is to be placed in the #{Rails.root}/import folder of the main
|
|
194
|
+
# application. For the file #{Rails.root}/import/foo_groups.json, call:
|
|
195
|
+
#
|
|
196
|
+
# Group.json_import_groups_into_parent_group( "foo_groups.json", foo_parent_group )
|
|
197
|
+
#
|
|
198
|
+
def json_import_groups_into_parent_group( json_file_title, parent_group )
|
|
199
|
+
raise "no parent group given during import" unless parent_group
|
|
200
|
+
import_json_file = File.open( File.join( Rails.root, "import", json_file_title ), "r" )
|
|
201
|
+
json = IO.read( import_json_file )
|
|
202
|
+
|
|
203
|
+
new_child_groups_hash_array = JSON.parse( json )
|
|
204
|
+
p self.hash_array_import_groups_into_parent_group new_child_groups_hash_array, parent_group
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
# YAML Import
|
|
211
|
+
# ==========================================================================================
|
|
212
|
+
|
|
213
|
+
module ClassMethods
|
|
214
|
+
|
|
215
|
+
# Import the groups of a YAML file into a parent group.
|
|
216
|
+
# The YAML file should look like this:
|
|
217
|
+
#
|
|
218
|
+
# - Group 1
|
|
219
|
+
# - Group 2:
|
|
220
|
+
# - Group 2.1:
|
|
221
|
+
# - Group 2.1.1
|
|
222
|
+
# - Group 2.1.2
|
|
223
|
+
# - Group 2.2
|
|
224
|
+
# - Group 3:
|
|
225
|
+
# - Group 3.1
|
|
226
|
+
#
|
|
227
|
+
# The YAML files are expected to be stored in the `#{Rails.root}/import` directory
|
|
228
|
+
# of the main application. For example, the file `#{Rails.root}/import/foo.yml`
|
|
229
|
+
# is imported by calling:
|
|
230
|
+
#
|
|
231
|
+
# Group.yaml_import_groups_into_parent_group( "foo.yml", parent_group )
|
|
232
|
+
#
|
|
233
|
+
def yaml_import_groups_into_parent_group( yaml_file_title, parent_group )
|
|
234
|
+
yaml_file_name = File.join( Rails.root, "import", yaml_file_title )
|
|
235
|
+
if File.exists? yaml_file_name
|
|
236
|
+
|
|
237
|
+
sub_group_hashes = []
|
|
238
|
+
File.open( yaml_file_name, "r" ) do |file|
|
|
239
|
+
sub_group_hashes = YAML::load(file)
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
# This allows to use a short-form of yaml. Because of this, one doesn't need to
|
|
243
|
+
# specify the `name` attribute in yaml, but can just use the group name as key,
|
|
244
|
+
# like shown above in the description of the `yaml_import_groups_into_parent_group`
|
|
245
|
+
# method.
|
|
246
|
+
sub_group_hashes = convert_group_names_to_group_hashes( sub_group_hashes )
|
|
247
|
+
|
|
248
|
+
Group.hash_array_import_groups_into_parent_group( sub_group_hashes, parent_group )
|
|
249
|
+
|
|
250
|
+
else
|
|
251
|
+
return false
|
|
252
|
+
end
|
|
253
|
+
end
|
|
254
|
+
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
# Import of the Default Sub-Structure of a Group
|
|
259
|
+
# ==========================================================================================
|
|
260
|
+
|
|
261
|
+
# Import the default group structure.
|
|
262
|
+
# This is called after creation of the group.
|
|
263
|
+
#
|
|
264
|
+
# The structure is to be placed in a file at
|
|
265
|
+
# #{Rails.root}/import/default_group_sub_structures/#{self.name}.yml
|
|
266
|
+
# and is to be formatted in yaml, like this:
|
|
267
|
+
#
|
|
268
|
+
# - Group 1
|
|
269
|
+
# - Group 2:
|
|
270
|
+
# - Group 2.1:
|
|
271
|
+
# - Group 2.1.1
|
|
272
|
+
# - Group 2.1.2
|
|
273
|
+
# - Group 2.2
|
|
274
|
+
# - Group 3:
|
|
275
|
+
# - Group 3.1
|
|
276
|
+
#
|
|
277
|
+
def import_default_group_structure( yaml_file_title = nil )
|
|
278
|
+
yaml_file_title ||= yaml_file_title = File.join( "default_group_sub_structures",
|
|
279
|
+
"#{self.name}.yml" )
|
|
280
|
+
parent_group = self
|
|
281
|
+
Group.yaml_import_groups_into_parent_group( yaml_file_title, parent_group )
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
# Special Groups
|
|
286
|
+
# ==========================================================================================
|
|
287
|
+
|
|
288
|
+
# When importing group structures, certain group names indicate special group attributes.
|
|
289
|
+
# This method sets these flags based on the group name.
|
|
290
|
+
#
|
|
291
|
+
# This method is called by the `hash_array_import_groups_into_parent_group` method.
|
|
292
|
+
#
|
|
293
|
+
def set_flags_based_on_group_name
|
|
294
|
+
|
|
295
|
+
# Officers
|
|
296
|
+
set_flag_based_on_name :officers_parent
|
|
297
|
+
|
|
298
|
+
# Guests
|
|
299
|
+
set_flag_based_on_name :guests_parent
|
|
300
|
+
|
|
301
|
+
# Deceased
|
|
302
|
+
set_flag_based_on_name :deceased_parent
|
|
303
|
+
|
|
304
|
+
# Former Members
|
|
305
|
+
set_flag_based_on_name :former_members_parent
|
|
306
|
+
|
|
307
|
+
end
|
|
308
|
+
|
|
309
|
+
def set_flag_based_on_name( name )
|
|
310
|
+
translations = []
|
|
311
|
+
name = name.to_sym
|
|
312
|
+
I18n.translate( name ) # required to initialize the I18n
|
|
313
|
+
I18n.backend.send( :translations ).each do |language, translations_hash|
|
|
314
|
+
translations << translations_hash[ name ]
|
|
315
|
+
end
|
|
316
|
+
if self.name.in? translations
|
|
317
|
+
self.add_flag( name )
|
|
318
|
+
end
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
end
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
#
|
|
2
|
+
# This module contains the methods of the Group model regarding the associated
|
|
3
|
+
# user group memberships and users, i.e. members.
|
|
4
|
+
#
|
|
5
|
+
module GroupMixins::Memberships
|
|
6
|
+
|
|
7
|
+
extend ActiveSupport::Concern
|
|
8
|
+
|
|
9
|
+
# TODO: Refactor conditions to rails 4 standard when migrating to rails 4.
|
|
10
|
+
# See, for example, https://github.com/fiedl/neo4j_ancestry/blob/master/lib/models/neo4j_ancestry/active_record_additions.rb#L117.
|
|
11
|
+
|
|
12
|
+
included do
|
|
13
|
+
|
|
14
|
+
# User Group Memberships
|
|
15
|
+
# ==========================================================================================
|
|
16
|
+
|
|
17
|
+
# This associates all UserGroupMembership objects of the group, including indirect
|
|
18
|
+
# memberships.
|
|
19
|
+
#
|
|
20
|
+
has_many( :memberships,
|
|
21
|
+
class_name: 'UserGroupMembership',
|
|
22
|
+
foreign_key: :ancestor_id, conditions: { ancestor_type: 'Group', descendant_type: 'User' } )
|
|
23
|
+
|
|
24
|
+
# This associates all memberships of the group that are direct, i.e. direct
|
|
25
|
+
# parent_group-child_user memberships.
|
|
26
|
+
#
|
|
27
|
+
has_many( :direct_memberships,
|
|
28
|
+
class_name: 'UserGroupMembership',
|
|
29
|
+
foreign_key: :ancestor_id, conditions: { ancestor_type: 'Group', descendant_type: 'User', direct: true } )
|
|
30
|
+
|
|
31
|
+
# This associates all memberships of the group that are indirect, i.e.
|
|
32
|
+
# ancestor_group-descendant_user memberships, where groups are between the
|
|
33
|
+
# ancestor_group and the descendant_user.
|
|
34
|
+
#
|
|
35
|
+
has_many( :indirect_memberships,
|
|
36
|
+
class_name: 'UserGroupMembership',
|
|
37
|
+
foreign_key: :ancestor_id, conditions: { ancestor_type: 'Group', descendant_type: 'User', direct: false } )
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# This method builds a new membership having this group (self) as group associated.
|
|
41
|
+
#
|
|
42
|
+
def build_membership
|
|
43
|
+
direct_memberships.build(descendant_type: 'User')
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# This returns the UserGroupMembership object that represents the membership of the
|
|
47
|
+
# given user in this group.
|
|
48
|
+
#
|
|
49
|
+
# options:
|
|
50
|
+
# - also_in_the_past
|
|
51
|
+
#
|
|
52
|
+
def membership_of(user, options = {})
|
|
53
|
+
if options[:also_in_the_past]
|
|
54
|
+
base = UserGroupMembership.with_invalid
|
|
55
|
+
else
|
|
56
|
+
base = UserGroupMembership
|
|
57
|
+
end
|
|
58
|
+
base.find_by_user_and_group(user, self)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# This returns a string of the titles of the direct members of this group. This is used
|
|
62
|
+
# for in-place editing, for example.
|
|
63
|
+
#
|
|
64
|
+
# The string would be something like this:
|
|
65
|
+
#
|
|
66
|
+
# "#{user1.title}, #{user2.title}, ..."
|
|
67
|
+
#
|
|
68
|
+
def direct_members_titles_string
|
|
69
|
+
direct_members.collect { |user| user.title }.join( ", " )
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# This sets the memberships of a group according to the given string of user titles.
|
|
73
|
+
#
|
|
74
|
+
# For example, after calling
|
|
75
|
+
#
|
|
76
|
+
# direct_members_titles_string = "#{user1.title}, #{user2.title}",
|
|
77
|
+
#
|
|
78
|
+
# the users `user1` and `user2` are the only direct members of the group.
|
|
79
|
+
# The memberships are removed using the standard methods, which means that the memberships
|
|
80
|
+
# are only marked as deleted. See: acts_as_paranoid_dag gem.
|
|
81
|
+
#
|
|
82
|
+
def direct_members_titles_string=( titles_string )
|
|
83
|
+
new_members_titles = titles_string.split( "," )
|
|
84
|
+
new_members = new_members_titles.collect do |title|
|
|
85
|
+
u = User.find_by_title( title.strip )
|
|
86
|
+
self.errors.add :direct_member_titles_string, 'user not found: #{title}' unless u
|
|
87
|
+
u
|
|
88
|
+
end
|
|
89
|
+
for member in self.direct_members
|
|
90
|
+
unassign_user member unless member.in? new_members if member
|
|
91
|
+
end
|
|
92
|
+
for new_member in new_members
|
|
93
|
+
assign_user new_member if new_member
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def memberships_including_members
|
|
98
|
+
memberships.includes(:descendant).order('valid_from' => 'desc')
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# This returns the memberships that appear in the member list
|
|
102
|
+
# of the group.
|
|
103
|
+
#
|
|
104
|
+
# For a regular group, these are just the usual memberships.
|
|
105
|
+
# For a corporation, the members of the 'former members' subgroup
|
|
106
|
+
# of the corporation are excluded, even though they still have
|
|
107
|
+
# memberships.
|
|
108
|
+
#
|
|
109
|
+
def memberships_for_member_list
|
|
110
|
+
cached do
|
|
111
|
+
if corporation?
|
|
112
|
+
(
|
|
113
|
+
memberships_including_members -
|
|
114
|
+
becomes(Corporation).former_members_memberships -
|
|
115
|
+
becomes(Corporation).deceased_members_memberships
|
|
116
|
+
)
|
|
117
|
+
else
|
|
118
|
+
memberships_including_members
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
def memberships_for_member_list_count
|
|
123
|
+
cached { memberships_for_member_list.count }
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def latest_memberships
|
|
127
|
+
cached do
|
|
128
|
+
# TODO: Fix this syntax when migrating to Rails 4.
|
|
129
|
+
# self.memberships.with_invalid...
|
|
130
|
+
UserGroupMembership.with_invalid.find_all_by_group(self).reorder('valid_from DESC').limit(10).includes(:descendant)
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def memberships_this_year
|
|
135
|
+
cached do
|
|
136
|
+
# TODO: Fix this syntax when migrating to Rails 4.
|
|
137
|
+
# self.memberships.this_year...
|
|
138
|
+
UserGroupMembership.this_year.find_all_by_group(self)
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# User Assignment
|
|
143
|
+
# ==========================================================================================
|
|
144
|
+
|
|
145
|
+
# This assings the given user as a member to the group, i.e. this will
|
|
146
|
+
# create a UserGroupMembership.
|
|
147
|
+
#
|
|
148
|
+
def assign_user( user, options = {} )
|
|
149
|
+
if user and not user.in?(self.direct_members)
|
|
150
|
+
membership = UserGroupMembership.create(user: user, group: self)
|
|
151
|
+
time_of_joining = options[:joined_at] || options[:at] || options[:time] || Time.zone.now
|
|
152
|
+
membership.update_attribute(:valid_from, time_of_joining)
|
|
153
|
+
return membership
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# This method will remove a UserGroupMembership, i.e. terminate the membership
|
|
158
|
+
# of the given user in this group.
|
|
159
|
+
#
|
|
160
|
+
def unassign_user( user, options = {} )
|
|
161
|
+
if user and user.in?(self.members)
|
|
162
|
+
time_of_unassignment = options[:at] || options[:time] || Time.zone.now
|
|
163
|
+
UserGroupMembership.find_by(user: user, group: self).invalidate(at: time_of_unassignment)
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def calculate_validity_range_of_indirect_memberships
|
|
169
|
+
self.indirect_memberships.where(valid_from: nil).each do |membership|
|
|
170
|
+
membership.recalculate_validity_range_from_direct_memberships
|
|
171
|
+
membership.save
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
# Members
|
|
177
|
+
# ==========================================================================================
|
|
178
|
+
|
|
179
|
+
# This associates the group members (users), direct ones as well as indirect ones.
|
|
180
|
+
#
|
|
181
|
+
# Attention! The conditions on the `memberships` association are ignored by Rails 3
|
|
182
|
+
# when generating the SQL query. This is why the conditions have to be repeated here.
|
|
183
|
+
#
|
|
184
|
+
has_many(:members,
|
|
185
|
+
through: :memberships,
|
|
186
|
+
source: :descendant, source_type: 'User', :uniq => true,
|
|
187
|
+
conditions: { 'dag_links.ancestor_type' => 'Group' }
|
|
188
|
+
)
|
|
189
|
+
|
|
190
|
+
# This associates only the direct group members (users).
|
|
191
|
+
#
|
|
192
|
+
has_many(:direct_members,
|
|
193
|
+
through: :direct_memberships,
|
|
194
|
+
source: :descendant, source_type: 'User', :uniq => true,
|
|
195
|
+
conditions: { 'dag_links.ancestor_type' => 'Group', 'dag_links.direct' => true }
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
# This associates only the indirect group members (users).
|
|
199
|
+
#
|
|
200
|
+
has_many(:indirect_members,
|
|
201
|
+
through: :indirect_memberships,
|
|
202
|
+
source: :descendant, source_type: 'User', :uniq => true,
|
|
203
|
+
conditions: { 'dag_links.ancestor_type' => 'Group', 'dag_links.direct' => false }
|
|
204
|
+
)
|
|
205
|
+
|
|
206
|
+
end
|
|
207
|
+
end
|