radiant-reader_group-extension 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. data/.gitignore +2 -0
  2. data/README.markdown +44 -0
  3. data/Rakefile +137 -0
  4. data/VERSION +1 -0
  5. data/app/controllers/admin/group_invitations_controller.rb +84 -0
  6. data/app/controllers/admin/groups_controller.rb +4 -0
  7. data/app/controllers/admin/memberships_controller.rb +42 -0
  8. data/app/controllers/admin/permissions_controller.rb +42 -0
  9. data/app/helpers/admin/groups_helper.rb +36 -0
  10. data/app/models/group.rb +43 -0
  11. data/app/models/membership.rb +13 -0
  12. data/app/models/permission.rb +13 -0
  13. data/app/views/admin/group_invitations/new.html.haml +45 -0
  14. data/app/views/admin/group_invitations/preview.html.haml +63 -0
  15. data/app/views/admin/groups/_add_readers.html.haml +0 -0
  16. data/app/views/admin/groups/_form.html.haml +61 -0
  17. data/app/views/admin/groups/_list_head.html.haml +12 -0
  18. data/app/views/admin/groups/_listed.html.haml +25 -0
  19. data/app/views/admin/groups/edit.html.haml +8 -0
  20. data/app/views/admin/groups/index.html.haml +19 -0
  21. data/app/views/admin/groups/new.html.haml +6 -0
  22. data/app/views/admin/groups/remove.html.haml +31 -0
  23. data/app/views/admin/groups/show.html.haml +41 -0
  24. data/app/views/admin/memberships/_reader.html.haml +9 -0
  25. data/app/views/admin/messages/_list_notes.html.haml +9 -0
  26. data/app/views/admin/messages/_message_description.html.haml +7 -0
  27. data/app/views/admin/messages/_message_group.html.haml +3 -0
  28. data/app/views/admin/pages/_listed.html.haml +16 -0
  29. data/app/views/admin/pages/_page_groups.html.haml +17 -0
  30. data/app/views/admin/permissions/_page.html.haml +24 -0
  31. data/app/views/admin/reader_settings/_group_welcomes.html.haml +11 -0
  32. data/app/views/admin/readers/_reader_groups.html.haml +7 -0
  33. data/app/views/messages/show.html.haml +11 -0
  34. data/app/views/reader_activations/_on_activation.html.haml +10 -0
  35. data/app/views/readers/_memberships.html.haml +11 -0
  36. data/app/views/site/not_allowed.html.haml +4 -0
  37. data/config/routes.rb +8 -0
  38. data/db/migrate/001_create_groups.rb +32 -0
  39. data/db/migrate/20090921125654_group_messages.rb +9 -0
  40. data/db/migrate/20091120083119_groups_public.rb +11 -0
  41. data/lib/admin_messages_controller_extensions.rb +15 -0
  42. data/lib/group_message_tags.rb +82 -0
  43. data/lib/group_ui.rb +37 -0
  44. data/lib/grouped_message.rb +38 -0
  45. data/lib/grouped_model.rb +100 -0
  46. data/lib/grouped_page.rb +59 -0
  47. data/lib/grouped_reader.rb +63 -0
  48. data/lib/reader_activations_controller_extensions.rb +21 -0
  49. data/lib/reader_notifier_extensions.rb +14 -0
  50. data/lib/reader_sessions_controller_extensions.rb +21 -0
  51. data/lib/readers_controller_extensions.rb +22 -0
  52. data/lib/site_controller_extensions.rb +37 -0
  53. data/lib/tasks/reader_group_extension_tasks.rake +28 -0
  54. data/pkg/radiant-reader_group-extension-0.9.0.gem +0 -0
  55. data/public/images/admin/chk_auto.png +0 -0
  56. data/public/images/admin/chk_off.png +0 -0
  57. data/public/images/admin/chk_on.png +0 -0
  58. data/public/images/admin/edit.png +0 -0
  59. data/public/images/admin/error.png +0 -0
  60. data/public/images/admin/message.png +0 -0
  61. data/public/images/admin/new-group.png +0 -0
  62. data/public/images/admin/populate.png +0 -0
  63. data/public/images/admin/rdo_off.png +0 -0
  64. data/public/images/admin/rdo_on.png +0 -0
  65. data/public/stylesheets/sass/admin/group.sass +66 -0
  66. data/radiant-reader_group-extension.gemspec +134 -0
  67. data/reader_group_extension.rb +53 -0
  68. data/spec/controllers/readers_controller_spec.rb +44 -0
  69. data/spec/controllers/site_controller_spec.rb +64 -0
  70. data/spec/datasets/group_messages_dataset.rb +32 -0
  71. data/spec/datasets/group_readers_dataset.rb +49 -0
  72. data/spec/datasets/group_sites_dataset.rb +11 -0
  73. data/spec/datasets/groups_dataset.rb +48 -0
  74. data/spec/models/group_spec.rb +45 -0
  75. data/spec/models/message_spec.rb +42 -0
  76. data/spec/models/page_spec.rb +53 -0
  77. data/spec/models/reader_spec.rb +16 -0
  78. data/spec/spec.opts +6 -0
  79. data/spec/spec_helper.rb +36 -0
  80. metadata +184 -0
