Fixed some bugs in tasks, apple feature:
* Update ordergroup stats when task is destroyed. * Removed assigned caching attribute in task object. * A lot of eager loading for tasks controller.
This commit is contained in:
parent
9919183cb0
commit
0dff5ea784
10 changed files with 52 additions and 46 deletions
|
@ -3,8 +3,8 @@ class TasksController < ApplicationController
|
|||
#auto_complete_for :user, :nick
|
||||
|
||||
def index
|
||||
@non_group_tasks = Task.non_group
|
||||
@groups = Workgroup.all
|
||||
@non_group_tasks = Task.non_group.includes(assignments: :user)
|
||||
@groups = Workgroup.includes(open_tasks: {assignments: :user})
|
||||
end
|
||||
|
||||
def user
|
||||
|
@ -50,7 +50,12 @@ class TasksController < ApplicationController
|
|||
end
|
||||
|
||||
def destroy
|
||||
Task.find(params[:id]).destroy
|
||||
task = Task.find(params[:id])
|
||||
# Save user_ids to update apple statistics after destroy
|
||||
user_ids = task.user_ids
|
||||
task.destroy
|
||||
task.update_ordergroup_stats(user_ids)
|
||||
|
||||
redirect_to tasks_url, :notice => "Aufgabe wurde gelöscht"
|
||||
end
|
||||
|
||||
|
@ -79,7 +84,7 @@ class TasksController < ApplicationController
|
|||
|
||||
# Shows all tasks, which are already done
|
||||
def archive
|
||||
@tasks = Task.done.page(params[:page]).per(@per_page)
|
||||
@tasks = Task.done.page(params[:page]).per(@per_page).order('tasks.updated_on DESC').includes(assignments: :user)
|
||||
end
|
||||
|
||||
# shows workgroup (normal group) to edit weekly_tasks_template
|
||||
|
|
|
@ -9,9 +9,8 @@ module TasksHelper
|
|||
# generate colored number of still required users
|
||||
def highlighted_required_users(task)
|
||||
unless task.enough_users_assigned?
|
||||
still_required = task.required_users - task.assignments.select { |ass| ass.accepted }.size
|
||||
content_tag :span, still_required, class: 'badge badge-important',
|
||||
title: "Es fehlen #{still_required} Mitstreiterinnen!"
|
||||
content_tag :span, task.still_required_users, class: 'badge badge-important',
|
||||
title: "Es fehlen #{task.still_required_users} Mitstreiterinnen!"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -2,16 +2,6 @@ class Assignment < ActiveRecord::Base
|
|||
|
||||
belongs_to :user
|
||||
belongs_to :task
|
||||
|
||||
# after user is assigned mark task as assigned
|
||||
def after_create
|
||||
self.task.update_attribute(:assigned, true)
|
||||
end
|
||||
|
||||
# update assigned-attribute
|
||||
def after_destroy
|
||||
self.task.update_attribute(:assigned, false) if self.task.assignments.empty?
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
|
|
@ -6,6 +6,9 @@
|
|||
# * account_balance (decimal)
|
||||
# * account_updated (datetime)
|
||||
class Ordergroup < Group
|
||||
|
||||
APPLE_MONTH_AGO = 6 # How many month back we will count tasks and orders sum
|
||||
|
||||
acts_as_paranoid # Avoid deleting the ordergroup for consistency of order-results
|
||||
serialize :stats
|
||||
|
||||
|
@ -56,11 +59,10 @@ class Ordergroup < Group
|
|||
end
|
||||
|
||||
def update_stats!
|
||||
time = 6.month.ago
|
||||
# Get hours for every job of each user in period
|
||||
jobs = users.sum { |u| u.tasks.done.sum(:duration, :conditions => ["updated_on > ?", time]) }
|
||||
jobs = users.sum { |u| u.tasks.done.sum(:duration, :conditions => ["updated_on > ?", APPLE_MONTH_AGO.month.ago]) }
|
||||
# Get group_order.price for every finished order in this period
|
||||
orders_sum = group_orders.includes(:order).merge(Order.finished).where('orders.ends >= ?', time).sum(:price)
|
||||
orders_sum = group_orders.includes(:order).merge(Order.finished).where('orders.ends >= ?', APPLE_MONTH_AGO.month.ago).sum(:price)
|
||||
|
||||
@readonly = false # Dirty hack, avoid getting RecordReadOnly exception when called in task after_save callback. A rails bug?
|
||||
update_attribute(:stats, {:jobs_size => jobs, :orders_sum => orders_sum})
|
||||
|
@ -79,12 +81,13 @@ class Ordergroup < Group
|
|||
# If the the option stop_ordering_under is set, the ordergroup is only allowed to participate in an order,
|
||||
# when the apples value is above the configured amount.
|
||||
# The restriction can be deactivated for each ordergroup.
|
||||
# Only ordergroups, which have participated in more than 5 order are affected
|
||||
# Only ordergroups, which have participated in more than 5 orders in total and more than 2 orders in apple time period
|
||||
def not_enough_apples?
|
||||
FoodsoftConfig[:stop_ordering_under].present? and
|
||||
!ignore_apple_restriction and
|
||||
apples < FoodsoftConfig[:stop_ordering_under] and
|
||||
group_orders.count > 5
|
||||
group_orders.count > 5 and
|
||||
group_orders.joins(:order).merge(Order.finished).where('orders.ends >= ?', APPLE_MONTH_AGO.month.ago).count > 2
|
||||
end
|
||||
|
||||
# Global average
|
||||
|
|
|
@ -37,11 +37,12 @@ class Task < ActiveRecord::Base
|
|||
where(["tasks.due_date >= ? AND tasks.due_date <= ?", Time.now, number.days.from_now])
|
||||
end
|
||||
|
||||
# count tasks with no responsible person
|
||||
# count tasks with not enough responsible people
|
||||
# tasks for groups the user is not a member are ignored
|
||||
def self.unassigned_tasks_for(user)
|
||||
Task.undone.where(assigned: false).includes(:workgroup).all.select do |task|
|
||||
!task.workgroup or user.member_of?(task.workgroup)
|
||||
undone.includes(:assignments, workgroup: :memberships).select do |task|
|
||||
!task.enough_users_assigned? and
|
||||
(!task.workgroup or task.workgroup.memberships.detect { |m| m.user_id == user.id })
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -54,7 +55,11 @@ class Task < ActiveRecord::Base
|
|||
end
|
||||
|
||||
def enough_users_assigned?
|
||||
assignments.find_all_by_accepted(true).size >= required_users ? true : false
|
||||
assignments.to_a.count(&:accepted) >= required_users ? true : false
|
||||
end
|
||||
|
||||
def still_required_users
|
||||
required_users - assignments.to_a.count(&:accepted)
|
||||
end
|
||||
|
||||
# Get users from comma seperated ids
|
||||
|
@ -95,12 +100,8 @@ class Task < ActiveRecord::Base
|
|||
@user_list ||= users.collect(&:id).join(", ")
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def update_ordergroup_stats
|
||||
if done
|
||||
def update_ordergroup_stats(user_ids = self.user_ids)
|
||||
Ordergroup.joins(:users).where(users: {id: user_ids}).each(&:update_stats!)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -28,15 +28,15 @@
|
|||
.form-actions
|
||||
- if @order.open?
|
||||
= link_to "Bearbeiten", edit_order_path(@order), class: 'btn'
|
||||
= link_to 'Beenden!', finish_order_path(@order), method: :post,
|
||||
confirm: "Willst Du wirklich die Bestellung beenden?\nEs gibt kein zurück..", class: 'btn'
|
||||
= link_to 'Beenden!', finish_order_path(@order), method: :post, class: 'btn btn-success',
|
||||
confirm: "Willst Du wirklich die Bestellung beenden?\nEs gibt kein zurück.."
|
||||
- unless @order.closed?
|
||||
= link_to "Löschen", @order, confirm: "Willst du wirklich die Bestellung löschen?", method: :delete,
|
||||
class: 'btn btn-danger'
|
||||
|
||||
- unless @order.open?
|
||||
%ul.nav.nav-pills
|
||||
%li.active= update_articles_link(@order, "Artikelübersicht", :default)
|
||||
%li= update_articles_link(@order, "Artikelübersicht", :default)
|
||||
%li= update_articles_link(@order, "Sortiert nach Gruppen", :groups)
|
||||
%li= update_articles_link(@order, "Sortiert nach Artikeln", :articles)
|
||||
%li= link_to 'Kommentare', '#comments'
|
||||
|
|
|
@ -14,6 +14,4 @@
|
|||
%tr
|
||||
%td= task.due_date unless task.due_date.nil?
|
||||
%td= link_to "#{task.name} (#{task.duration}h)", :controller => "tasks", :action => "show", :id => task
|
||||
%td
|
||||
- unless task.users.empty?
|
||||
= task.users.map(&:nick).join(", ")
|
||||
%td= task_assignments task
|
|
@ -5,8 +5,10 @@
|
|||
%dl.dl-horizontal
|
||||
%dt Name
|
||||
%dd= @task.name
|
||||
- if @task.description.present?
|
||||
%dt Beschreibung
|
||||
%dd= simple_format(@task.description)
|
||||
- if @task.due_date.present?
|
||||
%dt Fälligkeitsdatum
|
||||
%dd= format_date(@task.due_date)
|
||||
%dt Dauer in Stunden
|
||||
|
|
9
db/migrate/20121216180646_remove_assigned_from_tasks.rb
Normal file
9
db/migrate/20121216180646_remove_assigned_from_tasks.rb
Normal file
|
@ -0,0 +1,9 @@
|
|||
class RemoveAssignedFromTasks < ActiveRecord::Migration
|
||||
def up
|
||||
remove_column :tasks, :assigned
|
||||
end
|
||||
|
||||
def down
|
||||
add_column :tasks, :assigned, :boolean
|
||||
end
|
||||
end
|
|
@ -11,7 +11,7 @@
|
|||
#
|
||||
# It's strongly recommended to check this file into your version control system.
|
||||
|
||||
ActiveRecord::Schema.define(:version => 20121112093327) do
|
||||
ActiveRecord::Schema.define(:version => 20121216180646) do
|
||||
|
||||
create_table "article_categories", :force => true do |t|
|
||||
t.string "name", :default => "", :null => false
|
||||
|
@ -88,8 +88,8 @@ ActiveRecord::Schema.define(:version => 20121112093327) do
|
|||
t.datetime "failed_at"
|
||||
t.string "locked_by"
|
||||
t.string "queue"
|
||||
t.datetime "created_at"
|
||||
t.datetime "updated_at"
|
||||
t.datetime "created_at", :null => false
|
||||
t.datetime "updated_at", :null => false
|
||||
end
|
||||
|
||||
add_index "delayed_jobs", ["priority", "run_at"], :name => "delayed_jobs_priority"
|
||||
|
@ -330,7 +330,6 @@ ActiveRecord::Schema.define(:version => 20121112093327) do
|
|||
t.date "due_date"
|
||||
t.boolean "done", :default => false
|
||||
t.integer "workgroup_id"
|
||||
t.boolean "assigned", :default => false
|
||||
t.datetime "created_on", :null => false
|
||||
t.datetime "updated_on", :null => false
|
||||
t.integer "required_users", :default => 1
|
||||
|
|
Loading…
Reference in a new issue