branston 0.6.1 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (188) hide show
  1. data/README.rdoc +1 -1
  2. data/lib/branston/Gemfile +25 -0
  3. data/lib/branston/Gemfile.lock +76 -0
  4. data/lib/branston/app/controllers/application_controller.rb +1 -1
  5. data/lib/branston/app/controllers/outcomes_controller.rb +2 -0
  6. data/lib/branston/app/controllers/stories_controller.rb +82 -86
  7. data/lib/branston/app/controllers/users_controller.rb +69 -11
  8. data/lib/branston/app/helpers/iterations_helper.rb +13 -13
  9. data/lib/branston/app/models/iteration.rb +3 -1
  10. data/lib/branston/app/models/release.rb +0 -1
  11. data/lib/branston/app/models/story.rb +30 -28
  12. data/lib/branston/app/models/user.rb +46 -1
  13. data/lib/branston/app/views/layouts/_header.html.erb +8 -3
  14. data/lib/branston/app/views/layouts/user_roles.html.erb +5 -5
  15. data/lib/branston/app/views/sessions/new.html.erb +8 -14
  16. data/lib/branston/app/views/users/_admin_controls.html.erb +14 -0
  17. data/lib/branston/app/views/users/_form.html.erb +27 -0
  18. data/lib/branston/app/views/users/edit.html.erb +9 -0
  19. data/lib/branston/app/views/users/index.html.erb +14 -0
  20. data/lib/branston/app/views/users/new.html.erb +3 -22
  21. data/lib/branston/config/boot.rb +20 -0
  22. data/lib/branston/config/environment.rb +2 -7
  23. data/lib/branston/config/environments/test.rb +0 -8
  24. data/lib/branston/config/preinitializer.rb +21 -0
  25. data/lib/branston/config/routes.rb +15 -10
  26. data/lib/branston/db/development.sqlite3 +0 -0
  27. data/lib/branston/db/development_structure.sql +21 -8
  28. data/lib/branston/db/migrate/20100723161424_add_state_to_user.rb +12 -0
  29. data/lib/branston/db/migrate/20100726150322_add_activation_fields_to_user.rb +12 -0
  30. data/lib/branston/db/migrate/20100729125551_set_default_user_state_to_pending.rb +10 -0
  31. data/lib/branston/db/migrate/20100812133837_add_is_admin_property_to_user.rb +10 -0
  32. data/lib/branston/db/migrate/20100812140532_set_default_user_state_to_active.rb +10 -0
  33. data/lib/branston/db/migrate/20100812143455_add_default_admin_user.rb +17 -0
  34. data/lib/branston/db/migrate/20110408162438_remove_is_admin_property_and_add_role_instead.rb +12 -0
  35. data/lib/branston/db/pristine.sqlite3 +0 -0
  36. data/lib/branston/db/schema.rb +6 -8
  37. data/lib/branston/db/test.sqlite3 +0 -0
  38. data/lib/branston/log/development.log +1181 -433
  39. data/lib/branston/log/test.log +145306 -52026
  40. data/lib/branston/test/blueprints.rb +22 -28
  41. data/lib/branston/test/functional/iterations_controller_test.rb +149 -113
  42. data/lib/branston/test/functional/outcomes_controller_test.rb +94 -60
  43. data/lib/branston/test/functional/preconditions_controller_test.rb +101 -67
  44. data/lib/branston/test/functional/releases_controller_test.rb +85 -49
  45. data/lib/branston/test/functional/scenarios_controller_test.rb +104 -70
  46. data/lib/branston/test/functional/stories_controller_test.rb +41 -12
  47. data/lib/branston/test/functional/users_controller_test.rb +364 -43
  48. data/lib/branston/test/unit/iteration_test.rb +37 -6
  49. data/lib/branston/test/unit/outcome_test.rb +2 -2
  50. data/lib/branston/test/unit/participation_test.rb +2 -2
  51. data/lib/branston/test/unit/precondition_test.rb +3 -3
  52. data/lib/branston/test/unit/release_test.rb +4 -0
  53. data/lib/branston/test/unit/scenario_test.rb +4 -4
  54. data/lib/branston/test/unit/story_test.rb +62 -40
  55. data/lib/branston/test/unit/user_test.rb +195 -5
  56. metadata +136 -156
  57. data/lib/branston/app/controllers/user_roles_controller.rb +0 -105
  58. data/lib/branston/app/helpers/user_roles_helper.rb +0 -2
  59. data/lib/branston/app/models/user_role.rb +0 -21
  60. data/lib/branston/app/views/layouts/outcomes.html.erb +0 -17
  61. data/lib/branston/app/views/layouts/preconditions.html.erb +0 -17
  62. data/lib/branston/app/views/layouts/releases.html.erb +0 -17
  63. data/lib/branston/app/views/user_roles/edit.html.erb +0 -16
  64. data/lib/branston/app/views/user_roles/index.html.erb +0 -20
  65. data/lib/branston/app/views/user_roles/new.html.erb +0 -15
  66. data/lib/branston/app/views/user_roles/show.html.erb +0 -8
  67. data/lib/branston/coverage/app-controllers-application_controller_rb.html +0 -231
  68. data/lib/branston/coverage/app-controllers-iterations_controller_rb.html +0 -801
  69. data/lib/branston/coverage/app-controllers-outcomes_controller_rb.html +0 -759
  70. data/lib/branston/coverage/app-controllers-preconditions_controller_rb.html +0 -783
  71. data/lib/branston/coverage/app-controllers-releases_controller_rb.html +0 -705
  72. data/lib/branston/coverage/app-controllers-scenarios_controller_rb.html +0 -777
  73. data/lib/branston/coverage/app-controllers-sessions_controller_rb.html +0 -411
  74. data/lib/branston/coverage/app-controllers-stories_controller_rb.html +0 -1071
  75. data/lib/branston/coverage/app-controllers-user_roles_controller_rb.html +0 -693
  76. data/lib/branston/coverage/app-controllers-users_controller_rb.html +0 -315
  77. data/lib/branston/coverage/app-helpers-application_helper_rb.html +0 -327
  78. data/lib/branston/coverage/app-helpers-iterations_helper_rb.html +0 -363
  79. data/lib/branston/coverage/app-helpers-outcomes_helper_rb.html +0 -75
  80. data/lib/branston/coverage/app-helpers-preconditions_helper_rb.html +0 -75
  81. data/lib/branston/coverage/app-helpers-releases_helper_rb.html +0 -75
  82. data/lib/branston/coverage/app-helpers-sessions_helper_rb.html +0 -75
  83. data/lib/branston/coverage/app-helpers-stories_helper_rb.html +0 -75
  84. data/lib/branston/coverage/app-helpers-user_roles_helper_rb.html +0 -75
  85. data/lib/branston/coverage/app-models-iteration_rb.html +0 -321
  86. data/lib/branston/coverage/app-models-outcome_rb.html +0 -243
  87. data/lib/branston/coverage/app-models-participation_rb.html +0 -189
  88. data/lib/branston/coverage/app-models-precondition_rb.html +0 -243
  89. data/lib/branston/coverage/app-models-release_rb.html +0 -195
  90. data/lib/branston/coverage/app-models-scenario_rb.html +0 -231
  91. data/lib/branston/coverage/app-models-story_rb.html +0 -621
  92. data/lib/branston/coverage/app-models-user_rb.html +0 -513
  93. data/lib/branston/coverage/app-models-user_role_rb.html +0 -189
  94. data/lib/branston/coverage/index.html +0 -570
  95. data/lib/branston/coverage/jquery-1.3.2.min.js +0 -19
  96. data/lib/branston/coverage/jquery.tablesorter.min.js +0 -15
  97. data/lib/branston/coverage/lib-client_rb.html +0 -537
  98. data/lib/branston/coverage/lib-faker_extras_rb.html +0 -207
  99. data/lib/branston/coverage/lib-story_generator_rb.html +0 -873
  100. data/lib/branston/coverage/print.css +0 -12
  101. data/lib/branston/coverage/rcov.js +0 -42
  102. data/lib/branston/coverage/screen.css +0 -270
  103. data/lib/branston/db/migrate/20091127131037_create_user_roles.rb +0 -13
  104. data/lib/branston/db/migrate/20091127172950_add_story_id_to_user_role.rb +0 -10
  105. data/lib/branston/test/functional/user_roles_controller_test.rb +0 -71
  106. data/lib/branston/test/unit/helpers/user_roles_helper_test.rb +0 -4
  107. data/lib/branston/test/unit/user_role_test.rb +0 -9
  108. data/lib/branston/tmp/performance/BrowsingTest#test_homepage_process_time_flat.txt +0 -8
  109. data/lib/branston/tmp/performance/BrowsingTest#test_homepage_process_time_graph.html +0 -6718
  110. data/lib/branston/tmp/performance/BrowsingTest#test_homepage_process_time_tree.txt +0 -9942
  111. data/lib/branston/vendor/plugins/state_machine/CHANGELOG.rdoc +0 -298
  112. data/lib/branston/vendor/plugins/state_machine/LICENSE +0 -20
  113. data/lib/branston/vendor/plugins/state_machine/README.rdoc +0 -466
  114. data/lib/branston/vendor/plugins/state_machine/Rakefile +0 -98
  115. data/lib/branston/vendor/plugins/state_machine/examples/AutoShop_state.png +0 -0
  116. data/lib/branston/vendor/plugins/state_machine/examples/Car_state.png +0 -0
  117. data/lib/branston/vendor/plugins/state_machine/examples/TrafficLight_state.png +0 -0
  118. data/lib/branston/vendor/plugins/state_machine/examples/Vehicle_state.png +0 -0
  119. data/lib/branston/vendor/plugins/state_machine/examples/auto_shop.rb +0 -11
  120. data/lib/branston/vendor/plugins/state_machine/examples/car.rb +0 -19
  121. data/lib/branston/vendor/plugins/state_machine/examples/merb-rest/controller.rb +0 -51
  122. data/lib/branston/vendor/plugins/state_machine/examples/merb-rest/model.rb +0 -28
  123. data/lib/branston/vendor/plugins/state_machine/examples/merb-rest/view_edit.html.erb +0 -24
  124. data/lib/branston/vendor/plugins/state_machine/examples/merb-rest/view_index.html.erb +0 -23
  125. data/lib/branston/vendor/plugins/state_machine/examples/merb-rest/view_new.html.erb +0 -13
  126. data/lib/branston/vendor/plugins/state_machine/examples/merb-rest/view_show.html.erb +0 -17
  127. data/lib/branston/vendor/plugins/state_machine/examples/rails-rest/controller.rb +0 -43
  128. data/lib/branston/vendor/plugins/state_machine/examples/rails-rest/migration.rb +0 -11
  129. data/lib/branston/vendor/plugins/state_machine/examples/rails-rest/model.rb +0 -23
  130. data/lib/branston/vendor/plugins/state_machine/examples/rails-rest/view_edit.html.erb +0 -25
  131. data/lib/branston/vendor/plugins/state_machine/examples/rails-rest/view_index.html.erb +0 -23
  132. data/lib/branston/vendor/plugins/state_machine/examples/rails-rest/view_new.html.erb +0 -14
  133. data/lib/branston/vendor/plugins/state_machine/examples/rails-rest/view_show.html.erb +0 -17
  134. data/lib/branston/vendor/plugins/state_machine/examples/traffic_light.rb +0 -7
  135. data/lib/branston/vendor/plugins/state_machine/examples/vehicle.rb +0 -31
  136. data/lib/branston/vendor/plugins/state_machine/init.rb +0 -1
  137. data/lib/branston/vendor/plugins/state_machine/lib/state_machine.rb +0 -388
  138. data/lib/branston/vendor/plugins/state_machine/lib/state_machine/assertions.rb +0 -36
  139. data/lib/branston/vendor/plugins/state_machine/lib/state_machine/callback.rb +0 -189
  140. data/lib/branston/vendor/plugins/state_machine/lib/state_machine/condition_proxy.rb +0 -94
  141. data/lib/branston/vendor/plugins/state_machine/lib/state_machine/eval_helpers.rb +0 -67
  142. data/lib/branston/vendor/plugins/state_machine/lib/state_machine/event.rb +0 -252
  143. data/lib/branston/vendor/plugins/state_machine/lib/state_machine/event_collection.rb +0 -122
  144. data/lib/branston/vendor/plugins/state_machine/lib/state_machine/extensions.rb +0 -149
  145. data/lib/branston/vendor/plugins/state_machine/lib/state_machine/guard.rb +0 -230
  146. data/lib/branston/vendor/plugins/state_machine/lib/state_machine/integrations.rb +0 -68
  147. data/lib/branston/vendor/plugins/state_machine/lib/state_machine/integrations/active_record.rb +0 -492
  148. data/lib/branston/vendor/plugins/state_machine/lib/state_machine/integrations/active_record/locale.rb +0 -11
  149. data/lib/branston/vendor/plugins/state_machine/lib/state_machine/integrations/active_record/observer.rb +0 -41
  150. data/lib/branston/vendor/plugins/state_machine/lib/state_machine/integrations/data_mapper.rb +0 -351
  151. data/lib/branston/vendor/plugins/state_machine/lib/state_machine/integrations/data_mapper/observer.rb +0 -139
  152. data/lib/branston/vendor/plugins/state_machine/lib/state_machine/integrations/sequel.rb +0 -322
  153. data/lib/branston/vendor/plugins/state_machine/lib/state_machine/machine.rb +0 -1467
  154. data/lib/branston/vendor/plugins/state_machine/lib/state_machine/machine_collection.rb +0 -155
  155. data/lib/branston/vendor/plugins/state_machine/lib/state_machine/matcher.rb +0 -123
  156. data/lib/branston/vendor/plugins/state_machine/lib/state_machine/matcher_helpers.rb +0 -54
  157. data/lib/branston/vendor/plugins/state_machine/lib/state_machine/node_collection.rb +0 -152
  158. data/lib/branston/vendor/plugins/state_machine/lib/state_machine/state.rb +0 -249
  159. data/lib/branston/vendor/plugins/state_machine/lib/state_machine/state_collection.rb +0 -112
  160. data/lib/branston/vendor/plugins/state_machine/lib/state_machine/transition.rb +0 -394
  161. data/lib/branston/vendor/plugins/state_machine/state_machine.gemspec +0 -30
  162. data/lib/branston/vendor/plugins/state_machine/tasks/state_machine.rake +0 -1
  163. data/lib/branston/vendor/plugins/state_machine/tasks/state_machine.rb +0 -30
  164. data/lib/branston/vendor/plugins/state_machine/test/classes/switch.rb +0 -11
  165. data/lib/branston/vendor/plugins/state_machine/test/functional/state_machine_test.rb +0 -941
  166. data/lib/branston/vendor/plugins/state_machine/test/test_helper.rb +0 -4
  167. data/lib/branston/vendor/plugins/state_machine/test/unit/assertions_test.rb +0 -40
  168. data/lib/branston/vendor/plugins/state_machine/test/unit/callback_test.rb +0 -455
  169. data/lib/branston/vendor/plugins/state_machine/test/unit/condition_proxy_test.rb +0 -328
  170. data/lib/branston/vendor/plugins/state_machine/test/unit/eval_helpers_test.rb +0 -120
  171. data/lib/branston/vendor/plugins/state_machine/test/unit/event_collection_test.rb +0 -326
  172. data/lib/branston/vendor/plugins/state_machine/test/unit/event_test.rb +0 -743
  173. data/lib/branston/vendor/plugins/state_machine/test/unit/guard_test.rb +0 -908
  174. data/lib/branston/vendor/plugins/state_machine/test/unit/integrations/active_record_test.rb +0 -1367
  175. data/lib/branston/vendor/plugins/state_machine/test/unit/integrations/data_mapper_test.rb +0 -962
  176. data/lib/branston/vendor/plugins/state_machine/test/unit/integrations/sequel_test.rb +0 -859
  177. data/lib/branston/vendor/plugins/state_machine/test/unit/integrations_test.rb +0 -42
  178. data/lib/branston/vendor/plugins/state_machine/test/unit/invalid_event_test.rb +0 -7
  179. data/lib/branston/vendor/plugins/state_machine/test/unit/invalid_transition_test.rb +0 -7
  180. data/lib/branston/vendor/plugins/state_machine/test/unit/machine_collection_test.rb +0 -938
  181. data/lib/branston/vendor/plugins/state_machine/test/unit/machine_test.rb +0 -2004
  182. data/lib/branston/vendor/plugins/state_machine/test/unit/matcher_helpers_test.rb +0 -37
  183. data/lib/branston/vendor/plugins/state_machine/test/unit/matcher_test.rb +0 -155
  184. data/lib/branston/vendor/plugins/state_machine/test/unit/node_collection_test.rb +0 -207
  185. data/lib/branston/vendor/plugins/state_machine/test/unit/state_collection_test.rb +0 -280
  186. data/lib/branston/vendor/plugins/state_machine/test/unit/state_machine_test.rb +0 -31
  187. data/lib/branston/vendor/plugins/state_machine/test/unit/state_test.rb +0 -795
  188. data/lib/branston/vendor/plugins/state_machine/test/unit/transition_test.rb +0 -1212
