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.
Files changed (704) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +39 -11
  3. data/Rakefile +15 -1
  4. data/app/assets/images/file.png +0 -0
  5. data/app/assets/images/img/excel2013_file_128.png +0 -0
  6. data/app/assets/images/img/excel2013_file_bw_107.png +0 -0
  7. data/app/assets/images/img/excel2013_file_bw_semitransparent_107.png +0 -0
  8. data/app/assets/images/img/glyphicons-halflings-white.png +0 -0
  9. data/app/assets/images/img/glyphicons-halflings.png +0 -0
  10. data/app/assets/images/img/gmaps_yellow_marker.png +0 -0
  11. data/app/assets/images/img/gmaps_yellow_marker_38.png +0 -0
  12. data/app/assets/images/markdown_help.png +0 -0
  13. data/app/assets/images/your_platform/breadcrumb-sep.png +0 -0
  14. data/app/assets/javascripts/app-ng.js.coffee +5 -0
  15. data/app/assets/javascripts/attachments.js +2 -0
  16. data/app/assets/javascripts/controllers-ng/bookmark_list_controller.js.coffee +30 -0
  17. data/app/assets/javascripts/controllers-ng/box_controller.js.coffee +37 -0
  18. data/app/assets/javascripts/controllers-ng/profile_angular.js.coffee +151 -0
  19. data/app/assets/javascripts/directives-ng/box_directive.js.coffee +91 -0
  20. data/app/assets/javascripts/directives-ng/star_tool_directive.js.coffee +111 -0
  21. data/app/assets/javascripts/filters-ng/some_filter.js.coffee +0 -0
  22. data/app/assets/javascripts/jquery.appear-1.1.1.js +138 -0
  23. data/app/assets/javascripts/make-js-more-like-ruby.js.coffee +32 -0
  24. data/app/assets/javascripts/mercury.js +456 -0
  25. data/app/assets/javascripts/models-ng/bookmark.js.coffee +28 -0
  26. data/app/assets/javascripts/services-ng/current_user_bookmarks.js.coffee +39 -0
  27. data/app/assets/javascripts/your_platform.js +27 -0
  28. data/app/assets/javascripts/your_platform/address_labels.js.coffee +40 -0
  29. data/app/assets/javascripts/your_platform/attachments.js.coffee +61 -0
  30. data/app/assets/javascripts/your_platform/auto-completion.js.coffee +90 -0
  31. data/app/assets/javascripts/your_platform/best_in_place.js.coffee +8 -0
  32. data/app/assets/javascripts/your_platform/best_in_place_hyperlinks.js.coffee +25 -0
  33. data/app/assets/javascripts/your_platform/best_in_place_tab_key.js.coffee +28 -0
  34. data/app/assets/javascripts/your_platform/boxes.js.coffee +11 -0
  35. data/app/assets/javascripts/your_platform/change_password.js.coffee +22 -0
  36. data/app/assets/javascripts/your_platform/close_dropdowns.js.coffee +18 -0
  37. data/app/assets/javascripts/your_platform/copy_to_clipboard.js.coffee +6 -0
  38. data/app/assets/javascripts/your_platform/datatables.coffee +112 -0
  39. data/app/assets/javascripts/your_platform/datepicker_settings.js.coffee +16 -0
  40. data/app/assets/javascripts/your_platform/edit_tools.js.coffee +19 -0
  41. data/app/assets/javascripts/your_platform/editable_dbl_click.js.coffee +42 -0
  42. data/app/assets/javascripts/your_platform/events.js.coffee +126 -0
  43. data/app/assets/javascripts/your_platform/fix_textarea.js.coffee +11 -0
  44. data/app/assets/javascripts/your_platform/galleria.js.coffee +112 -0
  45. data/app/assets/javascripts/your_platform/groups.js.coffee +36 -0
  46. data/app/assets/javascripts/your_platform/hidden.js.coffee +5 -0
  47. data/app/assets/javascripts/your_platform/links_to_external_sites.js.coffee +12 -0
  48. data/app/assets/javascripts/your_platform/maps.js.coffee +13 -0
  49. data/app/assets/javascripts/your_platform/may_need_review.js.coffee +10 -0
  50. data/app/assets/javascripts/your_platform/navable_title_rename.js.coffee +17 -0
  51. data/app/assets/javascripts/your_platform/officers.js.coffee +35 -0
  52. data/app/assets/javascripts/your_platform/popovers.js.coffee +38 -0
  53. data/app/assets/javascripts/your_platform/posts.js.coffee +58 -0
  54. data/app/assets/javascripts/your_platform/profile_fields.js.coffee +61 -0
  55. data/app/assets/javascripts/your_platform/search.js.coffee +26 -0
  56. data/app/assets/javascripts/your_platform/tooltips.js.coffee +10 -0
  57. data/app/assets/javascripts/your_platform/turbolinks_loading_spinner.js.coffee +83 -0
  58. data/app/assets/javascripts/your_platform/user_avatars.js.coffee +33 -0
  59. data/app/assets/javascripts/your_platform/user_group_memberships.js.coffee +11 -0
  60. data/app/assets/javascripts/your_platform/user_settings.js.coffee +18 -0
  61. data/app/assets/javascripts/your_platform/users_new.js.coffee +54 -0
  62. data/app/assets/stylesheets/bootstrap_layout.css.sass +3 -0
  63. data/app/assets/stylesheets/bootstrap_layout/attachments.css.sass +3 -0
  64. data/app/assets/stylesheets/bootstrap_layout/boxes.css.sass +11 -0
  65. data/app/assets/stylesheets/bootstrap_layout/breadcrumb.css.sass +25 -0
  66. data/app/assets/stylesheets/bootstrap_layout/category_indicator.css.sass +5 -0
  67. data/app/assets/stylesheets/bootstrap_layout/footer.css.sass +14 -0
  68. data/app/assets/stylesheets/bootstrap_layout/galleria.css.sass +8 -0
  69. data/app/assets/stylesheets/bootstrap_layout/header_bar.css.sass +11 -0
  70. data/app/assets/stylesheets/bootstrap_layout/headings.css.sass +10 -0
  71. data/app/assets/stylesheets/bootstrap_layout/logged_in_bar.css.sass +40 -0
  72. data/app/assets/stylesheets/bootstrap_layout/logo.css.sass +2 -0
  73. data/app/assets/stylesheets/bootstrap_layout/modal_fix.css.sass +8 -0
  74. data/app/assets/stylesheets/bootstrap_layout/profiles.css.sass +10 -0
  75. data/app/assets/stylesheets/bootstrap_layout/session_bar.css.sass +60 -0
  76. data/app/assets/stylesheets/bootstrap_layout/stars.css.sass +4 -0
  77. data/app/assets/stylesheets/bootstrap_layout/turbolinks_progress_bar.css.sass +3 -0
  78. data/app/assets/stylesheets/bootstrap_layout/vertical_menu.css.sass +15 -0
  79. data/app/assets/stylesheets/bootstrap_setup.css.sass +4 -0
  80. data/app/assets/stylesheets/your_platform.css.sass +11 -0
  81. data/app/assets/stylesheets/your_platform/address_labels_modal.css.sass +8 -0
  82. data/app/assets/stylesheets/your_platform/attachments.css.sass +75 -0
  83. data/app/assets/stylesheets/your_platform/authorization_info.css.sass +16 -0
  84. data/app/assets/stylesheets/your_platform/auto-completion.css.sass +3 -0
  85. data/app/assets/stylesheets/your_platform/center.css.sass +14 -0
  86. data/app/assets/stylesheets/your_platform/change_password.css.sass +13 -0
  87. data/app/assets/stylesheets/your_platform/corporate_vita.css.sass +2 -0
  88. data/app/assets/stylesheets/your_platform/datatables.css.sass +23 -0
  89. data/app/assets/stylesheets/your_platform/datepicker.css.sass +2 -0
  90. data/app/assets/stylesheets/your_platform/dropdowns.css.sass +8 -0
  91. data/app/assets/stylesheets/your_platform/events.css.sass +68 -0
  92. data/app/assets/stylesheets/your_platform/forms.css.sass +25 -0
  93. data/app/assets/stylesheets/your_platform/galleria.css.sass +12 -0
  94. data/app/assets/stylesheets/your_platform/groups.css.sass +8 -0
  95. data/app/assets/stylesheets/your_platform/groups_table.css.sass +8 -0
  96. data/app/assets/stylesheets/your_platform/hidden.css.sass +3 -0
  97. data/app/assets/stylesheets/your_platform/images.css.sass +50 -0
  98. data/app/assets/stylesheets/your_platform/last_activities.css.sass +17 -0
  99. data/app/assets/stylesheets/your_platform/latest_members.css.sass +7 -0
  100. data/app/assets/stylesheets/your_platform/login.css.sass +4 -0
  101. data/app/assets/stylesheets/your_platform/maps.css.sass +22 -0
  102. data/app/assets/stylesheets/your_platform/markdown_help.css.sass +5 -0
  103. data/app/assets/stylesheets/your_platform/may_need_review.css.sass +3 -0
  104. data/app/assets/stylesheets/your_platform/pages.css.sass +12 -0
  105. data/app/assets/stylesheets/your_platform/password_strength.css.sass +73 -0
  106. data/app/assets/stylesheets/your_platform/picture_attachments.css.sass +7 -0
  107. data/app/assets/stylesheets/your_platform/popovers.css.sass +13 -0
  108. data/app/assets/stylesheets/your_platform/posts.css.sass +32 -0
  109. data/app/assets/stylesheets/your_platform/profiles.css.sass +153 -0
  110. data/app/assets/stylesheets/your_platform/search_preview.css.sass +4 -0
  111. data/app/assets/stylesheets/your_platform/star_tool.css.sass +2 -0
  112. data/app/assets/stylesheets/your_platform/tooltips.css.sass +7 -0
  113. data/app/assets/stylesheets/your_platform/turbolinks_loading_spinner.css.sass +3 -0
  114. data/app/assets/stylesheets/your_platform/user_avatars.css.sass +8 -0
  115. data/app/assets/stylesheets/your_platform/user_group_memberships.css.sass +4 -0
  116. data/app/assets/stylesheets/your_platform/vertical_nav.css.sass +7 -0
  117. data/app/controllers/activities_controller.rb +6 -0
  118. data/app/controllers/application_controller.rb +236 -0
  119. data/app/controllers/attachments_controller.rb +97 -0
  120. data/app/controllers/blog_posts_controller.rb +50 -0
  121. data/app/controllers/bookmarks_controller.rb +33 -0
  122. data/app/controllers/corporations_controller.rb +22 -0
  123. data/app/controllers/errors_controller.rb +27 -0
  124. data/app/controllers/events_controller.rb +262 -0
  125. data/app/controllers/groups_controller.rb +257 -0
  126. data/app/controllers/officers_controller.rb +28 -0
  127. data/app/controllers/pages_controller.rb +67 -0
  128. data/app/controllers/posts_controller.rb +81 -0
  129. data/app/controllers/profile_fields_controller.rb +132 -0
  130. data/app/controllers/root_controller.rb +35 -0
  131. data/app/controllers/search_controller.rb +149 -0
  132. data/app/controllers/sessions_controller.rb +21 -0
  133. data/app/controllers/setup_controller.rb +80 -0
  134. data/app/controllers/statistics_controller.rb +38 -0
  135. data/app/controllers/status_group_memberships_controller.rb +28 -0
  136. data/app/controllers/terms_of_use_controller.rb +35 -0
  137. data/app/controllers/user_accounts_controller.rb +55 -0
  138. data/app/controllers/user_group_memberships_controller.rb +75 -0
  139. data/app/controllers/user_settings_controller.rb +57 -0
  140. data/app/controllers/users_controller.rb +125 -0
  141. data/app/controllers/workflows_controller.rb +19 -0
  142. data/app/helpers/application_helper.rb +25 -0
  143. data/app/helpers/attachments_helper.rb +2 -0
  144. data/app/helpers/auto_completion_helper.rb +33 -0
  145. data/app/helpers/avatar_helper.rb +70 -0
  146. data/app/helpers/bookmarks_helper.rb +22 -0
  147. data/app/helpers/box_helper.rb +56 -0
  148. data/app/helpers/breadcrumbs_helper.rb +62 -0
  149. data/app/helpers/corporate_vita_helper.rb +34 -0
  150. data/app/helpers/events_helper.rb +28 -0
  151. data/app/helpers/flash_helper.rb +60 -0
  152. data/app/helpers/footer_helper.rb +13 -0
  153. data/app/helpers/galleria_helper.rb +13 -0
  154. data/app/helpers/groups_helper.rb +66 -0
  155. data/app/helpers/horizontal_nav_helper.rb +11 -0
  156. data/app/helpers/i18n_helper.rb +10 -0
  157. data/app/helpers/icon_helper.rb +35 -0
  158. data/app/helpers/mailer_helper.rb +7 -0
  159. data/app/helpers/map_helper.rb +26 -0
  160. data/app/helpers/markdown_helper.rb +22 -0
  161. data/app/helpers/markup_helper.rb +25 -0
  162. data/app/helpers/officers_helper.rb +13 -0
  163. data/app/helpers/password_helper.rb +23 -0
  164. data/app/helpers/profile_field_helper.rb +40 -0
  165. data/app/helpers/profile_helper.rb +69 -0
  166. data/app/helpers/quick_link_helper.rb +53 -0
  167. data/app/helpers/special_pages_helper.rb +9 -0
  168. data/app/helpers/structureable_helper.rb +11 -0
  169. data/app/helpers/sublime_helper.rb +16 -0
  170. data/app/helpers/title_helper.rb +52 -0
  171. data/app/helpers/tool_buttons_helper.rb +74 -0
  172. data/app/helpers/unicode_helper.rb +9 -0
  173. data/app/helpers/users_helper.rb +13 -0
  174. data/app/helpers/vertical_nav_helper.rb +84 -0
  175. data/app/helpers/workflows_helper.rb +37 -0
  176. data/app/mailers/event_mailer.rb +13 -0
  177. data/app/mailers/post_mailer.rb +11 -0
  178. data/app/mailers/user_account_mailer.rb +17 -0
  179. data/app/models/ability.rb +321 -0
  180. data/app/models/active_record_associations_patches.rb +26 -0
  181. data/app/models/active_record_cache_extension.rb +152 -0
  182. data/app/models/active_record_find_by_extension.rb +20 -0
  183. data/app/models/active_record_json_url_extension.rb +51 -0
  184. data/app/models/active_record_metric_events_extension.rb +22 -0
  185. data/app/models/active_record_read_only_extension.rb +35 -0
  186. data/app/models/active_record_update_attributes_bip_extension.rb +24 -0
  187. data/app/models/address_label.rb +50 -0
  188. data/app/models/app_version.rb +49 -0
  189. data/app/models/array.rb +15 -0
  190. data/app/models/attachment.rb +76 -0
  191. data/app/models/bashpass_password.rb +32 -0
  192. data/app/models/blog_post.rb +2 -0
  193. data/app/models/bookmark.rb +67 -0
  194. data/app/models/cache_additions.rb +15 -0
  195. data/app/models/cache_store_extension.rb +78 -0
  196. data/app/models/concerns/user_avatar.rb +16 -0
  197. data/app/models/concerns/user_corporations.rb +44 -0
  198. data/app/models/concerns/user_date_of_birth.rb +74 -0
  199. data/app/models/concerns/user_profile.rb +102 -0
  200. data/app/models/corporation.rb +80 -0
  201. data/app/models/dag_link.rb +29 -0
  202. data/app/models/event.rb +235 -0
  203. data/app/models/flag.rb +18 -0
  204. data/app/models/flagable.rb +62 -0
  205. data/app/models/geo_location.rb +92 -0
  206. data/app/models/group.rb +224 -0
  207. data/app/models/group_mixins/corporations.rb +141 -0
  208. data/app/models/group_mixins/developers.rb +41 -0
  209. data/app/models/group_mixins/everyone.rb +72 -0
  210. data/app/models/group_mixins/guests.rb +61 -0
  211. data/app/models/group_mixins/hidden_users.rb +43 -0
  212. data/app/models/group_mixins/import.rb +321 -0
  213. data/app/models/group_mixins/memberships.rb +207 -0
  214. data/app/models/group_mixins/officers.rb +47 -0
  215. data/app/models/group_mixins/roles.rb +41 -0
  216. data/app/models/horizontal_nav.rb +32 -0
  217. data/app/models/last_seen_activity.rb +10 -0
  218. data/app/models/list_export.rb +359 -0
  219. data/app/models/may_need_review.rb +54 -0
  220. data/app/models/metric_logger.rb +83 -0
  221. data/app/models/nav_node.rb +169 -0
  222. data/app/models/navable.rb +46 -0
  223. data/app/models/object_to_b_extension.rb +12 -0
  224. data/app/models/page.rb +212 -0
  225. data/app/models/password.rb +28 -0
  226. data/app/models/post.rb +199 -0
  227. data/app/models/profile.rb +36 -0
  228. data/app/models/profile_field.rb +196 -0
  229. data/app/models/profile_field_mixins/has_child_profile_fields.rb +114 -0
  230. data/app/models/profile_field_types/about.rb +9 -0
  231. data/app/models/profile_field_types/academic_degree.rb +10 -0
  232. data/app/models/profile_field_types/address.rb +88 -0
  233. data/app/models/profile_field_types/bank_account.rb +12 -0
  234. data/app/models/profile_field_types/competence.rb +7 -0
  235. data/app/models/profile_field_types/custom.rb +12 -0
  236. data/app/models/profile_field_types/date.rb +14 -0
  237. data/app/models/profile_field_types/description.rb +15 -0
  238. data/app/models/profile_field_types/email.rb +20 -0
  239. data/app/models/profile_field_types/employment.rb +24 -0
  240. data/app/models/profile_field_types/general.rb +9 -0
  241. data/app/models/profile_field_types/homepage.rb +19 -0
  242. data/app/models/profile_field_types/name_surrounding.rb +11 -0
  243. data/app/models/profile_field_types/organization.rb +24 -0
  244. data/app/models/profile_field_types/phone.rb +37 -0
  245. data/app/models/profile_field_types/professional_category.rb +8 -0
  246. data/app/models/profile_field_types/study.rb +18 -0
  247. data/app/models/profile_section.rb +49 -0
  248. data/app/models/profileable.rb +58 -0
  249. data/app/models/profileable_mixins/address.rb +118 -0
  250. data/app/models/relationship.rb +78 -0
  251. data/app/models/role.rb +164 -0
  252. data/app/models/setting.rb +9 -0
  253. data/app/models/status_group.rb +28 -0
  254. data/app/models/status_group_membership.rb +189 -0
  255. data/app/models/status_group_membership_info.rb +54 -0
  256. data/app/models/structureable.rb +164 -0
  257. data/app/models/structureable_mixins/has_special_groups.rb +127 -0
  258. data/app/models/structureable_mixins/roles.rb +275 -0
  259. data/app/models/user.rb +878 -0
  260. data/app/models/user_account.rb +162 -0
  261. data/app/models/user_alias.rb +112 -0
  262. data/app/models/user_group_membership.rb +300 -0
  263. data/app/models/user_group_membership_mixins/validity_range.rb +206 -0
  264. data/app/models/user_group_membership_mixins/validity_range_for_indirect_memberships.rb +160 -0
  265. data/app/models/user_mixins/identification.rb +36 -0
  266. data/app/models/user_mixins/memberships.rb +75 -0
  267. data/app/models/workflow.rb +40 -0
  268. data/app/models/workflow_kit/add_to_group_brick.rb +21 -0
  269. data/app/models/workflow_kit/destroy_account_and_end_memberships_if_needed_brick.rb +19 -0
  270. data/app/models/workflow_kit/last_membership_needs_review_brick.rb +19 -0
  271. data/app/models/workflow_kit/mark_as_deceased_brick.rb +17 -0
  272. data/app/models/workflow_kit/remove_from_group_brick.rb +27 -0
  273. data/app/models/workflow_kit/test_brick.rb +13 -0
  274. data/app/pdfs/address_labels_pdf.rb +157 -0
  275. data/app/presenters/base_presenter.rb +52 -0
  276. data/app/presenters/horizontal_nav_presenter.rb +106 -0
  277. data/app/uploaders/attachment_uploader.rb +148 -0
  278. data/app/views/activities/index.html.haml +25 -0
  279. data/app/views/attachments/_attachment.html.haml +20 -0
  280. data/app/views/attachments/_description.html.haml +11 -0
  281. data/app/views/attachments/_documents.html.haml +17 -0
  282. data/app/views/attachments/_drop_field.html.haml +46 -0
  283. data/app/views/attachments/_picture.html.haml +2 -0
  284. data/app/views/attachments/_pictures.html.haml +10 -0
  285. data/app/views/attachments/_video.html.haml +8 -0
  286. data/app/views/attachments/create.js.erb +1 -0
  287. data/app/views/attachments/destroy.js.erb +1 -0
  288. data/app/views/blog_posts/create.js.erb +17 -0
  289. data/app/views/bookmarks/_list.html.haml +7 -0
  290. data/app/views/bookmarks/update.js.erb +4 -0
  291. data/app/views/devise/mailer/reset_password_instructions.html.haml +8 -0
  292. data/app/views/devise/passwords/edit.html.haml +1 -0
  293. data/app/views/devise/passwords/new.html.haml +12 -0
  294. data/app/views/devise/registrations/edit.html.haml +1 -0
  295. data/app/views/devise/sessions/new.html.haml +14 -0
  296. data/app/views/devise/shared/_links.haml +26 -0
  297. data/app/views/errors/show.html.haml +5 -0
  298. data/app/views/errors/unauthorized.html.haml +7 -0
  299. data/app/views/event_mailer/invitation_email.html.erb +63 -0
  300. data/app/views/events/_event_details.html.haml +54 -0
  301. data/app/views/events/_events_lis.html.haml +29 -0
  302. data/app/views/events/_invitation_text.html.erb +8 -0
  303. data/app/views/events/_pictures.html.haml +5 -0
  304. data/app/views/events/_public_index.html.haml +16 -0
  305. data/app/views/events/index.html.haml +24 -0
  306. data/app/views/events/show.html.haml +50 -0
  307. data/app/views/groups/_address_labels_modal.html.haml +27 -0
  308. data/app/views/groups/_export_button.html.haml +66 -0
  309. data/app/views/groups/_group_list.html.haml +25 -0
  310. data/app/views/groups/_member_avatars.html.haml +4 -0
  311. data/app/views/groups/_member_list.html.haml +15 -0
  312. data/app/views/groups/index.html.erb +11 -0
  313. data/app/views/groups/index_mine.html.haml +7 -0
  314. data/app/views/groups/show.html.haml +79 -0
  315. data/app/views/last_seen_activities/_index.html.haml +19 -0
  316. data/app/views/layouts/_add_structureable_additions.html.haml +15 -0
  317. data/app/views/layouts/_box.html.haml +16 -0
  318. data/app/views/layouts/_help_button.html.haml +1 -0
  319. data/app/views/layouts/_role_preview_switcher.html.haml +20 -0
  320. data/app/views/layouts/_session_bar_avatar.html.haml +1 -0
  321. data/app/views/layouts/_vertical_nav.html.haml +5 -0
  322. data/app/views/layouts/bootstrap.html.haml +146 -0
  323. data/app/views/layouts/mercury.html.erb +23 -0
  324. data/app/views/officers/_history_notice.html.haml +4 -0
  325. data/app/views/officers/_officers_box.html.haml +33 -0
  326. data/app/views/officers/_officers_group_entry.html.haml +45 -0
  327. data/app/views/pages/_attachments.html.haml +21 -0
  328. data/app/views/pages/_page.html.haml +28 -0
  329. data/app/views/pages/_pictures.html.haml +2 -0
  330. data/app/views/pages/_videos.html.erb +8 -0
  331. data/app/views/pages/show.html.haml +39 -0
  332. data/app/views/post_mailer/post_email.html.erb +17 -0
  333. data/app/views/posts/_new_post_template_text.html.haml +6 -0
  334. data/app/views/posts/_post.html.haml +13 -0
  335. data/app/views/posts/_post_quote.html.haml +18 -0
  336. data/app/views/posts/_posts.html.haml +6 -0
  337. data/app/views/posts/index.html.haml +9 -0
  338. data/app/views/posts/new.html.haml +42 -0
  339. data/app/views/posts/show.html.haml +8 -0
  340. data/app/views/profile_fields/_postal_address_flag_switch.html.haml +21 -0
  341. data/app/views/profile_fields/_profile_field.html.haml +41 -0
  342. data/app/views/profile_fields/create.js.erb +26 -0
  343. data/app/views/profile_fields/destroy.js.erb +3 -0
  344. data/app/views/profiles/_add_profile_field_button.html.haml +15 -0
  345. data/app/views/profiles/_profile_section_ul.html.haml +8 -0
  346. data/app/views/profiles/_section.html.haml +28 -0
  347. data/app/views/profiles/_send_group_message_button.html.haml +4 -0
  348. data/app/views/root/_latest_members_box.html.haml +19 -0
  349. data/app/views/root/_start_page_elements.html.haml +0 -0
  350. data/app/views/root/_what_is_new.html.haml +21 -0
  351. data/app/views/search/_preview_blog_post.html.haml +1 -0
  352. data/app/views/search/_preview_corporation.html.haml +5 -0
  353. data/app/views/search/_preview_group.html.haml +4 -0
  354. data/app/views/search/_preview_page.html.haml +11 -0
  355. data/app/views/search/_preview_user.html.haml +14 -0
  356. data/app/views/search/index.html.haml +42 -0
  357. data/app/views/setup/index.html.haml +56 -0
  358. data/app/views/shared/_add_structureable.html.haml +22 -0
  359. data/app/views/shared/_authorization_info.html.haml +22 -0
  360. data/app/views/shared/_flags.html.haml +5 -0
  361. data/app/views/shared/_markdown_help.html.haml +4 -0
  362. data/app/views/shared/_search_box.html.haml +2 -0
  363. data/app/views/shared/_upcoming_events.html.haml +33 -0
  364. data/app/views/statistics/index.html.haml +16 -0
  365. data/app/views/statistics/show.html.haml +13 -0
  366. data/app/views/terms_of_use/_checkbox.html.haml +1 -0
  367. data/app/views/terms_of_use/_terms.html.haml +1 -0
  368. data/app/views/terms_of_use/index.html.haml +19 -0
  369. data/app/views/user_account_mailer/welcome_email.html.erb +32 -0
  370. data/app/views/user_accounts/_change_password.html.haml +149 -0
  371. data/app/views/user_accounts/_user_account.html.haml +39 -0
  372. data/app/views/user_group_memberships/_list_item.html.haml +9 -0
  373. data/app/views/user_group_memberships/_memberships_table.html.haml +56 -0
  374. data/app/views/user_group_memberships/_new.html.haml +18 -0
  375. data/app/views/user_group_memberships/create.js.erb +9 -0
  376. data/app/views/user_group_memberships/index.html.haml +5 -0
  377. data/app/views/user_settings/show.html.haml +36 -0
  378. data/app/views/users/_avatar.html.haml +16 -0
  379. data/app/views/users/_communication_box.html.haml +8 -0
  380. data/app/views/users/_corporate_vita.html.haml +23 -0
  381. data/app/views/users/_dead_badge.html.haml +3 -0
  382. data/app/views/users/_deceased_modal.html.haml +24 -0
  383. data/app/views/users/_hidden_badge.html.haml +4 -0
  384. data/app/views/users/_hidden_flag_switch.html.haml +20 -0
  385. data/app/views/users/_special_general_info_fields.html.haml +10 -0
  386. data/app/views/users/_user_corporation_attribute.html.haml +6 -0
  387. data/app/views/users/_user_name_attribute.html.haml +4 -0
  388. data/app/views/users/_user_title.html.haml +5 -0
  389. data/app/views/users/_workflow_triggers.html.haml +23 -0
  390. data/app/views/users/new.html.haml +55 -0
  391. data/app/views/users/show.html.haml +79 -0
  392. data/config/environment.rb +5 -0
  393. data/config/initializers/active_record_cache_extension.rb +1 -0
  394. data/config/initializers/active_record_find_by_extension.rb +1 -0
  395. data/config/initializers/active_record_flagable_extension.rb +2 -0
  396. data/config/initializers/active_record_json_url_extension.rb +1 -0
  397. data/config/initializers/active_record_may_need_review_extension.rb +2 -0
  398. data/config/initializers/active_record_metric_events_extension.rb +1 -0
  399. data/config/initializers/active_record_navable_extension.rb +6 -0
  400. data/config/initializers/active_record_profileable_extension.rb +4 -0
  401. data/config/initializers/active_record_read_only_extension.rb +1 -0
  402. data/config/initializers/active_record_structureable_extension.rb +3 -0
  403. data/config/initializers/active_record_update_attributes_bip_extension.rb +1 -0
  404. data/config/initializers/array_extension.rb +1 -0
  405. data/config/initializers/best_in_place_display_definitions.rb +31 -0
  406. data/config/initializers/cache_store_extension.rb +1 -0
  407. data/config/initializers/devise.rb +240 -0
  408. data/config/initializers/fnordmetric.rb +14 -0
  409. data/config/initializers/formtastic.rb +76 -0
  410. data/config/initializers/group_type_column_patches.rb +11 -0
  411. data/config/initializers/mime_types.rb +1 -0
  412. data/config/initializers/mini_profiler.rb +32 -0
  413. data/config/initializers/object_to_b_extension.rb +1 -0
  414. data/config/initializers/refile.rb +22 -0
  415. data/config/initializers/sidekiq.rb +12 -0
  416. data/config/locales/attachments/de.yml +33 -0
  417. data/config/locales/bookmarks/de.yml +3 -0
  418. data/config/locales/bookmarks/en.yml +3 -0
  419. data/config/locales/common_expressions/de.yml +5 -0
  420. data/config/locales/common_expressions/en.yml +5 -0
  421. data/config/locales/companies/de.yml +4 -0
  422. data/config/locales/companies/en.yml +4 -0
  423. data/config/locales/de.yml +30 -0
  424. data/config/locales/devise/de.yml +60 -0
  425. data/config/locales/devise/en.yml +62 -0
  426. data/config/locales/en.yml +25 -0
  427. data/config/locales/events/de.yml +34 -0
  428. data/config/locales/events/en.yml +34 -0
  429. data/config/locales/forms/de.yml +3 -0
  430. data/config/locales/groups/de.yml +56 -0
  431. data/config/locales/groups/en.yml +47 -0
  432. data/config/locales/officers/de.yml +10 -0
  433. data/config/locales/pages/de.yml +15 -0
  434. data/config/locales/pages/en.yml +14 -0
  435. data/config/locales/pagination/de.yml +6 -0
  436. data/config/locales/pagination/en.yml +5 -0
  437. data/config/locales/password_strength/de.yml +9 -0
  438. data/config/locales/password_strength/en.yml +9 -0
  439. data/config/locales/posts/de.yml +9 -0
  440. data/config/locales/profile_fields/de.yml +78 -0
  441. data/config/locales/profile_fields/en.yml +22 -0
  442. data/config/locales/profiles/de.yml +47 -0
  443. data/config/locales/profiles/en.yml +44 -0
  444. data/config/locales/roles/de.yml +9 -0
  445. data/config/locales/root/de.yml +3 -0
  446. data/config/locales/root/en.yml +3 -0
  447. data/config/locales/search/de.yml +11 -0
  448. data/config/locales/search/en.yml +11 -0
  449. data/config/locales/sessions/de.yml +37 -0
  450. data/config/locales/sessions/en.yml +37 -0
  451. data/config/locales/setup/de.yml +26 -0
  452. data/config/locales/setup/en.yml +26 -0
  453. data/config/locales/statistics/de.yml +6 -0
  454. data/config/locales/terms_of_use/de.yml +6 -0
  455. data/config/locales/tools/de.yml +9 -0
  456. data/config/locales/tools/en.yml +9 -0
  457. data/config/locales/user_accounts/de.yml +16 -0
  458. data/config/locales/user_accounts/en.yml +13 -0
  459. data/config/locales/user_settings/de.yml +9 -0
  460. data/config/locales/users/de.yml +82 -0
  461. data/config/locales/users/en.yml +51 -0
  462. data/config/locales/workflows/de.yml +4 -0
  463. data/config/locales/workflows/en.yml +4 -0
  464. data/config/routes.rb +104 -0
  465. data/db/migrate/20120403002734_create_users.rb +12 -0
  466. data/db/migrate/20120403011601_create_profile_fields.rb +11 -0
  467. data/db/migrate/20120403161549_remove_user_email_column.rb +5 -0
  468. data/db/migrate/20120405222050_encrypt_password.rb +8 -0
  469. data/db/migrate/20120425161138_create_dag_links.rb +14 -0
  470. data/db/migrate/20120425162644_create_pages.rb +10 -0
  471. data/db/migrate/20120426023322_create_groups.rb +9 -0
  472. data/db/migrate/20120426090436_create_nav_nodes.rb +18 -0
  473. data/db/migrate/20120427021934_create_user_accounts.rb +12 -0
  474. data/db/migrate/20120427044338_add_foreign_key_to_user_accounts.rb +7 -0
  475. data/db/migrate/20120427150156_add_group_token.rb +8 -0
  476. data/db/migrate/20120507165551_make_profile_fields_polymorphic.rb +11 -0
  477. data/db/migrate/20120508130729_add_profile_field_acts_as_tree.rb +9 -0
  478. data/db/migrate/20120508152233_change_profile_field_value_to_text.rb +9 -0
  479. data/db/migrate/20120508201550_add_group_internal_token.rb +11 -0
  480. data/db/migrate/20120511090234_create_workflows.rb +9 -0
  481. data/db/migrate/20120701115059_add_password_digest_to_user_accounts.rb +5 -0
  482. data/db/migrate/20120710193308_remove_salt_from_user_accounts.rb +5 -0
  483. data/db/migrate/20120713102445_add_deleted_at_to_dag_links.rb +5 -0
  484. data/db/migrate/20120722005022_create_workflow_kit_workflows.workflow_kit.rb +11 -0
  485. data/db/migrate/20120722005023_create_workflow_kit_steps.workflow_kit.rb +12 -0
  486. data/db/migrate/20120722005024_create_workflow_kit_parameters.workflow_kit.rb +12 -0
  487. data/db/migrate/20120723165226_add_female_to_users.rb +5 -0
  488. data/db/migrate/20120811140509_create_flags.rb +11 -0
  489. data/db/migrate/20120814100529_create_attachments.rb +13 -0
  490. data/db/migrate/20120815205610_add_content_type_and_file_size_to_attachments.rb +6 -0
  491. data/db/migrate/20130118220014_add_relationships_table_without_dag.rb +10 -0
  492. data/db/migrate/20130207214331_create_events.rb +12 -0
  493. data/db/migrate/20130208215253_create_status_group_membership_infos.rb +11 -0
  494. data/db/migrate/20130220184943_create_stars.rb +11 -0
  495. data/db/migrate/20130309193623_add_devise_to_user_accounts.rb +72 -0
  496. data/db/migrate/20130310003840_rename_stars_to_bookmarks.rb +9 -0
  497. data/db/migrate/20130310004622_fix_column_names_for_bookmarks.rb +6 -0
  498. data/db/migrate/20130313211414_create_geo_infos.rb +13 -0
  499. data/db/migrate/20130313234131_create_geo_locations.rb +16 -0
  500. data/db/migrate/20130314011638_drop_geo_infos.rb +5 -0
  501. data/db/migrate/20130315072759_add_invalid_to_geo_location.rb +5 -0
  502. data/db/migrate/20130315073149_exchange_invalid_for_queried_at_in_geo_location.rb +8 -0
  503. data/db/migrate/20130320003051_add_redirect_to_to_page.rb +5 -0
  504. data/db/migrate/20130329231657_create_posts.rb +15 -0
  505. data/db/migrate/20130404223735_add_entire_message_to_posts.rb +5 -0
  506. data/db/migrate/20130409192959_add_author_to_page.rb +5 -0
  507. data/db/migrate/20130908011215_add_type_to_pages.rb +5 -0
  508. data/db/migrate/20131115114715_validity_range_for_dag_links.rb +16 -0
  509. data/db/migrate/20140611170430_create_activities.rb +23 -0
  510. data/db/migrate/20140808223512_create_last_seen_activities.rb +12 -0
  511. data/db/migrate/20141008101744_add_location_to_events.rb +5 -0
  512. data/db/migrate/20141010130344_add_publish_on_website_to_events.rb +6 -0
  513. data/db/migrate/20141010134227_add_auth_token_to_user_accounts.rb +5 -0
  514. data/db/migrate/20141018143323_add_accepted_terms_to_users.rb +6 -0
  515. data/db/migrate/20141018221659_add_author_to_attachments.rb +5 -0
  516. data/db/migrate/20141102223954_add_body_to_groups.rb +5 -0
  517. data/db/migrate/20141110193830_create_settings.rb +17 -0
  518. data/db/migrate/20141202140522_add_indices.rb +6 -0
  519. data/db/migrate/20141209161946_add_keys.rb +20 -0
  520. data/db/migrate/20150127013809_add_incognito_to_users.rb +5 -0
  521. data/db/migrate/20150129194501_add_indices_for_polymorphic_references.rb +13 -0
  522. data/db/migrate/20150304192448_add_type_to_groups.rb +5 -0
  523. data/db/migrate/20150313221004_add_avatar_id_to_users.rb +5 -0
  524. data/lib/best_in_place/controller_extensions.rb +25 -0
  525. data/lib/best_in_place/helper.rb +127 -0
  526. data/lib/tasks/db_bootstrap.rake +37 -0
  527. data/lib/tasks/your_platform_tasks.rake +4 -0
  528. data/lib/templates/erb/scaffold/_form.html.erb +11 -0
  529. data/lib/your_platform.rb +6 -2
  530. data/lib/your_platform/engine.rb +127 -0
  531. data/lib/your_platform/version.rb +1 -1
  532. data/spec/factories/attachment.rb +12 -0
  533. data/spec/factories/blog_post.rb +10 -0
  534. data/spec/factories/company.rb +7 -0
  535. data/spec/factories/corporation.rb +20 -0
  536. data/spec/factories/event.rb +13 -0
  537. data/spec/factories/group.rb +36 -0
  538. data/spec/factories/html_email.eml +1059 -0
  539. data/spec/factories/mail_message.rb +30 -0
  540. data/spec/factories/page.rb +10 -0
  541. data/spec/factories/relationship.rb +13 -0
  542. data/spec/factories/status_group_membership.rb +21 -0
  543. data/spec/factories/user.rb +97 -0
  544. data/spec/factories/workflow.rb +44 -0
  545. data/spec/features/blog_post_spec.rb +46 -0
  546. data/spec/features/corporate_vita_events_spec.rb +114 -0
  547. data/spec/features/corporate_vita_spec.rb +258 -0
  548. data/spec/features/edit_mode_after_clicking_a_link_spec.rb +20 -0
  549. data/spec/features/events_spec.rb +356 -0
  550. data/spec/features/group_export_spec.rb +19 -0
  551. data/spec/features/group_post_spec.rb +89 -0
  552. data/spec/features/groups_of_groups_page_spec.rb +67 -0
  553. data/spec/features/groups_page_spec.rb +66 -0
  554. data/spec/features/groups_table_spec.rb +32 -0
  555. data/spec/features/help_page_spec.rb +22 -0
  556. data/spec/features/intranet_root_page_spec.rb +18 -0
  557. data/spec/features/locales_spec.rb +36 -0
  558. data/spec/features/maps_spec.rb +53 -0
  559. data/spec/features/mini_profiler_spec.rb +37 -0
  560. data/spec/features/officers_spec.rb +61 -0
  561. data/spec/features/page_redirects_spec.rb +23 -0
  562. data/spec/features/page_spec.rb +20 -0
  563. data/spec/features/postal_address_flag_spec.rb +46 -0
  564. data/spec/features/relationships_on_user_page_spec.rb +78 -0
  565. data/spec/features/review_membership_spec.rb +44 -0
  566. data/spec/features/search_field_spec.rb +121 -0
  567. data/spec/features/setup_spec.rb +63 -0
  568. data/spec/features/user_change_date_of_birth_spec.rb +26 -0
  569. data/spec/features/vertical_nav_spec.rb +27 -0
  570. data/spec/features/what_is_new_box_spec.rb +33 -0
  571. data/spec/helpers/attachments_helper_spec.rb +15 -0
  572. data/spec/models/ability_spec.rb +93 -0
  573. data/spec/models/active_record_cache_extension_spec.rb +177 -0
  574. data/spec/models/active_record_find_by_extension_spec.rb +26 -0
  575. data/spec/models/active_record_json_url_extension_spec.rb +79 -0
  576. data/spec/models/address_label_spec.rb +144 -0
  577. data/spec/models/app_version_spec.rb +38 -0
  578. data/spec/models/attachment_spec.rb +5 -0
  579. data/spec/models/bookmark_spec.rb +70 -0
  580. data/spec/models/concerns/user_corporations_spec.rb +71 -0
  581. data/spec/models/corporation_spec.rb +128 -0
  582. data/spec/models/dag_link_spec.rb +48 -0
  583. data/spec/models/event_spec.rb +267 -0
  584. data/spec/models/flag_spec.rb +20 -0
  585. data/spec/models/flagable_spec.rb +55 -0
  586. data/spec/models/geo_location_spec.rb +126 -0
  587. data/spec/models/group_mixins/corporations_spec.rb +95 -0
  588. data/spec/models/group_mixins/everyone_spec.rb +64 -0
  589. data/spec/models/group_mixins/guests_spec.rb +75 -0
  590. data/spec/models/group_mixins/hidden_users_spec.rb +21 -0
  591. data/spec/models/group_mixins/import_spec.rb +93 -0
  592. data/spec/models/group_mixins/memberships_spec.rb +303 -0
  593. data/spec/models/group_mixins/officers_spec.rb +63 -0
  594. data/spec/models/group_mixins/roles_spec.rb +46 -0
  595. data/spec/models/group_spec.rb +341 -0
  596. data/spec/models/list_export_spec.rb +155 -0
  597. data/spec/models/may_need_review_spec.rb +114 -0
  598. data/spec/models/nav_node_spec.rb +277 -0
  599. data/spec/models/navable_spec.rb +54 -0
  600. data/spec/models/page_spec.rb +185 -0
  601. data/spec/models/post_spec.rb +271 -0
  602. data/spec/models/profile_field_mixins/has_child_profile_fields_spec.rb +73 -0
  603. data/spec/models/profile_field_spec.rb +482 -0
  604. data/spec/models/profile_section_spec.rb +89 -0
  605. data/spec/models/profile_spec.rb +74 -0
  606. data/spec/models/profileable_mixins/adress_spec.rb +93 -0
  607. data/spec/models/profileable_spec.rb +152 -0
  608. data/spec/models/relationship_spec.rb +113 -0
  609. data/spec/models/status_group_membership_spec.rb +350 -0
  610. data/spec/models/status_group_spec.rb +103 -0
  611. data/spec/models/structureable_mixins/has_special_groups_spec.rb +479 -0
  612. data/spec/models/structureable_mixins/roles_spec.rb +517 -0
  613. data/spec/models/structureable_spec.rb +128 -0
  614. data/spec/models/user_account_spec.rb +142 -0
  615. data/spec/models/user_alias_spec.rb +57 -0
  616. data/spec/models/user_group_membership_mixins/validity_range_for_indirect_memberships_spec.rb +291 -0
  617. data/spec/models/user_group_membership_mixins/validity_range_spec.rb +293 -0
  618. data/spec/models/user_group_membership_spec.rb +428 -0
  619. data/spec/models/user_mixins/identification_spec.rb +27 -0
  620. data/spec/models/user_mixins/memberships_spec.rb +138 -0
  621. data/spec/models/user_spec.rb +1794 -0
  622. data/spec/old_yp_spec_helper.rb +46 -0
  623. data/spec/spec_helper.rb +350 -0
  624. data/spec/support/auto_complete.rb +22 -0
  625. data/spec/support/capybara/flash_helpers.rb +37 -0
  626. data/spec/support/capybara/profile_steps.rb +73 -0
  627. data/spec/support/capybara/session_steps.rb +53 -0
  628. data/spec/support/capybara/user_account_helpers.rb +15 -0
  629. data/spec/support/debug.rb +8 -0
  630. data/spec/support/devise-controller_macros.rb +15 -0
  631. data/spec/support/geocoder/stubs.rb +60 -0
  632. data/spec/support/press_enter.rb +15 -0
  633. data/spec/support/time_travel.rb +9 -0
  634. data/spec/support/uploads/image-upload.png +0 -0
  635. data/spec/support/uploads/pdf-upload.pdf +0 -0
  636. data/spec/support/wait_for_ajax.rb +39 -0
  637. data/spec/support/wait_for_cache.rb +7 -0
  638. data/spec/uploaders/attachment_uploader_spec.rb +47 -0
  639. data/vendor/assets/images/flags.png +0 -0
  640. data/vendor/assets/images/galleria/classic-loader.gif +0 -0
  641. data/vendor/assets/images/galleria/classic-map.png +0 -0
  642. data/vendor/assets/javascripts/best_in_place_datetime.js.coffee +45 -0
  643. data/vendor/assets/javascripts/galleria-classic.js +100 -0
  644. data/vendor/assets/javascripts/galleria.js +6919 -0
  645. data/vendor/assets/javascripts/gmaps4rails.js +2 -0
  646. data/vendor/assets/javascripts/gmaps4rails/all.js +1 -0
  647. data/vendor/assets/javascripts/gmaps4rails/base.coffee +1 -0
  648. data/vendor/assets/javascripts/gmaps4rails/base/common.coffee +43 -0
  649. data/vendor/assets/javascripts/gmaps4rails/base/configuration.coffee +7 -0
  650. data/vendor/assets/javascripts/gmaps4rails/base/gmaps.coffee +13 -0
  651. data/vendor/assets/javascripts/gmaps4rails/base/interfaces/basic_interface.coffee +15 -0
  652. data/vendor/assets/javascripts/gmaps4rails/base/interfaces/controller_interface.coffee +15 -0
  653. data/vendor/assets/javascripts/gmaps4rails/base/interfaces/map_interface.coffee +27 -0
  654. data/vendor/assets/javascripts/gmaps4rails/base/interfaces/marker_interface.coffee +15 -0
  655. data/vendor/assets/javascripts/gmaps4rails/base/main.coffee +124 -0
  656. data/vendor/assets/javascripts/gmaps4rails/base/main_controller_extensions/circle_controller.coffee +29 -0
  657. data/vendor/assets/javascripts/gmaps4rails/base/main_controller_extensions/kml_controller.coffee +5 -0
  658. data/vendor/assets/javascripts/gmaps4rails/base/main_controller_extensions/marker_controller.coffee +76 -0
  659. data/vendor/assets/javascripts/gmaps4rails/base/main_controller_extensions/polygon_controller.coffee +29 -0
  660. data/vendor/assets/javascripts/gmaps4rails/base/main_controller_extensions/polyline_controller.coffee +29 -0
  661. data/vendor/assets/javascripts/gmaps4rails/base/objects/circle.coffee +12 -0
  662. data/vendor/assets/javascripts/gmaps4rails/base/objects/kml.coffee +8 -0
  663. data/vendor/assets/javascripts/gmaps4rails/base/objects/map.coffee +62 -0
  664. data/vendor/assets/javascripts/gmaps4rails/base/objects/marker.coffee +24 -0
  665. data/vendor/assets/javascripts/gmaps4rails/base/objects/polygon.coffee +11 -0
  666. data/vendor/assets/javascripts/gmaps4rails/base/objects/polyline.coffee +11 -0
  667. data/vendor/assets/javascripts/gmaps4rails/bing.coffee +1 -0
  668. data/vendor/assets/javascripts/gmaps4rails/bing/main.coffee +29 -0
  669. data/vendor/assets/javascripts/gmaps4rails/bing/objects/map.coffee +63 -0
  670. data/vendor/assets/javascripts/gmaps4rails/bing/objects/marker.coffee +78 -0
  671. data/vendor/assets/javascripts/gmaps4rails/bing/shared.coffee +20 -0
  672. data/vendor/assets/javascripts/gmaps4rails/google.coffee +1 -0
  673. data/vendor/assets/javascripts/gmaps4rails/google/main.coffee +47 -0
  674. data/vendor/assets/javascripts/gmaps4rails/google/objects/circle.coffee +38 -0
  675. data/vendor/assets/javascripts/gmaps4rails/google/objects/kml.coffee +16 -0
  676. data/vendor/assets/javascripts/gmaps4rails/google/objects/map.coffee +71 -0
  677. data/vendor/assets/javascripts/gmaps4rails/google/objects/marker.coffee +114 -0
  678. data/vendor/assets/javascripts/gmaps4rails/google/objects/polygon.coffee +38 -0
  679. data/vendor/assets/javascripts/gmaps4rails/google/objects/polyline.coffee +49 -0
  680. data/vendor/assets/javascripts/gmaps4rails/google/shared.coffee +27 -0
  681. data/vendor/assets/javascripts/gmaps4rails/openlayers.coffee +1 -0
  682. data/vendor/assets/javascripts/gmaps4rails/openlayers/main.coffee +138 -0
  683. data/vendor/assets/javascripts/gmaps4rails/openlayers/objects/map.coffee +49 -0
  684. data/vendor/assets/javascripts/gmaps4rails/openlayers/objects/marker.coffee +68 -0
  685. data/vendor/assets/javascripts/gmaps4rails/openlayers/objects/polyline.coffee +39 -0
  686. data/vendor/assets/javascripts/gmaps4rails/openlayers/shared.coffee +19 -0
  687. data/vendor/assets/javascripts/jquery-ui-timepicker-addon.js +2223 -0
  688. data/vendor/assets/javascripts/jquery-ui-timepicker-de.js +26 -0
  689. data/vendor/assets/javascripts/jquery.ui.datepicker-de.js +23 -0
  690. data/vendor/assets/javascripts/password_strength.js +149 -0
  691. data/vendor/assets/javascripts/zxcvbn.js +43 -0
  692. data/vendor/assets/stylesheets/flags.css.scss +259 -0
  693. data/vendor/assets/stylesheets/galleria-classic.css.scss +239 -0
  694. data/vendor/assets/stylesheets/gmaps4rails.css +24 -0
  695. data/vendor/assets/stylesheets/mercury.css +24 -0
  696. data/vendor/scripts/bashpass/README.md +29 -0
  697. data/vendor/scripts/bashpass/bashpass +124 -0
  698. data/vendor/scripts/bashpass/bashpass-APACHE-LICENSE +201 -0
  699. data/vendor/scripts/bashpass/german.dic +40794 -0
  700. metadata +1540 -16
  701. data/.gitignore +0 -17
  702. data/Gemfile +0 -4
  703. data/LICENSE.txt +0 -4
  704. data/your_platform.gemspec +0 -19
