Skip to content
This repository has been archived by the owner on Jul 24, 2020. It is now read-only.

Catalog render takes forever #628

Merged
merged 7 commits into from
Jul 7, 2014
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
24 changes: 0 additions & 24 deletions app/helpers/equipment_models_helper.rb
Original file line number Diff line number Diff line change
@@ -1,19 +1,4 @@
module EquipmentModelsHelper
def bar_progress
define_width
@width_percentage = number_to_percentage(@width * 100 || "0%", precision: 0)
end

def progress_color
define_width
if @width > (2.0 / 3.0)
@color = "progress-success"
elsif @width <= (2.0 / 3.0) && @width > (1.0 / 3.0)
@color = "progress-warning"
else
@color = "progress-danger"
end
end

def evaluate_img_presence equipment_model
if equipment_model.photo.exists?
Expand All @@ -23,13 +8,4 @@ def evaluate_img_presence equipment_model
end
end

private

def define_width
if @equipment_model.equipment_objects.size > 0
@width = (@equipment_model.num_available(cart.start_date, cart.due_date).to_f) / @equipment_model.equipment_objects.size.to_f
else
@width = 0
end
end
end
17 changes: 11 additions & 6 deletions app/models/equipment_model.rb
Original file line number Diff line number Diff line change
Expand Up @@ -145,17 +145,15 @@ def document_attributes=(document_attributes)
end
end

def num_available(start_date, due_date)
def num_available_from_source(start_date, due_date, source_reservations)
# get the number available in the given date range
# O(1) database queries
# take an activerecord relation instead of using a database call
# for database query optimization purposes
# O(n) comparisons
relevant_reservations = Reservation.for_eq_model(self).
reserved_in_date_range(start_date.to_datetime, due_date.to_datetime).
not_returned;
max_num = self.equipment_objects.active.count - number_overdue
min_available = Float::INFINITY
start_date.to_date.upto(due_date.to_date) do |d|
available = max_num - relevant_reservations.reserved_on_date(d).count
available = max_num - source_reservations.reserved_on_date(d).count
return 0 if min_available <= 0
if min_available > available
min_available = available
Expand All @@ -164,6 +162,13 @@ def num_available(start_date, due_date)
return min_available
end

def num_available(start_date, due_date)
# for if you just want the number available
relevant_reservations = Reservation.for_eq_model(self).
reserved_in_date_range(start_date.to_datetime, due_date.to_datetime).
not_returned;
num_available_from_source(start_date, due_date, relevant_reservations)
end
# Returns true if the reserver is ineligible to checkout the model.
def model_restricted?(reserver_id)
reserver = User.find(reserver_id)
Expand Down
92 changes: 45 additions & 47 deletions app/views/catalog/_equipment_model_div.html.erb
Original file line number Diff line number Diff line change
@@ -1,54 +1,52 @@
<div class="thumbnail">
<% if equipment_model.photo.exists? %>
<%# show equipment model image %>
<%= link_to equipment_model do %>
<%= image_tag equipment_model.photo.url(:thumbnail) %>
<% end %>
<% else %>
<%= link_to equipment_model do %>
<%= image_tag "no-image.gif" %>
<% end %>
<%= link_to equipment_model do %>
<% image_tag (equipment_model.photo.exists? ? equipment_model.photo.url(:thumbnail) : "no-image.gif") %>
<% end %>
<h3 class="equipment_title"><%= link_to equipment_model.name, equipment_model, :class => 'equipment_title_link', :rel => 'tooltip', :title => equipment_model.name %></h3>
<div class="caption_cat">
<h3 class="equipment_title">
<%= link_to equipment_model.name, equipment_model, class: 'equipment_title_link', rel: 'tooltip', title: equipment_model.name %>
</h3>
<div class="caption_cat">
<hr class ="special-hr"/>
<span class="giant-numbers span1">
<% @available = equipment_model.num_available_from_source(cart.start_date, cart.due_date, relevant_reservations) %>
<%= @available %>
</span>
<p class="model_availability">
available from <%= cart.start_date.strftime("%b %d, %Y") %>
to <%= cart.due_date.strftime("%b %d, %Y") %>
</p>
<hr class ="special-hr"/>
<p class="equipment_descr">
<%= markdown_to_plain_text(equipment_model.description) %><br/>
<%= link_to "More Info", equipment_model, class: 'more_info' %>
</p>
</div>