@@ -1,50 +1,50 @@
1
1
  module IterationsHelper
2
-
2
+
3
3
  # TODO: Untested!
4
4
  #
5
5
  def burndown_chart(iteration, data)
6
-
6
+
7
7
  total_points = iteration.velocity
8
8
  running_total = 0
9
-
9
+
10
10
  unless data.nil? or data.empty?
11
11
  points_data = data.map { |d|
12
12
  running_total += d.points.to_i
13
13
  total_points - running_total
14
14
  }
15
-
16
-
15
+
16
+
17
17
  points_data = [total_points] + points_data unless points_data.nil?
18
-
18
+
19
19
  work_days = [nil]
20
20
  (iteration.start_date.to_date..iteration.end_date.to_date).to_a.each do |date|
21
21
  work_days.push date.strftime('%d/%m') unless is_weekend(date)
22
22
  end
23
-
23
+
24
24
  # Keep adding the last value to flatline the chart
25
25
  while work_days.length > points_data.length
26
26
  points_data.push points_data.last
27
27
  end
28
-
28
+
29
29
  # Make some gradations for the y axis labels
30
30
  y_scale = [0]
31
31
  [4, 2, 1.5, 1.25, 1].each do |n|
32
32
  unit = (total_points / n).floor
33
33
  y_scale.push unit if unit > 0
