Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add new status attribute to DoorCode, and remove obsolete door-code-related code #596

Merged
merged 3 commits into from
Dec 9, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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