<div class = "add_to_cart_box">
<% @restricted = equipment_model.model_restricted?(cart.reserver_id) %>
<% if @restricted %>
<%= button_tag "Add to Cart", class: "btn disabled add_to_cart_disabled"%>
<%= link_to "#qualifications_modal", class: 'not-qualified-icon', rel: "tooltip", title: "Not Qualified (click for more info)", :"data-toggle" => 'modal' do %>
<i class="fa fa-exclamation-triangle"></i>
<% end %>
<% elsif @available > 0 %>
<%= link_to "Add to Cart", add_to_cart_path(equipment_model), :method => :put, :remote => true, :class => "btn add_to_cart" %>
<% else %>
<%= button_tag "Add to Cart", :class => "btn disabled add_to_cart_disabled"%>
<% end %>
</div>

<hr class ="special-hr"/>
<span class="giant-numbers span1"><%= equipment_model.num_available(cart.start_date, cart.due_date) || "0" %></span>
<p class="model_availability">available from <%= cart.start_date.strftime("%b %d, %Y") %> to <%= cart.due_date.strftime("%b %d, %Y") %></p>
<hr class ="special-hr"/>
<p class="equipment_descr">
<%= markdown_to_plain_text(equipment_model.description) %><br/>
<%= link_to "More Info", equipment_model, :class => 'more_info' %>
</p>
<% if @restricted %>
<div id="qualifications_modal" class="modal hide fade">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h3>Qualification Required</h3>
</div>
<% if equipment_model.model_restricted?(cart.reserver_id) %>
<div class="add_to_cart_box">
<%= button_tag "Add to Cart", :class => "btn disabled add_to_cart_disabled"%>
<%= link_to "#qualifications_modal", class: 'not-qualified-icon', rel: "tooltip", title: "Not Qualified (click for more info)", :"data-toggle" => 'modal' do %>
<i class="fa fa-exclamation-triangle"></i>
<% end %>
</div>
<div class="modal-body">
<p><%= Requirement.list_requirement_admins(User.find(cart.reserver_id), equipment_model) %></p>:w
</div>
</div>
<% end %>

<div id="qualifications_modal" class="modal hide fade">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h3>Qualification Required</h3>
</div>
<div class="modal-body">
<%# TODO: Eventually requirements will be handled with special Requests, similar to how extended reservations are handled. %>
<p><%= Requirement.list_requirement_admins(User.find(cart.reserver_id), equipment_model) %></p>
</div>
</div>


<% elsif equipment_model.num_available(cart.start_date, cart.due_date) > 0 %>
<div class="add_to_cart_box">
<%= link_to "Add to Cart", add_to_cart_path(equipment_model), :method => :put, :remote => true, :class => "btn add_to_cart" %>
</div>
<% else %>
<div class="add_to_cart_box">
<%= button_tag "Add to Cart", :class => "btn disabled add_to_cart_disabled"%>
<%# this line is commented out to remove the button when no equipment is available, see issue 555 %>
</div>
<% end %>
</div>
18 changes: 11 additions & 7 deletions app/views/catalog/_models_available.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,23 @@
<% prepare_pagination %>
<% blackout_errors %>

<% if @equipment_models_by_category.empty? && (can? :manage, EquipmentModel) %>
<p><h3>No equipment found. Try creating some
<% if @equipment_models_by_category.empty? %>
<p>
<h3>No equipment found.
<% if can? :manage, EquipmentModel %>
Try creating some
<%= link_to "Equipment Models", new_equipment_model_path %>
first!</h3>
first!
<% end %>
</h3>
</p>
<% elsif @equipment_models_by_category.empty? %>
<p><h3>No equipment found.</h3></p>
<% else %>
<div id='models_available'>
<% if @pagination_required %>
<div class="row">
<div id="pagination_line" class="span9">
<%# for kaminari pagination %>
<%= paginate @paginated_equipment_models_by_category, :params => {:controller => 'catalog', :action => 'index' } %>
<%= paginate @paginated_equipment_models_by_category, params: {controller: 'catalog', action: 'index' } %>
<%= form_tag update_user_per_cat_page_path, id: 'items_per_form', :class => "form-inline pull-right", :remote => true, :method=>'put' do %>
<%= label_tag "Items per page:" %>
<%= select_tag :user_cat_items_per_page, options_for_select(@user_per_page_opts, session[:user_per_cat_page]), :class => 'span1 autosubmitme' %>
Expand All @@ -24,6 +27,7 @@
</div>
<% end %>

<% relevant_reservations = Reservation.active.reserved_in_date_range(cart.start_date, cart.due_date).not_returned %>
<% @equipment_models_by_category.each do |category, equipment_models| %>
<h2 class="catalog">
<%# print category name %>
Expand All @@ -33,7 +37,7 @@
<ul class="thumbnails">
<% equipment_models.each do |equipment_model| %>
<li class="span3">
<%= render :partial => 'equipment_model_div', :locals => { :equipment_model => equipment_model } %>
<%= render partial: 'equipment_model_div', locals: { equipment_model: equipment_model, relevant_reservations: relevant_reservations } %>
</li>
<% end %>
</ul>
Expand Down