34
34
  end
35
-
35
+
36
36
  image_tag Gchart.line(:size => '800x360',
37
37
  :title => "Iteration #{iteration.name} burndown",
38
38
  :data => points_data, :axis_with_labels => 'x,y',
39
39
  :axis_labels => [work_days, y_scale])
40
-
40
+
41
41
  end
42
-
42
+
43
43
  end
44
-
44
+
45
45
  def is_weekend(date)
46
46
  date.wday == 0 or date.wday == 5 or date.wday == 6
47
47
  end
48
-
48
+
49
49
  end
50
50
 
@@ -19,6 +19,7 @@ class Iteration < ActiveRecord::Base
19
19
  # Validations
20
20
  #
21
21
  validates_presence_of :name, :velocity
22
+ validates_numericality_of :velocity
22
23
 
23
24
  # Associations
24
25
  #
@@ -34,8 +35,9 @@ class Iteration < ActiveRecord::Base
34
35
  FROM stories
35
36
  WHERE iteration_id = ?
36
37
  AND status = 'completed'
38
+ OR status = 'quality_assurance'
37
39
  GROUP BY completed_date
38
- ORDER bY completed_date", id
40
+ ORDER BY completed_date", id
39
41
  ]
40
42
  end
41
43
 
@@ -15,7 +15,6 @@
15
15
  class Release < ActiveRecord::Base