@@ -0,0 +1,59 @@
1
+ module GroupedPage
2
+
3
+ def self.included(base)
4
+ base.class_eval {
5
+ has_many :permissions
6
+ has_many :groups, :through => :permissions
7
+ has_one :group, :foreign_key => 'homepage_id'
8
+ include InstanceMethods
9
+
10
+ # any page with a group-marker is never cached
11
+ # so that we can continue to return cache hits without care
12
+ # this check is regrettably expensive
13
+
14
+ def cache?
15
+ self.inherited_groups.empty?
16
+ end
17
+ }
18
+ end
19
+
20
+ module InstanceMethods
21
+
22
+ def visible_to?(reader)
23
+ permitted_groups = self.inherited_groups
24
+ return true if permitted_groups.empty?
25
+ return false if reader.nil?
26
+ return true if reader.is_admin?
27
+ return reader.in_any_of_these_groups?(permitted_groups)
28
+ end
29
+
30
+ # this is all very inefficient recursive stuff
31
+ # but to do it in one pass we'd have to build a list of pages anyway
32
+ # so there isn't much to gain unless we shift to a different kind of tree
33
+
34
+ def inherited_groups
35
+ if (self.parent.nil?)
36
+ self.groups
37
+ else
38
+ self.groups + self.parent.inherited_groups
39
+ end
40
+ end
41
+ alias permitted_groups inherited_groups
42
+
43
+ def has_group?(group)
44
+ return self.groups.include?(group)
45
+ end
46
+
47
+ def has_inherited_group?(group)
48
+ return self.inherited_groups.include?(group)
49
+ end
50
+
51
+ def group_is_inherited?(group)
52
+ return self.has_inherited_group?(group) && !self.has_group?(group)
53
+ end
54
+
55
+ end
56
+
57
+ end
58
+
59
+
@@ -0,0 +1,63 @@
1
+ module GroupedReader
2
+
3
+ def self.included(base)
4
+ base.class_eval {
5
+ has_many :memberships
6
+ has_many :groups, :through => :memberships
7
+ include InstanceMethods
8
+ alias_method_chain :activate!, :group
9
+ alias_method_chain :send_functional_message, :group
10
+ }
11
+ end
12
+
13
+ module InstanceMethods
14
+
15
+ def find_homepage
16
+ if homegroup = groups.with_home_page.first
17
+ homegroup.homepage
18
+ end
19
+ end
20
+
21
+ def can_see? (this)
22
+ permitted_groups = this.permitted_groups
23
+ permitted_groups.empty? or in_any_of_these_groups?(permitted_groups)
24
+ end
25
+
26
+ def in_any_of_these_groups? (grouplist)
27
+ (grouplist & groups).any?
28
+ end
29
+
30
+ def is_in? (group)
31
+ groups.include?(group)
32
+ end
33
+
34
+ # has_group? is ambiguous: with no argument it means 'is this reader grouped at all?'.
35
+ def has_group?(group=nil)
36
+ group.nil? ? groups.any? : is_in?(group)
37
+ end
38
+
39
+ # if group-welcome messages exist for this reader's memberships, they will be sent on activation
40
+ def activate_with_group!
41
+ send_group_welcomes if activate_without_group!
42
+ end
43
+
44
+ # there may be versions of the functional (eg welcome) messages specific to a group
45
+ # (which has to be passed through, so this currently only happens when sending out group invitations but ought to be useful elsewhere too)
46
+ def send_functional_message_with_group(function, group=nil)
47
+ reset_perishable_token!
48
+ message = Message.functional(function, group) # returns the standard functional message if no group is supplied, or no group message exists
49
+ message.deliver_to(self) if message
50
+ end
51
+
52
+ def send_group_invitation_message(group=nil)
53
+ send_functional_message_with_group('invitation', group)
54
+ end
55
+
56
+ protected
57
+
58
+ def send_group_welcomes
59
+ groups.each { |g| g.send_welcome_to(self) }
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,21 @@
1
+ module ReaderActivationsControllerExtensions
2
+ def self.included(base)
3
+
4
+ base.class_eval {
5
+
6
+ def default_activated_url_with_group
7
+ if page = @reader.find_homepage
8
+ page.url
9
+ else
10
+ default_activated_url_without_group
11
+ end
12
+ end
13
+ alias_method_chain :default_activated_url, :group
14
+
15
+ }
16
+ end
17
+
18
+ end
19
+
20
+
21
+
@@ -0,0 +1,14 @@
1
+ module ReaderNotifierExtensions
2
+
3
+ def self.included(base)
4
+ base.class_eval {
5
+
6
+ def message_with_group( reader, message, sender=nil )
7
+ message_without_group( reader, message, sender )
8
+ @body[:group] = message.group
9
+ end
10
+ alias_method_chain :message, :group
11
+
12
+ }
13
+ end
14
+ end
@@ -0,0 +1,21 @@
1
+ module ReaderSessionsControllerExtensions
2
+ def self.included(base)
3
+
4
+ base.class_eval {
5
+
6
+ def default_loggedin_url_with_group
7
+ if page = @reader_session.reader.find_homepage
8
+ page.url
9
+ else
10
+ default_loggedin_url_without_group
11
+ end
12
+ end
13
+ alias_method_chain :default_loggedin_url, :group
14
+
15
+ }
16
+ end
17
+
18
+ end
19
+
20
+
21
+
@@ -0,0 +1,22 @@
1
+ module ReadersControllerExtensions
2
+
3
+ def self.included(base)
4
+ base.class_eval { before_filter :ensure_groups_subscribable, :only => [:update, :create] }
5
+ base.add_form_partial 'readers/memberships'
6
+ end
7
+
8
+ def ensure_groups_subscribable
9
+ if params[:reader] && params[:reader][:group_ids]
10
+ params[:reader][:group_ids].each do |g|
11
+ raise ActiveRecord::RecordNotFound unless Group.find(g).public?
12
+ end
13
+ end
14
+ true
15
+ rescue ActiveRecord::RecordNotFound
16
+ false
17
+ end
18
+
19
+ end
20
+
21
+
22
+
@@ -0,0 +1,37 @@
1
+ module SiteControllerExtensions
2
+
3
+ def self.included(base)
4
+ base.class_eval {
5
+ # to control access without ruining the cache we have set Page.cache? = false
6
+ # for any page that has a group association. This should prevent the relatively
7
+ # few private pages from being cached, and it remains safe to return any cached
8
+ # page we find.
9
+
10
+ def find_page_with_group_check(url)
11
+ page = find_page_without_group_check(url)
12
+ raise ReaderGroup::PermissionDenied if page && !page.visible_to?(current_reader)
13
+ page
14
+ end
15
+
16
+ def show_page_with_group_check
17
+ show_page_without_group_check
18
+ rescue ReaderGroup::PermissionDenied
19
+ if current_reader
20
+ flash[:error] = "Sorry: you don't have permission to see that page."
21
+ redirect_to reader_permission_denied_url
22
+ else
23
+ flash[:explanation] = "The page you have requested is not public. Please log in, and if your account has the necessary permission you will be taken straight there."
24
+ flash[:error] = "Please log in."
25
+ store_location
26
+ redirect_to reader_login_url
27
+ end
28
+ end
29
+
30
+ alias_method_chain :find_page, :group_check
31
+ alias_method_chain :show_page, :group_check
32
+ }
33
+ end
34
+ end
35
+
36
+
37
+
@@ -0,0 +1,28 @@
1
+ namespace :radiant do
2
+ namespace :extensions do
3
+ namespace :reader_group do
4
+
5
+ desc "Runs the migration of the Reader Group extension"
6
+ task :migrate => :environment do
7
+ require 'radiant/extension_migrator'
8
+ if ENV["VERSION"]
9
+ ReaderGroupExtension.migrator.migrate(ENV["VERSION"].to_i)
10
+ else
11
+ ReaderGroupExtension.migrator.migrate
12
+ end
13
+ end
14
+
15
+ desc "Copies public assets of the Reader Group to the instance public/ directory."
16
+ task :update => :environment do
17
+ is_svn_or_dir = proc {|path| path =~ /\.svn/ || File.directory?(path) }
18
+ puts "Copying assets from ReaderGroupExtension"
19
+ Dir[ReaderGroupExtension.root + "/public/**/*"].reject(&is_svn_or_dir).each do |file|
20
+ path = file.sub(ReaderGroupExtension.root, '')
21
+ directory = File.dirname(path)
22
+ mkdir_p RAILS_ROOT + directory
23
+ cp file, RAILS_ROOT + path
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,66 @@
1
+ @import compass
2
+
3
+ body.reversed
4
+ #content
5
+ form
6
+ p.homepage
7
+ margin: 0
8
+ label
9
+ display: inline
10
+
11
+ #group_pages, #group_people
12
+ position: relative
13
+ float: left
14
+ overflow: hidden
15
+ ul
16
+ li.fake_checkbox
17
+ margin: 10px 0
18
+ padding-left: 30px
19
+ background:
20
+ image: none
21
+ repeat: no-repeat
22
+ position: 4px center
23
+ a
24
+ text-decoration: none
25
+ &.checked
26
+ background-image: url(/images/admin/chk_on.png)
27
+ a
28
+ color: #5da454
29
+ font-weight: bold
30
+ &.unchecked
31
+ background-image: url(/images/admin/chk_off.png)
32
+ a
33
+ color: #999
34
+ font-weight: normal
35
+ &.waiting
36
+ background-image: url(/images/admin/spinner.gif)
37
+ a
38
+ color: #8c8d8e
39
+ &.failed
40
+ background-image: url(/images/admin/error.png)
41
+ a
42
+ color: #c00
43
+ &.inherited
44
+ background-image: url(/images/admin/chk_auto.png)
45
+ color: #80aa79
46
+ input
47
+ position: absolute
48
+ left: -999px
49
+
50
+ #group_pages
51
+ width: 30%
52
+ float: left
53
+ margin-right: 2%
54
+ ul
55
+ ul
56
+ padding-left: 20px
57
+
58
+ #group_people
59
+ float: right
60
+ width: 62%
61
+ ul
62
+ float: left
63
+ width: 49%
64
+
65
+ #footnotes
66
+ clear: both
@@ -0,0 +1,134 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{radiant-reader_group-extension}
8
+ s.version = "0.9.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["spanner"]
12
+ s.date = %q{2010-10-04}
13
+ s.description = %q{Adds group-based page access control to radiant.}
14
+ s.email = %q{will@spanner.org}
15
+ s.extra_rdoc_files = [
16
+ "README.markdown"
17
+ ]
18
+ s.files = [
19
+ ".gitignore",
20
+ "README.markdown",
21
+ "Rakefile",
22
+ "VERSION",
23
+ "app/controllers/admin/group_invitations_controller.rb",
24
+ "app/controllers/admin/groups_controller.rb",
25
+ "app/controllers/admin/memberships_controller.rb",
26
+ "app/controllers/admin/permissions_controller.rb",
27
+ "app/helpers/admin/groups_helper.rb",
28
+ "app/models/group.rb",
29
+ "app/models/membership.rb",
30
+ "app/models/permission.rb",
31
+ "app/views/admin/group_invitations/new.html.haml",
32
+ "app/views/admin/group_invitations/preview.html.haml",
33
+ "app/views/admin/groups/_add_readers.html.haml",
34
+ "app/views/admin/groups/_form.html.haml",
35
+ "app/views/admin/groups/_list_head.html.haml",
36
+ "app/views/admin/groups/_listed.html.haml",
37
+ "app/views/admin/groups/edit.html.haml",
38
+ "app/views/admin/groups/index.html.haml",
39
+ "app/views/admin/groups/new.html.haml",
40
+ "app/views/admin/groups/remove.html.haml",
41
+ "app/views/admin/groups/show.html.haml",
42
+ "app/views/admin/memberships/_reader.html.haml",
43
+ "app/views/admin/messages/_list_notes.html.haml",
44
+ "app/views/admin/messages/_message_description.html.haml",
45
+ "app/views/admin/messages/_message_group.html.haml",
46
+ "app/views/admin/pages/_listed.html.haml",
47
+ "app/views/admin/pages/_page_groups.html.haml",
48
+ "app/views/admin/permissions/_page.html.haml",
49
+ "app/views/admin/reader_settings/_group_welcomes.html.haml",
50
+ "app/views/admin/readers/_reader_groups.html.haml",
51
+ "app/views/messages/show.html.haml",
52
+ "app/views/reader_activations/_on_activation.html.haml",
53
+ "app/views/readers/_memberships.html.haml",
54
+ "app/views/site/not_allowed.html.haml",
55
+ "config/routes.rb",
56
+ "db/migrate/001_create_groups.rb",
57
+ "db/migrate/20090921125654_group_messages.rb",
58
+ "db/migrate/20091120083119_groups_public.rb",
59
+ "lib/admin_messages_controller_extensions.rb",
60
+ "lib/group_message_tags.rb",
61
+ "lib/group_ui.rb",
62
+ "lib/grouped_message.rb",
63
+ "lib/grouped_model.rb",
64
+ "lib/grouped_page.rb",
65
+ "lib/grouped_reader.rb",
66
+ "lib/reader_activations_controller_extensions.rb",
67
+ "lib/reader_notifier_extensions.rb",
68
+ "lib/reader_sessions_controller_extensions.rb",
69
+ "lib/readers_controller_extensions.rb",
70
+ "lib/site_controller_extensions.rb",
71
+ "lib/tasks/reader_group_extension_tasks.rake",
72
+ "pkg/radiant-reader_group-extension-0.9.0.gem",
73
+ "public/images/admin/chk_auto.png",
74
+ "public/images/admin/chk_off.png",
75
+ "public/images/admin/chk_on.png",
76
+ "public/images/admin/edit.png",
77
+ "public/images/admin/error.png",
78
+ "public/images/admin/message.png",
79
+ "public/images/admin/new-group.png",
80
+ "public/images/admin/populate.png",
81
+ "public/images/admin/rdo_off.png",
82
+ "public/images/admin/rdo_on.png",
83
+ "public/stylesheets/sass/admin/group.sass",
84
+ "radiant-reader_group-extension.gemspec",
85
+ "reader_group_extension.rb",
86
+ "spec/controllers/readers_controller_spec.rb",
87
+ "spec/controllers/site_controller_spec.rb",
88
+ "spec/datasets/group_messages_dataset.rb",
89
+ "spec/datasets/group_readers_dataset.rb",
90
+ "spec/datasets/group_sites_dataset.rb",
91
+ "spec/datasets/groups_dataset.rb",
92
+ "spec/models/group_spec.rb",
93
+ "spec/models/message_spec.rb",
94
+ "spec/models/page_spec.rb",
95
+ "spec/models/reader_spec.rb",
96
+ "spec/spec.opts",
97
+ "spec/spec_helper.rb"
98
+ ]
99
+ s.homepage = %q{http://github.com/spanner/radiant-reader_group-extension}
100
+ s.rdoc_options = ["--charset=UTF-8"]
101
+ s.require_paths = ["lib"]
102
+ s.rubygems_version = %q{1.3.7}
103
+ s.summary = %q{Group-based access control for the radiant CMS}
104
+ s.test_files = [
105
+ "spec/controllers/readers_controller_spec.rb",
106
+ "spec/controllers/site_controller_spec.rb",
107
+ "spec/datasets/group_messages_dataset.rb",
108
+ "spec/datasets/group_readers_dataset.rb",
109
+ "spec/datasets/group_sites_dataset.rb",
110
+ "spec/datasets/groups_dataset.rb",
111
+ "spec/models/group_spec.rb",
112
+ "spec/models/message_spec.rb",
113
+ "spec/models/page_spec.rb",
114
+ "spec/models/reader_spec.rb",
115
+ "spec/spec_helper.rb"
116
+ ]
117
+
118
+ if s.respond_to? :specification_version then
119
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
120
+ s.specification_version = 3
121
+
122
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
123
+ s.add_runtime_dependency(%q<radiant>, [">= 0.9.0"])
124
+ s.add_runtime_dependency(%q<radiant-reader-extension>, [">= 0"])
125
+ else
126
+ s.add_dependency(%q<radiant>, [">= 0.9.0"])
127
+ s.add_dependency(%q<radiant-reader-extension>, [">= 0"])
128
+ end
129
+ else
130
+ s.add_dependency(%q<radiant>, [">= 0.9.0"])
131
+ s.add_dependency(%q<radiant-reader-extension>, [">= 0"])
132
+ end
133
+ end
134
+
@@ -0,0 +1,53 @@
1
+ require_dependency 'application_controller'
2
+
3
+ module ReaderGroup
4
+ class Exception < StandardError
5
+ def initialize(message = "Sorry: group problem"); super end
6
+ end
7
+ class PermissionDenied < Exception
8
+ def initialize(message = "Sorry: you don't have access to that"); super end
9
+ end
10
+ end
11
+
12
+ class ReaderGroupExtension < Radiant::Extension
13
+ version "0.9.0"
14
+ description "Page (and other) access control for site readers and groups"
15
+ url "http://spanner.org/radiant/reader_group"
16
+
17
+ def activate
18
+ Group
19
+ ActiveRecord::Base.send :include, GroupedModel # is_grouped mechanism for any model that can belong_to a group
20
+
21
+ Reader.send :include, GroupedReader # defines group associations
22
+ Page.send :include, GroupedPage # group associations and visibility decisions
23
+ Message.send :include, GroupedMessage # group association
24
+
25
+ ReaderNotifier.send :include, ReaderNotifierExtensions # a couple of new message types
26
+ SiteController.send :include, SiteControllerExtensions # access control based on group membership
27
+ ReadersController.send :include, ReadersControllerExtensions # offer subscription to public groups
28
+ Admin::MessagesController.send :include, AdminMessagesControllerExtensions # supports specification of group on newing of message
29
+ ReaderSessionsController.send :include, ReaderSessionsControllerExtensions # sends newly logged-in readers to a group home page if one can be found
30
+ ReaderActivationsController.send :include, ReaderActivationsControllerExtensions # sends newly activated readers to a group home page if one can be found
31
+ UserActionObserver.instance.send :add_observer!, Group # the usual date-stamping and ownership
32
+ Page.send :include, GroupMessageTags # extra tags for talking about groups in mailouts
33
+
34
+
35
+ unless defined? admin.group # to avoid duplicate partials
36
+ Radiant::AdminUI.send :include, GroupUI
37
+ admin.group = Radiant::AdminUI.load_default_group_regions
38
+ admin.page.edit.add :parts_bottom, "page_groups", :before => "edit_timestamp"
39
+ admin.reader.edit.add :form, "reader_groups", :before => "edit_password"
40
+ admin.message.edit.add :form, "message_group", :before => "edit_subject"
41
+ admin.reader_setting.index.add :messages, "group_welcomes", :after => "administration"
42
+ end
43
+
44
+ tab("Readers") do
45
+ add_item 'Groups', '/admin/readers/groups', :before => 'Settings'
46
+ end
47
+ end
48
+
49
+ def deactivate
50
+ end
51
+
52
+ end
53
+
@@ -0,0 +1,44 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe ReadersController do
4
+ dataset :groups
5
+ dataset :pages
6
+
7
+ before do
8
+ controller.stub!(:request).and_return(request)
9
+ Page.current_site = sites(:test) if defined? Site
10
+ request.env["HTTP_REFERER"] = 'http://test.host/referer!'
11
+ end
12
+
13
+ # all we're really testing here is the chaining of Reader.homepage
14
+ # but from a reader pov it's the login behaviour that matters
15
+
16
+ describe "a logged-in reader requesting a login form" do
17
+ before do
18
+ end
19
+
20
+ describe "who has a homed group" do
21
+ before do
22
+ login_as_reader(:normal)
23
+ get :login
24
+ end
25
+
26
+ it "should be redirected to the group's home page" do
27
+ response.should be_redirect
28
+ response.should redirect_to(groups(:homed).homepage.url)
29
+ end
30
+ end
31
+
32
+ describe "who doesn't have a homed group" do
33
+ before do
34
+ login_as_reader(:another)
35
+ get :login
36
+ end
37
+ it "should be redirected to that reader's page" do
38
+ response.should be_redirect
39
+ response.should redirect_to(reader_url(readers(:another)))
40
+ end
41
+ end
42
+ end
43
+
44
+ end
@@ -0,0 +1,64 @@
1
+ require File.dirname(__FILE__) + '/../spec_helper'
2
+
3
+ describe SiteController do
4
+ dataset :groups
5
+ dataset :pages
6
+
7
+ before do
8
+ controller.stub!(:request).and_return(request)
9
+ Page.current_site = sites(:test) if defined? Site
10
+ request.env["HTTP_REFERER"] = 'http://test.host/referer!'
11
+ end
12
+
13
+ describe "with no reader" do
14
+ before do
15
+ logout_reader
16
+ end
17
+
18
+ describe "getting an ungrouped page" do
19
+ it "should render the page" do
20
+ get :show_page, :url => ''
21
+ response.should be_success
22
+ response.body.should == 'Hello world!'
23
+ end
24
+ end
25
+
26
+ describe "getting a grouped page" do
27
+ it "should redirect to login" do
28
+ get :show_page, :url => 'parent/'
29
+ response.should be_redirect
30
+ response.should redirect_to(reader_login_url)
31
+ end
32
+ end
33
+ end
34
+
35
+ describe "with a reader" do
36
+ before do
37
+ login_as_reader(:normal)
38
+ end
39
+
40
+ describe "getting an ungrouped page" do
41
+ it "should render the page" do
42
+ get :show_page, :url => ''
43
+ response.should be_success
44
+ response.body.should == 'Hello world!'
45
+ end
46
+ end
47
+
48
+ describe "getting a grouped page to which she has access" do
49
+ it "should render the page" do
50
+ get :show_page, :url => 'parent/'
51
+ response.should be_success
52
+ response.body.should == 'Parent body.'
53
+ end
54
+ end
55
+
56
+ describe "getting a grouped page to which she doesn't have access" do
57
+ it "should redirect to the permission-denied page" do
58
+ get :show_page, :url => 'news/'
59
+ response.should be_redirect
60
+ response.should redirect_to(reader_permission_denied_url)
61
+ end
62
+ end
63
+ end
64
+ end