Skip to content

Commit

Permalink
Add new status attribute to DoorCode, and remove obsolete door-code…
Browse files Browse the repository at this point in the history
…-related code (#596)

* Add 'status' enum field to DoorCode.

* Remove enabled field on DoorCode, remove requirement that a code always be
assigned to a user, and delete obsolete doorbell controller code.

* Add `blacklisted` DoorCode status.
  • Loading branch information
anaulin authored Dec 9, 2021
1 parent 75c9485 commit 1291707
Show file tree
Hide file tree
Showing 17 changed files with 82 additions and 489 deletions.
23 changes: 1 addition & 22 deletions app/controllers/admin/door_code_controller.rb
Original file line number Diff line number Diff line change
@@ -1,26 +1,5 @@
class Admin::DoorCodeController < ApplicationController
before_action :ensure_admin

def disable_door_code
door_code = DoorCode.find(params[:id])
door_code.enabled = false
door_code.save!
flash[:message] = "#{door_code.user.name}'s door code is now disabled."
redirect_to admin_memberships_path
end

def enable_door_code
door_code = DoorCode.find(params[:id])
door_code.enabled = true
door_code.save!
flash[:message] = "#{door_code.user.name}'s door code is now enabled."
redirect_to admin_memberships_path
end

def generate_new_for_user
user = User.find(params[:id])
DoorCode.new_for_user(user)
flash[:message] = "A door code was generated for #{user.name}."
redirect_to admin_memberships_path
end
# TODO: add actions for new door code administration workflow
end
122 changes: 0 additions & 122 deletions app/controllers/doorbell_controller.rb

This file was deleted.

49 changes: 29 additions & 20 deletions app/models/door_code.rb
Original file line number Diff line number Diff line change
@@ -1,32 +1,41 @@
class DoorCode < ApplicationRecord
belongs_to :user
# We don't need an "assigned to user" status: can use the user_id field to check if a code belongs to a user
enum status: {
# This code is not entered in the physical lock.
not_in_lock: 'not_in_lock',
# This code is entered in the physical lock.
in_lock: 'in_lock',
# This code was previously assigned to a user and is still available in the lock.
formerly_assigned_in_lock: 'formerly_assigned_in_lock',
# This code was previously assigned to a user, and is no longer in the lock.
# We keep such codes around to avoid code re-use.
formerly_assigned_not_in_lock: 'formerly_assigned_not_in_lock',
# Blacklisted (assumed to not be in the lock).
# Used for disallowing easily guessable codes.
blacklisted: 'blacklisted'
}

validates :user, presence: true
validates_uniqueness_of :user
# A code without a user is available for assigning to a member
belongs_to :user, optional: true

validates :code, presence: true
validates_uniqueness_of :code, case_sensitive: false

scope :enabled, -> { where(enabled: true) }

class << self
# @param user [User] User to assign the new doorcode to.
# @return [DoorCode] a newly created doorcode, assigned to the given user
def new_for_user(user)
# Find a new unused random code.
code = make_random_code()
while DoorCode.find_by(code: code)
code = make_random_code()
end
# Assign this random code to the user.
DoorCode.create!(code: code, user: user)
end

# @return [String] A randomly generated number of the requested length, as a string. May be zero-padded.
def make_random_code(digits: 6)
def make_random_code(digits: 7)
(1..digits).map{ "0123456789".chars.to_a.sample }.join
end
end

def is_assigned?
return user.present?
end

def unassign
new_status = in_lock? ? :formerly_assigned_in_lock : :formerly_assigned_not_in_lock
update!(user: nil, status: new_status)
end
end

# == Schema Information
Expand All @@ -35,10 +44,10 @@ def make_random_code(digits: 6)
#
# id :integer not null, primary key
# code :string not null
# enabled :boolean default(FALSE), not null
# status :string default("not_in_lock"), not null
# created_at :datetime
# updated_at :datetime
# user_id :integer not null
# user_id :integer
#
# Indexes
#
Expand Down
2 changes: 1 addition & 1 deletion app/models/user.rb
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ class User < ApplicationRecord
end

after_transition on: all - [:key_member] do |user, _|
user.door_code.update!(enabled: false) if user.door_code
user.door_code.unassign if user.door_code.present?
end

state :visitor
Expand Down
14 changes: 0 additions & 14 deletions app/views/admin/memberships/_members.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -42,20 +42,6 @@
%td
- if user.door_code
= "Keycode: #{user.door_code.code}"
= user.door_code.enabled? ? "(enabled)" : "(disabled)"
- if user.door_code.enabled
= form_for user.door_code, url: admin_disable_door_code_path(user.door_code) do |f|
= f.hidden_field(:id)
= f.submit "Disable door code", class: "btn", data: { confirm: "Are you sure? This keycode will no longer work." }
- else
= form_for user.door_code, url: admin_enable_door_code_path(user.door_code) do |f|
= f.hidden_field(:id)
= f.submit "Enable door code", class: "btn", data: { confirm: "Are you sure? This keycode will be enabled." }
- else
= "Keycode not set."
= form_for user, url: admin_generate_door_code_path(user) do |f|
= f.hidden_field(:id)
= f.submit "Generate new door code", class: "btn", data: { confirm: "Do you want to generate a door code for #{user.name}?" }

%td
= form_for :user, url: admin_save_membership_note_path, remote: true, html: { class: "js-membership-note js-membership-note-#{user.id}" } do |f|
Expand Down
4 changes: 2 additions & 2 deletions app/views/members/users/index.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@

- if current_user.key_member?
- if current_user.door_code
%p Your door code is: #{current_user.door_code.code} #{current_user.door_code.enabled? ? "(enabled)" : "(disabled)"}
%p Your door code is: #{current_user.door_code.code}
- else
%p
You don't seem to have a door code set. If you need one, contact
Expand All @@ -19,7 +19,7 @@

- if @all_admins.any?
%h3 Admins
%p This internal DU app is administered by Membership Coordinators (#{ mail_to MEMBERSHIP_EMAIL }) and Board Members (#{ mail_to BOARD_EMAIL }), and it may also have Web App committee members supporting it. Members with admin access:
%p This internal DU app is administered by Membership Coordinators (#{ mail_to MEMBERSHIP_EMAIL }) and Board Members (#{ mail_to BOARD_EMAIL }), and it may also have Web App committee members supporting it. Members with admin access:
= render partial: 'list', locals: { users: @all_admins }

- if @all_members.any?
Expand Down
3 changes: 0 additions & 3 deletions config/routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,6 @@
patch "memberships/:id/change_membership_state" => "memberships#change_membership_state", :as => "change_membership_state"
patch "memberships/:id/make_admin" => "memberships#make_admin", :as => "make_admin"
patch "memberships/:id/unmake_admin" => "memberships#unmake_admin", :as => "unmake_admin"
patch "door_codes/:id/disable_door_code" => "door_code#disable_door_code", :as => "disable_door_code"
patch "door_codes/:id/enable_door_code" => "door_code#enable_door_code", :as => "enable_door_code"
patch "users/:id/generate_door_code" => "door_code#generate_new_for_user", :as => "generate_door_code"
end

get "admin/new_members" => "admin#new_members"
Expand Down
5 changes: 5 additions & 0 deletions db/migrate/20211206011624_add_status_to_door_codes.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class AddStatusToDoorCodes < ActiveRecord::Migration[6.0]
def change
add_column :door_codes, :status, string, null: false, default: "not_in_lock"
end
end
5 changes: 5 additions & 0 deletions db/migrate/20211206013540_remove_enabled_from_door_codes.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
class RemoveEnabledFromDoorCodes < ActiveRecord::Migration[6.0]
def change
remove_column :door_codes, :enabled, :boolean
end
end
6 changes: 6 additions & 0 deletions db/migrate/20211206014929_make_door_code_user_optional.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
class MakeDoorCodeUserOptional < ActiveRecord::Migration[6.0]
def change
change_column_null :door_codes, :user_id, true
change_column_default :door_codes, :user_id, nil
end
end
6 changes: 3 additions & 3 deletions db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema.define(version: 2021_04_09_202422) do
ActiveRecord::Schema.define(version: 2021_12_06_014929) do

# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
Expand Down Expand Up @@ -56,11 +56,11 @@
end

create_table "door_codes", id: :serial, force: :cascade do |t|
t.integer "user_id", null: false
t.integer "user_id"
t.string "code", null: false
t.boolean "enabled", default: false, null: false
t.datetime "created_at"
t.datetime "updated_at"
t.string "status", default: "not_in_lock", null: false
t.index ["code"], name: "index_door_codes_on_code", unique: true
t.index ["user_id"], name: "index_door_codes_on_user_id", unique: true
end
Expand Down
Loading

0 comments on commit 1291707

Please sign in to comment.