16
16
 
17
17
  validates_presence_of :release_date
18
-
19
18
  has_many :iterations, :order => 'end_date'
20
19
 
21
20
  end
@@ -26,7 +26,6 @@ class Story < ActiveRecord::Base
26
26
  belongs_to :iteration
27
27
  belongs_to :author, :class_name => "User", :foreign_key => "author_id"
28
28
  has_many :scenarios, :dependent => :destroy
29
- has_one :user_role
30
29
 
31
30
  # Named scopes
32
31
  #
@@ -34,8 +33,8 @@ class Story < ActiveRecord::Base
34
33
  named_scope :in_progress, :conditions => 'status = "in_progress"'
35
34
  named_scope :in_quality_assurance, :conditions => 'status = "quality_assurance"'
36
35
  named_scope :completed, :conditions => 'status = "completed"'
37
- named_scope :for_iteration, lambda { |id| { :conditions => ['iteration_id = ?',
38
- id] } }
36
+ named_scope :for_iteration, lambda { |id| {
37
+ :conditions => ['iteration_id = ?', id] } }
39
38
 
40
39
  before_save :set_slug
41
40
 
@@ -51,33 +50,36 @@ class Story < ActiveRecord::Base
51
50
  # Completed - A story that has been implemented and tested by the development
52
51
  # team
