-
Notifications
You must be signed in to change notification settings - Fork 32
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
Rename/refactor in models for clarity #533
base: master
Are you sure you want to change the base?
Changes from 9 commits
eff2b85
31679eb
373fdd0
ae5e9c3
99e8f7a
f1bc98a
5e37928
3244e71
0abc0ac
da8c3da
77bb967
9d10003
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,7 +4,7 @@ def apply(application, notes) | |
@application = application | ||
@notes = notes | ||
|
||
mail to: application.superior_email, from: "[email protected]", subject: "Application for #{application.event_role.description} #{application.event_role.role} from #{application.member.display_name}" | ||
mail to: application.superior_emails, from: "[email protected]", subject: "Application for #{application.event_role.description} #{application.event_role.role} from #{application.member.display_name}" | ||
end | ||
|
||
def accept(application) | ||
|
@@ -16,6 +16,6 @@ def accept(application) | |
def withdraw(application) | ||
@application = application | ||
|
||
mail to: application.superior_email, from: "[email protected]", subject: "Application withdrawn for #{application.event_role.description} #{application.event_role.role} from #{application.member.display_name}" | ||
mail to: application.superior_emails, from: "[email protected]", subject: "Application withdrawn for #{application.event_role.description} #{application.event_role.role} from #{application.member.display_name}" | ||
end | ||
end |
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is definitely a dangerous fix without a lot of testing. If a long time has gone without a validation being enforced, then adding it in after model entries have been created and modified can break it. Have you tested this thoroughly? Is it currently possible to create an entry that fails this validation? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This commit is confusing and doesn't make clear the actual change made. I've added a commit which makes it more clear. To summarize, self is needed on line 24 or the assignment will only be local. This is not used as a validation step; rather, it runs before validation. This change does not affect what entries are considered valid. |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -21,7 +21,7 @@ class Event < ActiveRecord::Base | |
attr_accessor :org_type, :org_new, :created_email | ||
|
||
before_validation :prune_attachments, :prune_roles | ||
before_save :handle_organization, :ensure_tic, :sort_roles, :synchronize_representative_dates | ||
before_save :create_org_if_new, :ensure_tic, :sort_roles, :synchronize_representative_dates | ||
after_initialize :default_values | ||
after_save :set_eventdate_delta_flags, :set_created_email | ||
|
||
|
@@ -71,7 +71,7 @@ class Event < ActiveRecord::Base | |
# validate :eventdate_valid? | ||
validate :textable_social_valid? | ||
|
||
scope :current_year, -> { where("representative_date >= ? or last_representative_date > ?", Account.magic_date, Account.magic_date) } | ||
scope :current_year, -> { where("representative_date >= ? or last_representative_date > ?", CurrentAcademicYear.start_date, CurrentAcademicYear.start_date) } | ||
|
||
ThinkingSphinx::Callbacks.append(self, :behaviours => [:sql, :deltas]) # associated via eventdate | ||
|
||
|
@@ -88,9 +88,12 @@ def to_s | |
end | ||
|
||
def members | ||
@members or @members = event_roles.inject(Array.new) do |uniq_roles, er| | ||
( uniq_roles << er.member unless er.member.nil? or uniq_roles.any? { |ur| ur.id == er.member_id } ) or uniq_roles | ||
if @members | ||
return @members | ||
end | ||
|
||
non_unique_members = event_roles.map(&:member).select{ |m| not m.nil?} | ||
@members = non_unique_members.uniq(&:m.id) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't think We should make sure this returns an empty array not not This has to be a speed improvement. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yeah, the code is wrong. However, looking back I can't find any uses of this function or the members attribute. |
||
end | ||
|
||
def total_payroll | ||
|
@@ -118,7 +121,7 @@ def tic_and_stic_only | |
end | ||
|
||
def synchronize_representative_dates | ||
self.representative_date = self.eventdates[0].startdate | ||
self.representative_date = self.eventdates.first.startdate | ||
self.last_representative_date = eventdates.last.enddate | ||
end | ||
|
||
|
@@ -158,11 +161,11 @@ def current_year? | |
# a part of both years (i.e. Precollege). Otherwise Tracker does not allow | ||
# certain functions (like invoicing) for the now previous year's event. So, | ||
# we considered an event by start and end. | ||
(representative_date >= Account.magic_date) or (self.last_representative_date > Account.magic_date) | ||
(representative_date >= CurrentAcademicYear.start_date) or (self.last_representative_date > CurrentAcademicYear.start_date) | ||
end | ||
|
||
private | ||
def handle_organization | ||
def create_org_if_new | ||
if self.org_type == "new" | ||
self.organization = Organization.create(:name => org_new) | ||
end | ||
|
@@ -220,7 +223,7 @@ def set_created_email | |
end | ||
|
||
def eventdate_valid? | ||
if representative_date < Account.magic_date | ||
if representative_date < CurrentAcademicYear.start_date | ||
errors.add(:representative_date, "Requested date out of range") | ||
end | ||
end | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,27 +5,27 @@ class EventRoleApplication < ApplicationRecord | |
validates_presence_of :event_role, :member | ||
validate :event_role_is_appliable | ||
|
||
def superior | ||
def superiors | ||
position = event_role.superior | ||
unless position.nil? | ||
sup = event_role.roleable.event_roles.where(role: position).where.not(member: nil) | ||
return sup.map(&:member) unless sup.empty? | ||
end | ||
|
||
sup = event_role.roleable.tic_and_stic_only | ||
return sup unless sup.empty? | ||
# If there are no members with a superior role | ||
# TiC is next in line | ||
|
||
[] | ||
event_role.roleable.tic_and_stic_only | ||
NoRePercussions marked this conversation as resolved.
Show resolved
Hide resolved
|
||
end | ||
|
||
def superior_name | ||
sup = superior | ||
def superior_names | ||
sup = superiors | ||
return sup.map(&:display_name) unless sup.empty? | ||
["the Head of Tech"] | ||
end | ||
|
||
def superior_email | ||
sup = superior | ||
def superior_emails | ||
sup = superiors | ||
return sup.map(&:email) unless sup.empty? | ||
["[email protected]"] | ||
end | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -13,7 +13,7 @@ class Eventdate < ApplicationRecord | |
|
||
validates_presence_of :startdate, :enddate, :description, :locations, :calltype, :striketype | ||
validates_associated :locations, :equipment_profile | ||
validate :dates, :validate_call, :validate_strike | ||
validate :validate_chronologicity, :validate_call, :validate_strike | ||
|
||
before_validation :prune_roles | ||
after_save :synchronize_representative_dates | ||
|
@@ -37,7 +37,7 @@ class Eventdate < ApplicationRecord | |
|
||
ThinkingSphinx::Callbacks.append(self, :behaviours => [:sql, :deltas]) | ||
|
||
def dates | ||
def validate_chronologicity | ||
if startdate and enddate | ||
errors.add(:base, "We're not a time machine. (End Date can't be before Start Date)") unless startdate < enddate | ||
end | ||
|
@@ -52,22 +52,38 @@ def validate_strike | |
end | ||
|
||
def valid_call? | ||
(calltype != "literal") || ( | ||
(calldate.to_i <= startdate.to_i) && | ||
((startdate.to_i - calldate.to_i) < Event_Span_Seconds)) | ||
if calltype == "literal" | ||
call_before_start = calldate.to_i <= startdate.to_i | ||
call_not_too_early = (startdate.to_i - calldate.to_i) < Event_Span_Seconds | ||
|
||
return call_before_start && call_not_too_early | ||
end | ||
|
||
# Call is blank or start | ||
true | ||
end | ||
|
||
def valid_strike? | ||
(striketype != "literal") || ( | ||
(strikedate.to_i >= enddate.to_i) && | ||
((strikedate.to_i - enddate.to_i) < Event_Span_Seconds)) | ||
if striketype == "literal" | ||
strike_after_end = strikedate.to_i >= enddate.to_i | ||
strike_not_too_late = (strikedate.to_i - enddate.to_i) < Event_Span_Seconds | ||
|
||
return strike_after_end && strike_not_too_late | ||
end | ||
|
||
# Strike is blank, start, or none | ||
true | ||
end | ||
|
||
def has_call? | ||
# Yes: literal, startdate | ||
# No : blank | ||
self.calltype == "literal" or self.calltype == "startdate" | ||
end | ||
|
||
def has_strike? | ||
# Yes: literal, startdate | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Small typo, should be |
||
# No : blank, none | ||
self.striketype == "literal" or self.striketype == "enddate" | ||
end | ||
|
||
|
@@ -120,6 +136,9 @@ def full_roles | |
else | ||
roles = self.event_roles | ||
|
||
# If eventdate doesn't have these roles, | ||
# copy them from the event | ||
|
||
if not roles.any? { |r| r.role == EventRole::Role_HoT } | ||
roles += self.event.event_roles.find_all { |r| r.role == EventRole::Role_HoT } | ||
end | ||
|
@@ -172,25 +191,27 @@ def run_positions_for(member) | |
self.event_roles.where(member: member) | ||
end | ||
|
||
def self.runify(eventdates) | ||
eventdates.chunk do |ed| | ||
ed.full_roles | ||
end.map do |roles, run| | ||
run | ||
end | ||
def self.group_by_runcrew(eventdates) | ||
# In the event list, we want to be able | ||
# to share one runcrew list with multiple | ||
# adjacent eventdate rows if they are identical | ||
eventdates.chunk(&:full_roles).map { |roles, eds| eds } | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Have you tested this? I am uncertain if There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This does still work. I'm not particularly attached to either way of writing it, but I thought all the line breaking made it hard to read. Maybe it would be best to write the chunk with a one-line block? Up to you. |
||
end | ||
|
||
def self.weekify(eventdates) | ||
def self.group_by_weeks_until(eventdates) | ||
# This drives the main events list | ||
# being grouped by weeks until | ||
|
||
eventdates.chunk do |ed| | ||
if ed.startdate < DateTime.now.beginning_of_week | ||
0 | ||
else | ||
DateTime.now.beginning_of_week.upto(ed.startdate.to_datetime).count.fdiv(7).floor # https://stackoverflow.com/a/35092981 | ||
end | ||
end.map do |weeks, eds| | ||
end.map do |weeks_away, eds| | ||
{ | ||
:weeks_away => weeks, | ||
:eventruns => Eventdate.runify(eds) | ||
:weeks_away => weeks_away, | ||
:eventruns => Eventdate.group_by_runcrew(eds) | ||
} | ||
end | ||
end | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I know that we don't run the tests, but there are some files in
test/
that also need a rename (for consistency and to prevent later confusion).