diff --git a/app/controllers/admin/memberships_controller.rb b/app/controllers/admin/memberships_controller.rb new file mode 100644 index 00000000..d362ecf9 --- /dev/null +++ b/app/controllers/admin/memberships_controller.rb @@ -0,0 +1,35 @@ +class Admin::MembershipsController < ApplicationController + + def add_member + @group = Group.find(params[:group_id]) + user = User.find(params[:user_id]) + Membership.create(:group => @group, :user => user) + redirect_to :action => 'reload', :group_id => @group + end + + def drop_member + begin + group = Group.find(params[:group_id]) + Membership.find(params[:membership_id]).destroy + if User.find(@current_user.id).role_admin? + redirect_to :action => 'reload', :group_id => group + else + # If the user drops himself from admin group + flash[:notice] = MESG_NO_ADMIN_ANYMORE + render(:update) {|page| page.redirect_to :controller => "index"} + end + rescue => error + flash[:error] = error.to_s + redirect_to :action => 'reload', :group_id => group + end + end + + def reload + @group = Group.find(params[:group_id]) + render :update do |page| + page.replace_html 'members', :partial => 'members', :object => @group + page.replace_html 'non_members', :partial => 'non_members', :object => @group + end + end + +end diff --git a/app/controllers/admin/workgroups_controller.rb b/app/controllers/admin/workgroups_controller.rb new file mode 100644 index 00000000..f7df7d1a --- /dev/null +++ b/app/controllers/admin/workgroups_controller.rb @@ -0,0 +1,67 @@ +class Admin::WorkgroupsController < ApplicationController + + def index + if (params[:per_page] && params[:per_page].to_i > 0 && params[:per_page].to_i <= 100) + @per_page = params[:per_page].to_i + else + @per_page = 20 + end + + # if the search field is used + conditions = "name LIKE '%#{params[:query]}%'" unless params[:query].nil? + + @workgroups = Workgroup.paginate(:conditions => conditions, :page => params[:page], + :per_page => @per_page, :order => 'name') + + respond_to do |format| + format.html # index.html.erb + format.js { render :partial => "workgroups" } + end + end + + + def show + @workgroup = Workgroup.find(params[:id]) + end + + def new + @workgroup = Workgroup.new + end + + def edit + @workgroup = Workgroup.find(params[:id]) + end + + def create + @workgroup = Workgroup.new(params[:workgroup]) + + if @workgroup.save + flash[:notice] = 'Workgroup was successfully created.' + redirect_to([:admin, @workgroup]) + else + render :action => "new" + end + end + + def update + @workgroup = Workgroup.find(params[:id]) + + if @workgroup.update_attributes(params[:workgroup]) + flash[:notice] = 'Workgroup was successfully updated.' + redirect_to([:admin, @workgroup]) + else + render :action => "edit" + end + end + + def destroy + @workgroup = Workgroup.find(params[:id]) + @workgroup.destroy + + redirect_to(admin_workgroups_url) + end + + def memberships + @group = Workgroup.find(params[:id]) + end +end diff --git a/app/helpers/admin/memberships_helper.rb b/app/helpers/admin/memberships_helper.rb new file mode 100644 index 00000000..1dce2220 --- /dev/null +++ b/app/helpers/admin/memberships_helper.rb @@ -0,0 +1,2 @@ +module Admin::MembershipsHelper +end diff --git a/app/models/article.rb b/app/models/article.rb index 07e3a5c7..0c43c16d 100644 --- a/app/models/article.rb +++ b/app/models/article.rb @@ -1,3 +1,28 @@ +# == Schema Information +# Schema version: 20090113111624 +# +# Table name: articles +# +# id :integer(4) not null, primary key +# name :string(255) default(""), not null +# supplier_id :integer(4) default(0), not null +# article_category_id :integer(4) default(0), not null +# unit :string(255) default(""), not null +# note :string(255) +# availability :boolean(1) default(TRUE), not null +# manufacturer :string(255) +# origin :string(255) +# shared_updated_on :datetime +# net_price :decimal(8, 2) +# gross_price :decimal(8, 2) default(0.0), not null +# tax :float +# deposit :decimal(8, 2) default(0.0) +# unit_quantity :integer(4) default(1), not null +# order_number :string(255) +# created_at :datetime +# updated_at :datetime +# + # == Schema Information # Schema version: 20090102171850 # diff --git a/app/models/group.rb b/app/models/group.rb index 3a05ef78..d0b1c7c5 100644 --- a/app/models/group.rb +++ b/app/models/group.rb @@ -28,12 +28,6 @@ class Group < ActiveRecord::Base has_many :memberships, :dependent => :destroy has_many :users, :through => :memberships - has_many :tasks - # returns all non-finished tasks - has_many :open_tasks, :class_name => 'Task', :conditions => ['done = ?', false], :order => 'due_date ASC' - - attr_accessible :name, :description, :role_admin, :role_suppliers, :role_article_meta, :role_finance, :role_orders, - :weekly_task, :weekday, :task_name, :task_description, :task_required_users validates_length_of :name, :in => 1..25 validates_uniqueness_of :name @@ -63,31 +57,9 @@ class Group < ActiveRecord::Base raise ERR_LAST_ADMIN_GROUP_DELETE if self.role_admin == true && Group.find_all_by_role_admin(true).size == 1 end - # Returns an Array with date-objects to represent the next weekly-tasks - def next_weekly_tasks(number = 8) - # our system starts from 0 (sunday) to 6 (saturday) - # get difference between groups weekday and now - diff = self.weekday - Time.now.wday - if diff >= 0 - # weektask is in current week - nextTask = diff.day.from_now - else - # weektask is in the next week - nextTask = (diff + 7).day.from_now - end - # now generate the Array - nextTasks = Array.new - number.times do - nextTasks << nextTask - nextTask = 1.week.from_now(nextTask) - end - return nextTasks - end - # get all groups, which are NOT OrderGroups - #TODO: better implement a new model, which inherits from Group, e.g. WorkGroup def self.workgroups - Group.find :all, :conditions => "type IS NULL" + Workgroup.all end protected diff --git a/app/models/invoice.rb b/app/models/invoice.rb index 9b678c16..3ed883d8 100644 --- a/app/models/invoice.rb +++ b/app/models/invoice.rb @@ -1,5 +1,5 @@ # == Schema Information -# Schema version: 20090102171850 +# Schema version: 20090113111624 # # Table name: invoices # @@ -9,6 +9,7 @@ # number :string(255) # date :date # paid_on :date +# note :text # amount :decimal(8, 2) default(0.0), not null # created_at :datetime # updated_at :datetime diff --git a/app/models/user.rb b/app/models/user.rb index c48d74a3..fb29d106 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -72,8 +72,10 @@ class User < ActiveRecord::Base end def update_settings - for setting in User::setting_keys.keys - self.settings[setting] = setting_attributes[setting] && setting_attributes[setting] == '1' ? '1' : nil + unless setting_attributes.nil? + for setting in User::setting_keys.keys + self.settings[setting] = setting_attributes[setting] && setting_attributes[setting] == '1' ? '1' : nil + end end end diff --git a/app/models/workgroup.rb b/app/models/workgroup.rb new file mode 100644 index 00000000..d0c1e779 --- /dev/null +++ b/app/models/workgroup.rb @@ -0,0 +1,57 @@ +# == Schema Information +# Schema version: 20090113111624 +# +# Table name: groups +# +# id :integer(4) not null, primary key +# type :string(255) default(""), not null +# name :string(255) default(""), not null +# description :string(255) +# actual_size :integer(4) +# account_balance :decimal(8, 2) default(0.0), not null +# account_updated :datetime +# created_on :datetime not null +# role_admin :boolean(1) not null +# role_suppliers :boolean(1) not null +# role_article_meta :boolean(1) not null +# role_finance :boolean(1) not null +# role_orders :boolean(1) not null +# weekly_task :boolean(1) +# weekday :integer(4) +# task_name :string(255) +# task_description :string(255) +# task_required_users :integer(4) default(1) +# + +class Workgroup < Group + + has_many :tasks + # returns all non-finished tasks + has_many :open_tasks, :class_name => 'Task', :conditions => ['done = ?', false], :order => 'due_date ASC' + + def self.weekdays + [["Montag", "1"], ["Dienstag", "2"], ["Mittwoch","3"],["Donnerstag","4"],["Freitag","5"],["Samstag","6"],["Sonntag","0"]] + end + + # Returns an Array with date-objects to represent the next weekly-tasks + def next_weekly_tasks(number = 8) + # our system starts from 0 (sunday) to 6 (saturday) + # get difference between groups weekday and now + diff = self.weekday - Time.now.wday + if diff >= 0 + # weektask is in current week + nextTask = diff.day.from_now + else + # weektask is in the next week + nextTask = (diff + 7).day.from_now + end + # now generate the Array + nextTasks = Array.new + number.times do + nextTasks << nextTask + nextTask = 1.week.from_now(nextTask) + end + return nextTasks + end + +end diff --git a/app/views/admin/memberships/_edit_members.rhtml b/app/views/admin/memberships/_edit_members.rhtml new file mode 100644 index 00000000..03995762 --- /dev/null +++ b/app/views/admin/memberships/_edit_members.rhtml @@ -0,0 +1,21 @@ +
+ Hier kannst Du die Mitglieder der Gruppe verwalten. +
+<%= @group.name %> hat keine Mitglieder.
+ <% end %> \ No newline at end of file diff --git a/app/views/admin/memberships/_non_members.rhtml b/app/views/admin/memberships/_non_members.rhtml new file mode 100644 index 00000000..882bf8b2 --- /dev/null +++ b/app/views/admin/memberships/_non_members.rhtml @@ -0,0 +1,11 @@ +<%= flash[:notice] %>
+ +<%= yield %> + + + diff --git a/config/routes.rb b/config/routes.rb index ed65b5d7..f7701145 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -2,6 +2,9 @@ ActionController::Routing::Routes.draw do |map| map.namespace :admin do |admin| admin.resources :users + admin.resources :workgroups, :member => { :memberships => :get } + admin.connect 'memberships/:action/:id', :controller => 'memberships' + admin.add_member 'add_member', :controller => 'memberships', :action => 'add_member' end map.namespace :finance do |finance| diff --git a/db/migrate/20090113111624_create_workgroups.rb b/db/migrate/20090113111624_create_workgroups.rb new file mode 100644 index 00000000..2b8532ab --- /dev/null +++ b/db/migrate/20090113111624_create_workgroups.rb @@ -0,0 +1,14 @@ +class CreateWorkgroups < ActiveRecord::Migration + def self.up + # Migrate all groups to workgroups + Group.find(:all, :conditions => { :type => "" }).each do |workgroup| + workgroup.update_attribute(:type, "Workgroup") + end + end + + def self.down + Group.find(:all, :conditions => { :type => "Workgroup" }).each do |workgroup| + workgroup.update_attribute(:type, "") + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 8ef6ca61..4f0de832 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -9,7 +9,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20090102155714) do +ActiveRecord::Schema.define(:version => 20090113111624) do create_table "article_categories", :force => true do |t| t.string "name", :default => "", :null => false @@ -71,6 +71,12 @@ ActiveRecord::Schema.define(:version => 20090102155714) do add_index "configurable_settings", ["name"], :name => "index_configurable_settings_on_name" + create_table "deliveries", :force => true do |t| + t.integer "supplier_id" + t.date "delivered_on" + t.datetime "created_at" + end + create_table "financial_transactions", :force => true do |t| t.integer "order_group_id", :default => 0, :null => false t.decimal "amount", :precision => 8, :scale => 2, :default => 0.0, :null => false diff --git a/public/stylesheets/scaffold.css b/public/stylesheets/scaffold.css new file mode 100644 index 00000000..093c2099 --- /dev/null +++ b/public/stylesheets/scaffold.css @@ -0,0 +1,54 @@ +body { background-color: #fff; color: #333; } + +body, p, ol, ul, td { + font-family: verdana, arial, helvetica, sans-serif; + font-size: 13px; + line-height: 18px; +} + +pre { + background-color: #eee; + padding: 10px; + font-size: 11px; +} + +a { color: #000; } +a:visited { color: #666; } +a:hover { color: #fff; background-color:#000; } + +.fieldWithErrors { + padding: 2px; + background-color: red; + display: table; +} + +#errorExplanation { + width: 400px; + border: 2px solid red; + padding: 7px; + padding-bottom: 12px; + margin-bottom: 20px; + background-color: #f0f0f0; +} + +#errorExplanation h2 { + text-align: left; + font-weight: bold; + padding: 5px 5px 5px 15px; + font-size: 12px; + margin: -7px; + background-color: #c00; + color: #fff; +} + +#errorExplanation p { + color: #333; + margin-bottom: 0; + padding: 5px; +} + +#errorExplanation ul li { + font-size: 12px; + list-style: square; +} + diff --git a/test/fixtures/articles.yml b/test/fixtures/articles.yml index 018eb3b7..87760e7e 100644 --- a/test/fixtures/articles.yml +++ b/test/fixtures/articles.yml @@ -1,5 +1,5 @@ # == Schema Information -# Schema version: 20090102171850 +# Schema version: 20090113111624 # # Table name: articles # diff --git a/test/fixtures/suppliers.yml b/test/fixtures/suppliers.yml index 40ecc609..02cceca3 100644 --- a/test/fixtures/suppliers.yml +++ b/test/fixtures/suppliers.yml @@ -1,5 +1,5 @@ # == Schema Information -# Schema version: 20090102171850 +# Schema version: 20090113111624 # # Table name: suppliers # diff --git a/test/fixtures/workgroups.yml b/test/fixtures/workgroups.yml new file mode 100644 index 00000000..5bf02933 --- /dev/null +++ b/test/fixtures/workgroups.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html + +# one: +# column: value +# +# two: +# column: value diff --git a/test/functional/admin/groups_controller_test.rb b/test/functional/admin/groups_controller_test.rb new file mode 100644 index 00000000..0c1d1339 --- /dev/null +++ b/test/functional/admin/groups_controller_test.rb @@ -0,0 +1,8 @@ +require 'test_helper' + +class Admin::GroupsControllerTest < ActionController::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/functional/admin/memberships_controller_test.rb b/test/functional/admin/memberships_controller_test.rb new file mode 100644 index 00000000..255c7a11 --- /dev/null +++ b/test/functional/admin/memberships_controller_test.rb @@ -0,0 +1,8 @@ +require 'test_helper' + +class Admin::MembershipsControllerTest < ActionController::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end diff --git a/test/functional/workgroups_controller_test.rb b/test/functional/workgroups_controller_test.rb new file mode 100644 index 00000000..70ff4e08 --- /dev/null +++ b/test/functional/workgroups_controller_test.rb @@ -0,0 +1,45 @@ +require 'test_helper' + +class WorkgroupsControllerTest < ActionController::TestCase + test "should get index" do + get :index + assert_response :success + assert_not_nil assigns(:workgroups) + end + + test "should get new" do + get :new + assert_response :success + end + + test "should create workgroup" do + assert_difference('Workgroup.count') do + post :create, :workgroup => { } + end + + assert_redirected_to workgroup_path(assigns(:workgroup)) + end + + test "should show workgroup" do + get :show, :id => workgroups(:one).id + assert_response :success + end + + test "should get edit" do + get :edit, :id => workgroups(:one).id + assert_response :success + end + + test "should update workgroup" do + put :update, :id => workgroups(:one).id, :workgroup => { } + assert_redirected_to workgroup_path(assigns(:workgroup)) + end + + test "should destroy workgroup" do + assert_difference('Workgroup.count', -1) do + delete :destroy, :id => workgroups(:one).id + end + + assert_redirected_to workgroups_path + end +end diff --git a/test/unit/workgroup_test.rb b/test/unit/workgroup_test.rb new file mode 100644 index 00000000..60c4801d --- /dev/null +++ b/test/unit/workgroup_test.rb @@ -0,0 +1,8 @@ +require 'test_helper' + +class WorkgroupTest < ActiveSupport::TestCase + # Replace this with your real tests. + test "the truth" do + assert true + end +end