53
52
  #
54
- state_machine :status, :initial => :new do
55
- state :new
56
- state :in_progress
57
- state :quality_assurance
58
- state :completed
59
-
60
- event :assign do
61
- transition [:new, :quality_assurance, :completed] => :in_progress
62
- end
63
-
64
- event :check_quality do
65
- transition [:in_progress, :quality_assurance, :completed] => :quality_assurance
66
- end
67
-
68
- event :finish do
69
- transition [:in_progress, :quality_assurance] => :completed
70
- end
71
-
72
- event :back_to_new do
73
- transition :in_progress => :new
74
- end
75
-
76
- after_transition any => :completed do |story, transition|
77
- story.completed_date = Date.today
78
- end
53
+ include AASM
54
+ aasm_column :status
55
+ aasm_initial_state :new
56
+ aasm_state :new
57
+ aasm_state :in_progress
58
+ aasm_state :quality_assurance
59
+ aasm_state :completed, :enter => Proc.new { |story, transition|
60
+ story.completed_date = Date.today
61
+ }
62
+
63
+ aasm_event :assign do
64
+ transitions :from => [:new, :quality_assurance, :completed], :to => :in_progress
79
65
  end
80
66
 
67
+ aasm_event :check_quality do
68
+ transitions :from => [:in_progress, :quality_assurance, :completed], :to => :quality_assurance
69
+ end
70
+
71
+ aasm_event :finish do
72
+ transitions :from => [:in_progress, :quality_assurance], :to => :completed
73
+ end
74
+
75
+ aasm_event :back_to_new do
76
+ transitions :from => :in_progress, :to => :new
77
+ end
78
+
79
+ # after_transition any => :completed do |story, transition|
80
+ # story.completed_date = Date.today
81
+ # end
82
+
81
83
  attr_protected :status