@@ -0,0 +1,293 @@
1
+ require 'spec_helper'
2
+
3
+ describe UserGroupMembershipMixins::ValidityRange do
4
+
5
+ before do
6
+ @user = create(:user)
7
+ @group = create(:group)
8
+ @membership = UserGroupMembership.create(user: @user, group: @group)
9
+ @membership.reload
10
+ end
11
+
12
+ specify "preliminaries" do
13
+ @membership.should_not be_changed
14
+ @membership.id.should be_kind_of Integer
15
+ @membership.should be_kind_of UserGroupMembership
16
+ end
17
+
18
+ describe "#valid_from" do
19
+ subject { @membership.valid_from }
20
+ it { should be_kind_of Time }
21
+ it "should be set to the created_at date by default" do
22
+ subject.to_i.should > @membership.created_at.to_i-2
23
+ subject.to_i.should < @membership.created_at.to_i+2
24
+ end
25
+ end
26
+ describe "#valid_to" do
27
+ subject { @membership.valid_to }
28
+ describe "being unset" do
29
+ it { should == nil }
30
+ end
31
+ describe "being set" do
32
+ before { @membership.valid_to = 1.hour.ago }
33
+ it { should be_kind_of Time }
34
+ end
35
+ end
36
+
37
+ describe "#valid_from_localized_date" do
38
+ subject { @membership.valid_from_localized_date }
39
+ describe "if no valid_from given" do
40
+ before { @membership.valid_from = nil }
41
+ it { should == "" }
42
+ end
43
+ describe "if a datetime given" do
44
+ before do
45
+ @time = "1.1.2013 12:30 UTC".to_datetime
46
+ @membership.valid_from = @time
47
+ end
48
+ it { should == "01.01.2013" }
49
+ end
50
+ end
51
+ describe "#valid_from_localized_date=" do
52
+ describe "setting a date string" do
53
+ subject { @membership.valid_from_localized_date = "1.1.2013" }
54
+ it "should set the correct date" do
55
+ subject
56
+ @membership.valid_from.to_date.should == "1.1.2013".to_date
57
+ end
58
+ end
59
+ describe "setting an empty string" do
60
+ subject { @membership.valid_from_localized_date = "" }
61
+ it "should set valid_from to nil" do
62
+ subject
63
+ @membership.valid_from.should == nil
64
+ end
65
+ end
66
+ describe "setting an invalid date" do
67
+ subject { @membership.valid_from_localized_date = "FOO BAR" }
68
+ it "should raise an error" do
69
+ expect { subject }.to raise_error
70
+ end
71
+ end
72
+ end
73
+
74
+ describe "#make_invalid" do
75
+ describe "with time argument" do
76
+ before { @time = 1.hour.ago }
77
+ subject { @membership.make_invalid(@time) }
78
+ it "should set the valid_to argument to the given time" do
79
+ @membership.valid_to.should == nil
80
+ subject
81
+ @membership.valid_to.should == @time
82
+ end
83
+ it "should mark the membership as invalid" do
84
+ @membership.currently_valid?.should == true
85
+ subject
86
+ @membership.currently_valid?.should == false
87
+ end
88
+ it "should return the membership" do
89
+ subject.should == @membership
90
+ end
91
+ describe "with 'at: time' argument" do
92
+ subject { @membership.make_invalid at: @time }
93
+ it "should set the valid_to argument to the given time" do
94
+ @membership.valid_to.should == nil
95
+ subject
96
+ @membership.valid_to.should == @time
97
+ end
98
+ end
99
+ end
100
+ describe "without argument" do
101
+ subject { @membership.make_invalid }
102
+ it "should set the end of the validity to the current time" do
103
+ @membership.valid_to.should == nil
104
+ subject
105
+ @membership.valid_to.to_i.should > Time.zone.now.to_i-2
106
+ @membership.valid_to.to_i.should < Time.zone.now.to_i+2
107
+ end
108
+ end
109
+ end
110
+
111
+ describe "#invalidate" do
112
+ describe "with time argument" do
113
+ before { @time = 1.hour.ago }
114
+ subject { @membership.invalidate(@time) }
115
+ it "should set the valid_to argument to the given time" do
116
+ @membership.valid_to.should == nil
117
+ subject
118
+ @membership.valid_to.should == @time
119
+ end
120
+ it "should mark the membership as invalid" do
121
+ @membership.currently_valid?.should == true
122
+ subject
123
+ @membership.currently_valid?.should == false
124
+ end
125
+ it "should return the membership" do
126
+ subject.should == @membership
127
+ end
128
+ describe "with 'at: time' argument" do
129
+ subject { @membership.invalidate at: @time }
130
+ it "should set the valid_to argument to the given time" do
131
+ @membership.valid_to.should == nil
132
+ subject
133
+ @membership.valid_to.should == @time
134
+ end
135
+ end
136
+ end
137
+ describe "without argument" do
138
+ subject { @membership.invalidate }
139
+ it "should set the end of the validity to the current time" do
140
+ @membership.valid_to.should == nil
141
+ subject
142
+ @membership.valid_to.to_i.should == Time.zone.now.to_i
143
+ end
144
+ end
145
+ end
146
+
147
+ describe "#currently_valid?" do
148
+ subject { @membership.currently_valid? }
149
+ it "should check whether the membership is valid in terms of the validity range at present time" do
150
+ @membership.currently_valid?.should == true
151
+ @membership.invalidate
152
+ @membership.currently_valid?.should == false
153
+ end
154
+ end
155
+ describe "#valid_at?(time)" do
156
+ before do
157
+ @time = 1.hour.ago
158
+ @membership.update_attribute(:valid_from, @time)
159
+ end
160
+ subject { @membership.valid_at? @time }
161
+ it "should check whether the membership is valid in terms of the validity range at the given time" do
162
+ @membership.valid_at?(@time).should == true
163
+ @membership.invalidate at: (@time - 1.hour)
164
+ @membership.valid_at?(@time).should == false
165
+ end
166
+ end
167
+
168
+ describe "(temporal scopes)" do
169
+ before do
170
+ @valid_membership = @membership
171
+ @valid_membership.update_attribute(:valid_from, 2.hours.ago)
172
+ @group2 = create(:group)
173
+ @time = 1.hour.ago
174
+ @invalid_membership = UserGroupMembership.create(user: @user, group: @group2)
175
+ @invalid_membership.valid_from = 2.hours.ago
176
+ @invalid_membership.invalidate(@time)
177
+ @query = UserGroupMembership.find_all_by_user(@user)
178
+ end
179
+
180
+ describe "#at_time" do
181
+ subject { @query.at_time(@time + 1.minute) }
182
+ it "should limit the search to match the validity range" do
183
+ subject.should include @valid_membership
184
+ subject.should_not include @invalid_membership
185
+ end
186
+ end
187
+
188
+ describe "#only_valid" do
189
+ subject { @query.only_valid }
190
+ it "should return only memberships that are currently valid" do
191
+ subject.should include @valid_membership
192
+ subject.should_not include @invalid_membership
193
+ end
194
+ end
195
+
196
+ describe "#only_invalid" do
197
+ subject { @query.only_invalid }
198
+ it "should return only memberships that are currently invalid" do
199
+ subject.should_not include @valid_membership
200
+ subject.should include @invalid_membership
201
+ end
202
+ end
203
+
204
+ describe "#with_invalid" do
205
+ subject { @query.with_invalid }
206
+ it "should return both valid and invalid memberships" do
207
+ subject.should include @valid_membership
208
+ subject.should include @invalid_membership
209
+ end
210
+ end
211
+
212
+ describe "(by default)" do
213
+ subject { @query }
214
+ it "should return only currently valid memberships" do
215
+ subject.should include @valid_membership
216
+ subject.should_not include @invalid_membership
217
+ end
218
+ end
219
+
220
+ describe "#now" do
221
+ subject { @query.now }
222
+ it "should return only memberships that are currently valid" do
223
+ subject.should include @valid_membership
224
+ subject.should_not include @invalid_membership
225
+ end
226
+ end
227
+ describe "#in_the_past" do
228
+ subject { @query.in_the_past }
229
+ it "should return only memberships that are currently invalid" do
230
+ subject.should_not include @valid_membership
231
+ subject.should include @invalid_membership
232
+ end
233
+ end
234
+ describe "#now_and_in_the_past" do
235
+ subject { @query.now_and_in_the_past }
236
+ it "should return both valid and invalid memberships" do
237
+ subject.should include @valid_membership
238
+ subject.should include @invalid_membership
239
+ end
240
+ end
241
+ end
242
+
243
+ describe "(validity range constraints)", :focus do
244
+ #
245
+ # @time @now
246
+ # ====================================================> time
247
+ # |------------------------------------> @membership1
248
+ # |-----------------------> @membership2
249
+ # |-----------| @membership3
250
+ # ----------------------------------------------------> @membership4
251
+ #
252
+ #
253
+ before do
254
+ @user1 = create :user
255
+ @user2 = create :user
256
+ @user3 = create :user
257
+ @user4 = create :user
258
+ @time = 1.year.ago
259
+ @now = Time.zone.now
260
+ @membership1 = @group.assign_user @user1, at: @time - 1.day
261
+ @membership2 = @group.assign_user @user2, at: @time + 1.day
262
+ @membership3 = @group.assign_user @user3, at: @time + 1.day; @membership3.invalidate at: 1.month.ago
263
+ @membership4 = @group.assign_user @user4; @membership4.update_attribute(:valid_from, nil)
264
+ end
265
+ specify 'prelims' do
266
+ @membership4.valid_from.should == nil
267
+ @membership4.valid_to.should == nil
268
+ @group.memberships.last.id.should == @membership4.id
269
+ @group.memberships.last.valid_from.should == nil
270
+ end
271
+ describe ".now_and_in_the_past.started_after(time)" do
272
+ subject { @group.memberships.now_and_in_the_past.started_after(@time) }
273
+ it { should include @membership2 }
274
+ it { should include @membership3 }
275
+ it { should_not include @membership1 }
276
+ it { should_not include @membership4 }
277
+ end
278
+ describe ".started_after(time)" do
279
+ subject { @group.memberships.started_after(@time) }
280
+ it { should include @membership2 }
281
+ it { should_not include @membership3 }
282
+ it { should_not include @membership1 }
283
+ it { should_not include @membership4 }
284
+ end
285
+ describe "to_a.started_after(time)" do
286
+ subject { @group.memberships.to_a.started_after(@time) }
287
+ it { should include @membership2 }
288
+ it { should_not include @membership3 }
289
+ it { should_not include @membership1 }
290
+ it { should_not include @membership4 }
291
+ end
292
+ end
293
+ end
@@ -0,0 +1,428 @@
1
+ require 'spec_helper'
2
+
3
+ describe UserGroupMembership do
4
+
5
+ before do
6
+ @group = Group.create( name: "Group 1" )
7
+ @super_group = Group.create( name: "Parent Group of Groups 1 and 2" )
8
+ @other_group = Group.create( name: "Group 2" )
9
+ @group.parent_groups << @super_group
10
+ @other_group.parent_groups << @super_group
11
+ @other_user = create(:user)
12
+ @user = User.create( first_name: "John", last_name: "Doe", :alias => "j.doe" )
13
+ end
14
+
15
+ it "should allow to create example group and user and the group structure" do
16
+ @user.should_not == nil
17
+ @group.should_not == nil
18
+ @super_group.should_not == nil
19
+ end
20
+
21
+ def create_membership
22
+ UserGroupMembership.create( user: @user, group: @group )
23
+ end
24
+
25
+ def find_membership
26
+ UserGroupMembership.find_by( user: @user, group: @group )
27
+ end
28
+
29
+ def find_membership_now_and_in_the_past
30
+ UserGroupMembership.find_all_by( user: @user, group: @group ).now_and_in_the_past.first
31
+ end
32
+
33
+ def find_indirect_membership
34
+ UserGroupMembership.find_by( user: @user, group: @super_group )
35
+ end
36
+
37
+ def find_indirect_membership_now_and_in_the_past
38
+ UserGroupMembership.find_all_by( user: @user, group: @super_group ).now_and_in_the_past.first
39
+ end
40
+
41
+ def create_other_membership
42
+ UserGroupMembership.create( user: @user, group: @other_group )
43
+ end
44
+
45
+ def create_another_membership
46
+ UserGroupMembership.create( user: @other_user, group: @group )
47
+ end
48
+
49
+ def find_other_membership
50
+ UserGroupMembership.find_by( user: @user, group: @other_group )
51
+ end
52
+
53
+ def find_other_membership_now_and_in_the_past
54
+ UserGroupMembership.find_all_by( user: @user, group: @other_group).now_and_in_the_past.first
55
+ end
56
+
57
+ def create_memberships
58
+ create_membership
59
+ create_other_membership
60
+ create_another_membership
61
+ # the indirect membership is created implicitly, becuase @group and @super_group are already connected.
62
+ end
63
+
64
+ # Creation Class Method
65
+ # ====================================================================================================
66
+
67
+ describe ".create" do
68
+ it "should create a link between parent and child" do
69
+ UserGroupMembership.create( user: @user, group: @group )
70
+ @user.parents.should include( @group )
71
+ end
72
+ it "should raise an error if argument is missing" do
73
+ expect { UserGroupMembership.create( user: @user ) }.to raise_error RuntimeError
74
+ expect { UserGroupMembership.create( group: @group ) }.to raise_error RuntimeError
75
+ end
76
+ it "should be able to identify a user by its 'user_title'" do
77
+ UserGroupMembership.create( user_title: @user.title, group_id: @group.id )
78
+ @user.parents.should include @group
79
+ end
80
+ end
81
+
82
+ # Finder Class Methods
83
+ # ====================================================================================================
84
+
85
+ describe "Finder Method" do
86
+ before { create_memberships }
87
+
88
+ describe ".find_all_by" do
89
+ it "should find all memberships for a user" do
90
+ UserGroupMembership.find_all_by( user: @user ).should include( find_membership )
91
+ UserGroupMembership.find_all_by( user: @user ).should include( find_indirect_membership )
92
+ end
93
+ it "should find all memberships for a group" do
94
+ UserGroupMembership.find_all_by( group: @group ).should include( find_membership )
95
+ end
96
+ it "should not find memberships that are invalid at the present time" do
97
+ find_membership.update_attribute(:valid_to, 1.hour.ago)
98
+ UserGroupMembership.find_all_by( user: @user )
99
+ .should_not include( find_membership_now_and_in_the_past )
100
+ UserGroupMembership.find_all_by( user: @user )
101
+ .should include find_other_membership
102
+ end
103
+ it "should be able to identify users by 'user_title'" do
104
+ UserGroupMembership.find_all_by( user_title: @user.title ).each do |membership|
105
+ membership.user_id.should == @user.id
106
+ end
107
+ end
108
+ end
109
+ describe ".find_all_by.now_and_in_the_past" do
110
+ before { find_membership.make_invalid }
111
+ it "should find all memberships, including the ones that are invalid at the present time" do
112
+ UserGroupMembership.find_all_by( user: @user ).now_and_in_the_past
113
+ .should include( find_membership_now_and_in_the_past, find_indirect_membership, find_other_membership )
114
+ end
115
+ end
116
+
117
+ describe ".find_by" do
118
+ it "should be the same as .find_by_all.first" do
119
+ UserGroupMembership.find_by( user: @user, group: @group ).should ==
120
+ UserGroupMembership.find_all_by( user: @user, group: @group ).first
121
+ end
122
+ end
123
+
124
+ describe ".find_by_user_and_group" do
125
+ it "should find the right membership" do
126
+ UserGroupMembership.find_by_user_and_group( @user, @group ).should == find_membership
127
+ end
128
+ end
129
+
130
+ describe ".find_all_by_user" do
131
+ it "should find the right memberships" do
132
+ UserGroupMembership.find_all_by_user( @user ).should include( find_membership )
133
+ end
134
+ end
135
+
136
+ describe ".find_all_by_group" do
137
+ it "should find the right memberships" do
138
+ UserGroupMembership.find_all_by_group( @group ).should include( find_membership )
139
+ end
140
+ end
141
+ end
142
+
143
+ describe "#== ( other_membership ), i.e. euality relation, " do
144
+ it "should return true if the two objects represent the same membership" do
145
+ membership = create_membership
146
+ same_membership = find_membership
147
+ membership.should == same_membership
148
+ end
149
+ end
150
+
151
+
152
+ # Access Methods to Associated User and Group
153
+ # ====================================================================================================
154
+
155
+ describe "Access Method to Assiciation" do
156
+ before { @membership = create_membership }
157
+ subject { @membership }
158
+
159
+ describe "#user" do
160
+ its(:user) { should == @user }
161
+ end
162
+ describe "#user=" do
163
+ subject { @membership.user = @other_user }
164
+ it "should assign a user to the membership" do
165
+ @membership.user.should == @user
166
+ subject
167
+ @membership.user.should == @other_user
168
+ end
169
+ end
170
+ describe "#user_id" do
171
+ subject { @membership.user_id }
172
+ it { should == @user.id }
173
+ end
174
+ describe "#user_title" do
175
+ subject { @membership.user_title }
176
+ it { should == @user.title }
177
+ end
178
+ describe "#user_title=" do
179
+ subject { @membership.user_title = @other_user.title }
180
+ it "should assign the user matching the title to the membership" do
181
+ @membership.user.should == @user
182
+ subject
183
+ @membership.user.should == @other_user
184
+ end
185
+ end
186
+ describe "#group" do
187
+ its(:group) { should == @group }
188
+ end
189
+ describe "#group_id" do
190
+ subject { @membership.group_id }
191
+ it { should == @group.id }
192
+ end
193
+ end
194
+
195
+
196
+ # Associated Corporation
197
+ # ====================================================================================================
198
+
199
+ # corporation
200
+ # |-------- group
201
+ # |---( membership )---- user
202
+ #
203
+ describe "#corporation" do
204
+ describe "for the group having a corporation" do
205
+ before do
206
+ @corporation = create( :corporation )
207
+ @group = @corporation.child_groups.create
208
+ @user = create( :user )
209
+ @group.assign_user @user
210
+ end
211
+ subject { UserGroupMembership.find_by_user_and_group( @user, @group ).corporation }
212
+ it { should == @corporation }
213
+ end
214
+ describe "for the group not having a corporation" do
215
+ before do
216
+ @group = create( :group )
217
+ @user = create( :user )
218
+ @group.assign_user @user
219
+ end
220
+ subject { UserGroupMembership.find_by_user_and_group( @user, @group ).corporation }
221
+ it { should == nil }
222
+ end
223
+ describe "for the group being a corporation" do
224
+ before do
225
+ @corporation = create( :corporation )
226
+ @user = create( :user )
227
+ @corporation.assign_user @user
228
+ end
229
+ subject { UserGroupMembership.find_by_user_and_group( @user, @corporation ).corporation }
230
+ it { should == @corporation }
231
+ end
232
+ end
233
+
234
+
235
+
236
+ # Access Methods to Associated Direct Memberships
237
+ # ====================================================================================================
238
+
239
+ describe "#direct_memberships" do
240
+ before {create_memberships }
241
+ describe "for a direct membership" do
242
+ subject { find_membership }
243
+ it "should include only itself (the direct membership)" do
244
+ subject.direct_memberships.should == [ subject ]
245
+ end
246
+ end
247
+ describe "for an indirect membership" do
248
+ subject { find_indirect_membership }
249
+ it "should include the direct membership" do
250
+ subject.direct_memberships.should include( find_membership )
251
+ end
252
+ end
253
+ end
254
+
255
+ describe "#direct_memberships_now_and_in_the_past" do
256
+ before { create_memberships }
257
+ it "should return an ActiveRecord::Relation, i.e. be chainable" do
258
+ find_membership.direct_memberships_now_and_in_the_past.kind_of?( ActiveRecord::Relation ).should be_true
259
+ end
260
+ # it "should be the same as #direct_memberships.now_and_in_the_past" do
261
+ # find_indirect_membership.direct_memberships_now_and_in_the_past.should ==
262
+ # find_indirect_membership.direct_memberships.now_and_in_the_past
263
+ # end
264
+ describe "for a direct membership" do
265
+ it "should include itself (the direct membership)" do
266
+ find_membership.direct_memberships_now_and_in_the_past.should include( find_membership )
267
+ end
268
+ end
269
+ describe "for an indirect membership" do
270
+ it "should include the direct membership" do
271
+ find_indirect_membership.direct_memberships_now_and_in_the_past.should include( find_membership )
272
+ end
273
+ end
274
+ end
275
+
276
+ describe "#direct_groups" do
277
+ before { create_memberships }
278
+ describe "for a direct membership" do
279
+ it "should return an array containing only the own group" do
280
+ find_membership.direct_groups.should == [ find_membership.group ]
281
+ end
282
+ end
283
+ describe "for an indirect membership" do
284
+ it "should return an array containing the direct group" do
285
+ find_indirect_membership.direct_groups.should == [ find_membership.group, find_other_membership.group ]
286
+ end
287
+ end
288
+ end
289
+
290
+
291
+ # Access Methods to Associated Indirect Memberships
292
+ # ====================================================================================================
293
+
294
+ describe "#indirect_memberships" do
295
+ before do
296
+ @membership = UserGroupMembership.create(user: @user, group: @group)
297
+ @indirect_membership = find_indirect_membership
298
+ end
299
+ subject { @membership.indirect_memberships }
300
+ it { should include find_indirect_membership }
301
+ it { should_not include find_membership }
302
+ describe "for invalidated memberships" do
303
+ before do
304
+ @membership.update_attribute(:valid_from, 2.hours.ago)
305
+ @membership.update_attribute(:valid_to, 1.hour.ago)
306
+ end
307
+ it "should still find the indirect memberships" do
308
+ subject.should include @indirect_membership
309
+ end
310
+ end
311
+ end
312
+
313
+
314
+ # More Tests for Indirect Memberships
315
+ # ====================================================================================================
316
+
317
+ describe "Indirect Membership" do
318
+
319
+ before do
320
+ @sub_group = Group.create( name: "Sub Group" )
321
+ @sub_group.parent_groups << @group
322
+ @user.parent_groups << @sub_group
323
+ @membership = UserGroupMembership.find_by_user_and_group( @user, @sub_group )
324
+ @indirect_membership = UserGroupMembership.find_by_user_and_group( @user, @group )
325
+ end
326
+
327
+ subject { @indirect_membership }
328
+
329
+ it "should have the same validity range (valid_from) as the direct membership" do
330
+ @indirect_membership.valid_from.should == @membership.valid_from
331
+ end
332
+
333
+ it "should have the same validity range (valid_to) as the direct membership" do
334
+ @indirect_membership.valid_to.should == @membership.valid_to
335
+ end
336
+
337
+ it "should also effect the direct membership on change of the valid_from date" do
338
+ new_time = 1.hour.ago
339
+ @membership.valid_from = new_time
340
+ @membership.save
341
+ @indirect_membership.valid_from.to_i.should == new_time.to_i
342
+ end
343
+
344
+ it "should also effect the direct membership on change of the valid_to date" do
345
+ new_time = Time.current + 1.hour
346
+ @membership.invalidate
347
+ @membership.valid_to = new_time
348
+ @membership.save
349
+ @indirect_membership.reload
350
+ @indirect_membership.valid_to.to_i.should == new_time.to_i
351
+ end
352
+
353
+ it "should be effected by the direct membership on change of the valid_from date" do
354
+ new_time = 1.hour.ago
355
+ @indirect_membership.valid_from = new_time
356
+ @indirect_membership.save
357
+ @membership.reload
358
+ @membership.valid_from.to_i.should == new_time.to_i
359
+ end
360
+
361
+ it "should be effected by the direct membership on change of the valid_to date" do
362
+ new_time = Time.current + 1.hour
363
+ @membership.invalidate # need to archive the *direct* membership, ...
364
+ @indirect_membership.reload
365
+ @indirect_membership.valid_to = new_time # but can change the time of the *indirect*.
366
+ @indirect_membership.save
367
+ @membership.reload
368
+ @membership.valid_to.to_i.should == new_time.to_i
369
+ end
370
+ end
371
+
372
+ # Methods to Change the Membership
373
+ # ====================================================================================================
374
+
375
+ describe "#move_to_group( group )" do
376
+ before do
377
+ create_membership
378
+ find_membership.move_to_group( @other_group )
379
+ time_travel 2.seconds
380
+ end
381
+ it "should hide old direct membership" do
382
+ find_membership.should == nil
383
+ end
384
+ it "should create a new membership between the user and the given group" do
385
+ find_other_membership.should_not == nil
386
+ end
387
+ end
388
+
389
+
390
+ # Destroy
391
+ # ==========================================================================================
392
+
393
+ describe "#destroy" do
394
+ describe "for nested structures (bug fix)" do
395
+ #
396
+ # @corporation
397
+ # |-------- @status_1 ---------------- @user | p
398
+ # |-------- @group_a | r
399
+ # | |------- @status_2 ---- @user | o
400
+ # | | m
401
+ # |-------- @group_b | o
402
+ # |------- @status_3 ---- @user | t
403
+ # V e
404
+ before do
405
+ @user = create(:user)
406
+ @corporation = create(:corporation)
407
+ @status_1 = @corporation.child_groups.create
408
+ @group_a = @corporation.child_groups.create
409
+ @status_2 = @group_a.child_groups.create
410
+ @group_b = @corporation.child_groups.create
411
+ @status_3 = @group_b.child_groups.create
412
+ @membership_1 = @status_1.assign_user @user, at: 1.year.ago
413
+ @membership_2 = @membership_1.promote_to @status_2, at: 10.minutes.ago
414
+ @membership_3 = @membership_2.promote_to @status_3, at: 2.minutes.ago
415
+ end
416
+ subject do
417
+ @user.parent_groups.each do |group|
418
+ UserGroupMembership.with_invalid.find_by_user_and_group(@user, group).destroy
419
+ end
420
+ end
421
+ it "should not raise an error (bug fix)" do
422
+ expect { subject }.not_to raise_error
423
+ end
424
+ end
425
+ end
426
+
427
+
428
+ end