82
84
 
83
85
  def to_param
@@ -15,6 +15,9 @@
15
15
  require 'digest/sha1'
16
16
 
17
17
  class User < ActiveRecord::Base
18
+
19
+ ROLES = ["admin", "developer", "customer"]
20
+
18
21
  include Authentication
19
22
  include Authentication::ByPassword
20
23
  include Authentication::ByCookieToken
@@ -32,6 +35,8 @@ class User < ActiveRecord::Base
32
35
  validates_uniqueness_of :email
33
36
  validates_format_of :email, :with => Authentication.email_regex, :message => Authentication.bad_email_message
34
37
 
38
+ validates_inclusion_of :role, :in => ROLES
39
+
35
40
  has_many :participations
36
41
  has_many :iterations, :through => :participations
37
42
  has_many :stories, :foreign_key => 'author_id'
@@ -41,7 +46,34 @@ class User < ActiveRecord::Base
41
46
  # anything else you want your user to change should be added here.
42
47
  attr_accessible :login, :email, :name, :password, :password_confirmation
43
48
 
49
+ include AASM
50
+ aasm_column :state
51
+ aasm_initial_state :pending
52
+ aasm_state :pending
53
+ aasm_state :active, :enter => :do_activate
54
+ aasm_state :suspended
55
+ aasm_state :deleted, :enter => :do_delete
44
56
 
57
+ aasm_event :register do
58
+ transitions :from => :passive, :to => :pending, :guard => Proc.new {|u| !(u.crypted_password.blank? && u.password.blank?) }
59
+ end
60
+
61
+ aasm_event :activate do
62
+ transitions :from => [:pending, :suspended], :to => :active
63
+ end
64
+
65
+ aasm_event :suspend do
66
+ transitions :from => [:pending, :active], :to => :suspended
67
+ end
68
+
69
+ aasm_event :delete do
70
+ transitions :from => [:pending, :active, :suspended], :to => :deleted
71
+ end
72
+
73
+
74
+ def has_role?(role_name)
75
+ self.role == role_name
76
+ end
45
77
 
46
78
  # Authenticates a user by their login name and unencrypted password. Returns the user or nil.
47
79
  #
@@ -51,7 +83,7 @@ class User < ActiveRecord::Base
51
83
  #
52
84
  def self.authenticate(login, password)
53
85
  return nil if login.blank? || password.blank?
54
- u = find_by_login(login.downcase) # need to get the salt
86
+ u = find_in_state :first, :active, :conditions => {:login => login.downcase}
55
87
  u && u.authenticated?(password) ? u : nil
56
88
  end
57
89
 
@@ -69,7 +101,20 @@ class User < ActiveRecord::Base
69
101
 
70
102
  protected
71
103
 
104
+ # Returns true if the user has just been activated.
105
+ def recently_activated?
106
+ @activated
107
+ end
108
+
109
+ def do_delete
110
+ self.deleted_at = Time.now.utc
111
+ end
72
112
 
113
+ def do_activate
114
+ @activated = true
115
+ self.activated_at = Time.now.utc
116
+ self.deleted_at = self.activation_code = nil
117
+ end
73
118
 
74
119
  end
75
120
 
@@ -8,9 +8,14 @@
8
8
  <div id="header">
9
9
  <div id="menu">
10
10
  <ul>
11
- <li <%= tab_on("overview") %>><a href="/" class="first">Overview</a></li>
12
- <li <%= tab_on("releases") %>><a href="/releases">Releases</a></li>
13
- <li <%= tab_on("iterations") %>><a href="/iterations">Iterations</a></li>
11
+ <% if logged_in? -%>
12
+ <li <%= tab_on("iterations") %>><%= link_to 'Iterations', iterations_path %></li>
13
+ <li <%= tab_on("releases") %>><%= link_to 'Releases', releases_path %></li>
14
+ <li <%= tab_on("users") %>><%= link_to 'Users', users_path %></li>
15
+ <li <%= tab_on("logout") %>><%= link_to 'Log Out', logout_path %></li>
16
+ <% else -%>
17
+ <li <%= tab_on("login") %>><%= link_to 'Log In', login_path %></li>
18
+ <% end -%>
14
19
  </ul>
15
20
  </div>
16
21
  <!-- end #menu -->
@@ -9,17 +9,17 @@
9
9
  <%= stylesheet_link_tag 'style' %>
10
10
  <%= stylesheet_link_tag 'ui-lightness/jquery-ui-1.7.2.custom' %>
11
11
  <%= stylesheet_link_tag 'scaffold' %>
12
- <script type="text/javascript" src="javascripts/jquery-1.3.2.min.js"></script>
13
- <script type="text/javascript" src="javascripts/jquery-ui-1.7.2.custom.min.js"></script>
14
- <script type="text/javascript" src="javascripts/jquery.jeditable.mini.js"></script>
15
- <script type="text/javascript" src="javascripts/jquery-multiselect-drag-n-drop.js"></script>
12
+ <%= javascript_include_tag 'jquery-1.3.2.min' %>
13
+ <%= javascript_include_tag 'jquery-ui-1.7.2.custom.min' %>
14
+ <%= javascript_include_tag 'jquery.jeditable.mini' %>
15
+ <%= javascript_include_tag 'jquery-multiselect-drag-n-drop' %>
16
16
  </head>
17
17
  <body>
18
18
  <%= render :partial => "layouts/header" %>
19
19
 
20
20
  <p style="color: green"><%= flash[:notice] %></p>
21
21
 
22
- <div id="page">
22
+ <div id="page">
23
23
  <div id="content">
24
24
  <%= yield %>
25
25
  </div>
@@ -1,33 +1,27 @@
1
1
  <h1>Log In</h1>
2
2
 
3
3
  <div id="login">
4
-
4
+
5
5
  <% form_tag session_path do -%>
6
-
6
+
7
7
  <p class="form-fields">
8
8
  <%= label_tag 'login' %>
9
9
  <%= text_field_tag 'login', @login %>
10
10
  </p>
11
-
11
+
12
12
  <p class="form-fields">
13
13
  <%= label_tag 'password' %>
14
14
  <%= password_field_tag 'password', nil %>
15
15
  </p>
16
-
16
+
17
17
  <p class="form-fields">
18
18
  <%= label_tag 'remember_me', 'Remember me' %>
19
19
  <%= check_box_tag 'remember_me', '1', @remember_me %>
20
20
  </p>
21
-
22
-
21
+
22
+
23
23
  <p id="login-button" class="form-navigtion"><%= submit_tag 'Log in' %></p>
24
24
  <% end -%>
25
-
26
-
27
-
28
- <div style="clear:both">
29
- <p>If you are lacking a Branston account,
30
- <%=link_to 'click here to register!', signup_path %>
31
- </p>
32
- </div>
25
+
33
26
  </div>
27
+
@@ -0,0 +1,14 @@
1
+ <%= link_to user.login, edit_user_path(user) %> -
2
+
3
+ <% if user.state == "active" -%>
4
+ activate
5
+ <% else %>
6
+ <%= link_to 'activate', activate_user_path(user) %>
7
+ <% end -%> |
8
+
9
+ <% if user.state == "pending" || user.state == "suspended" -%>
10
+ suspend
11
+ <% else -%>
12
+ <%= link_to 'suspend', suspend_user_path(user) %>
13
+ <% end -%>
14
+
@@ -0,0 +1,27 @@
1
+ <p class="form-fields">
2
+ <%= label_tag 'login' %>
3
+ <%= f.text_field :login %>
4
+ </p>
5
+
6
+ <p class="form-fields">
7
+ <%= label_tag 'email' %>
8
+ <%= f.text_field :email %>
9
+ </p>
10
+
11
+ <p class="form-fields">
12
+ <%= label_tag 'password' %>
13
+ <%= f.password_field :password %>
14
+ </p>
15
+
16
+ <p class="form-fields">
17
+ <%= label_tag 'password_confirmation', 'Confirm Password' %>
18
+ <%= f.password_field :password_confirmation %>
19
+ </p>
20
+
21
+ <% if current_user.has_role?("admin") -%>
22
+ <p class="form-fields">
23
+ <%= label_tag 'role' %>
24
+ <%= f.select :role, ["admin", "client", "developer"] %>
25
+ </p>
26
+ <% end -%>
27
+
@@ -0,0 +1,9 @@
1
+ <h1>Edit user</h1>
2
+ <% @user.password = @user.password_confirmation = nil %>
3
+
4
+ <%= error_messages_for :user %>
5
+ <% form_for(@user) do |f| -%>
6
+ <%= render :partial => 'form', :locals => { :f => f } %>
7
+ <p class="form-navigation"><%= submit_tag 'Update user' %></p>
8
+ <% end -%>
9
+
@@ -0,0 +1,14 @@
1
+ <div class="index-head">
2
+ <h2>Users</h2>
3
+ <%= link_to 'New user', new_user_path, :class => "add" %>
4
+ </div>
5
+ <% unless @users.blank? -%>
6
+ <ul>
7
+ <% @users.each do |user| -%>
8
+ <li>
9
+ <%= render :partial => "users/admin_controls", :locals => {:user => user } %>
10
+ </li>
11
+ <% end -%>
12
+ </ul>
13
+ <% end -%>
14
+
@@ -1,28 +1,9 @@
1
- <h1>Sign up as a new user</h1>
1
+ <h1>Create a new user</h1>
2
2
  <% @user.password = @user.password_confirmation = nil %>
3
3
 
4
4
  <%= error_messages_for :user %>
5
5
  <% form_for :user, :url => users_path do |f| -%>
6
- <p class="form-fields">
7
- <%= label_tag 'login' %>
8
- <%= f.text_field :login %>
9
- </p>
10
-
11
- <p class="form-fields">
12
- <%= label_tag 'email' %>
13
- <%= f.text_field :email %>
14
- </p>
15
-
16
- <p class="form-fields">
17
- <%= label_tag 'password' %>
18
- <%= f.password_field :password %>
19
- </p>
20
-
21
- <p class="form-fields">
22
- <%= label_tag 'password_confirmation', 'Confirm Password' %>
23
- <%= f.password_field :password_confirmation %>
24
- </p>
25
-
26
- <p class="form-navigation"><%= submit_tag 'Sign up' %></p>
6
+ <%= render :partial => 'form', :locals => { :f => f } %>
7
+ <p class="form-navigation"><%= submit_tag 'Create user' %></p>
27
8
  <% end -%>
28
9