openproject-meeting 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/CHANGELOG.md +46 -0
- data/README.md +82 -0
- data/app/assets/images/meeting/agenda.png +0 -0
- data/app/assets/images/meeting/meeting.png +0 -0
- data/app/assets/images/meeting/minutes.png +0 -0
- data/app/assets/stylesheets/meeting/meeting.css.erb +39 -0
- data/app/controllers/meeting_agendas_controller.rb +33 -0
- data/app/controllers/meeting_contents_controller.rb +95 -0
- data/app/controllers/meeting_minutes_controller.rb +22 -0
- data/app/controllers/meetings_controller.rb +150 -0
- data/app/helpers/meeting_contents_helper.rb +68 -0
- data/app/helpers/meetings_helper.rb +16 -0
- data/app/mailers/meeting_mailer.rb +28 -0
- data/app/models/meeting.rb +163 -0
- data/app/models/meeting_agenda.rb +95 -0
- data/app/models/meeting_content.rb +67 -0
- data/app/models/meeting_minutes.rb +81 -0
- data/app/models/meeting_participant.rb +45 -0
- data/app/views/hooks/_activity_index_head.html.erb +13 -0
- data/app/views/meeting_contents/_form.html.erb +33 -0
- data/app/views/meeting_contents/_show.html.erb +40 -0
- data/app/views/meeting_contents/diff.html.erb +33 -0
- data/app/views/meeting_contents/history.html.erb +49 -0
- data/app/views/meeting_contents/show.html.erb +13 -0
- data/app/views/meeting_mailer/content_for_review.html.erb +23 -0
- data/app/views/meeting_mailer/content_for_review.text.erb +9 -0
- data/app/views/meetings/_form.html.erb +61 -0
- data/app/views/meetings/edit.html.erb +17 -0
- data/app/views/meetings/index.html.erb +51 -0
- data/app/views/meetings/new.html.erb +17 -0
- data/app/views/meetings/show.html.erb +48 -0
- data/app/views/shared/_meeting_header.html.erb +3 -0
- data/config/locales/de.yml +47 -0
- data/config/locales/en.yml +47 -0
- data/config/routes.rb +53 -0
- data/db/migrate/20110106210555_create_meetings.rb +29 -0
- data/db/migrate/20110106221214_create_meeting_contents.rb +29 -0
- data/db/migrate/20110106221946_create_meeting_content_versions.rb +20 -0
- data/db/migrate/20110108230721_create_meeting_participants.rb +30 -0
- data/db/migrate/20110224180804_add_lock_to_meeting_content.rb +24 -0
- data/db/migrate/20110819162852_create_initial_meeting_journals.rb +49 -0
- data/db/migrate/20111605171815_merge_meeting_content_versions_with_journals.rb +65 -0
- data/db/migrate/20130731151542_remove_meeting_role_id_from_meeting_participants.rb +20 -0
- data/lib/open_project/meeting.rb +16 -0
- data/lib/open_project/meeting/engine.rb +101 -0
- data/lib/open_project/meeting/hooks.rb +17 -0
- data/lib/open_project/meeting/patches/project_patch.rb +24 -0
- data/lib/open_project/meeting/version.rb +16 -0
- data/lib/openproject-meeting.rb +12 -0
- data/spec/controllers/meetings_controller_spec.rb +90 -0
- data/spec/factories/meeting_agenda_factory.rb +16 -0
- data/spec/factories/meeting_agenda_journal_factory.rb +18 -0
- data/spec/factories/meeting_factory.rb +18 -0
- data/spec/factories/meeting_minutes_factory.rb +16 -0
- data/spec/factories/meeting_minutes_journal_factory.rb +18 -0
- data/spec/factories/meeting_participant_factory.rb +17 -0
- data/spec/mailers/meeting_mailer_spec.rb +101 -0
- data/spec/models/meeting_agenda_journal_spec.rb +21 -0
- data/spec/models/meeting_agenda_spec.rb +52 -0
- data/spec/models/meeting_minutes_journal_spec.rb +21 -0
- data/spec/models/meeting_minutes_spec.rb +44 -0
- data/spec/models/meeting_spec.rb +168 -0
- data/spec/models/user_deletion_spec.rb +186 -0
- data/spec/spec_helper.rb +14 -0
- data/spec/support/plugin_spec_helper.rb +47 -0
- metadata +158 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NzIwZjYwNThkYmVkNjllYWYzZDViN2I2MGU3MDVhMTljNDY1MTMwMA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MjZhNzM5YzUwN2MwYTExZDgwNjFhMWYxMWFiZDIyMjNkYzBmMzYyZA==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZWNlY2VmODcwYWFjN2JlNzY5N2QxZGY1YjMxYmI1NDJkMjhmYWZkYmE2ZGFl
|
10
|
+
M2YxYjYxMjc1OGNlZjk1MjRlNTNhNDU4ZWU0YzRkY2UyMmQ1ODNmMWI5YzU3
|
11
|
+
MjI5YTA2NTU5NDUxOWY2OThlNzEwOTA5ZTQyZWM1YzkzZTQ1YjQ=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
NDY3MzRkZDYyMTFhYzVkMWRlOTAwOGRhNWJhOTBlZmViNDQ0OTBhZDQxOTFl
|
14
|
+
MGQ4NzI4MDI1Njg5MTBhYzM1NjJkOTI1NGYwODg3NWEyYjAzMzdmNTIxNWEz
|
15
|
+
ZjBkYjgzNTk5NTNjOWFmNWM0YTk5ZWNiMGYyMTUyZDM2YTU4MWE=
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## 3.0.0
|
4
|
+
|
5
|
+
* `#1554` Execute release
|
6
|
+
|
7
|
+
## 3.0.0.rc2
|
8
|
+
|
9
|
+
* `#1529` First public release
|
10
|
+
* `#1551` Fixed bug: Not possible to withdraw invitation
|
11
|
+
|
12
|
+
## 2013-07-04 Christian Ratz <c.ratz@finn.de>
|
13
|
+
|
14
|
+
* fix time zones bug
|
15
|
+
|
16
|
+
## 2013-06-27 Christian Ratz <c.ratz@finn.de>
|
17
|
+
|
18
|
+
* new pagination
|
19
|
+
* fix time zones bug
|
20
|
+
|
21
|
+
## 2013-06-21 Christian Ratz <c.ratz@finn.de>
|
22
|
+
|
23
|
+
* Use final plugin name schema
|
24
|
+
|
25
|
+
## 2013-06-14 Christian Ratz <c.ratz@finn.de>
|
26
|
+
|
27
|
+
* added dependency to OpenProject core >= 3.0.0beta1
|
28
|
+
|
29
|
+
## 2013024 Christian Ratz <c.ratz@finn.de>
|
30
|
+
|
31
|
+
* RC1 of the Rails 3 version
|
32
|
+
* This version is no longer compatible with the Rails 2 core
|
33
|
+
|
34
|
+
## 2013-03-22 Jens Ulferts <j.ulferts@finn.de>
|
35
|
+
|
36
|
+
* fixes routes
|
37
|
+
* removes unnecessary code
|
38
|
+
* shows only the users as possible participants who have the required
|
39
|
+
permissions
|
40
|
+
* adds missing html_safe
|
41
|
+
* fixes mailer i18n issue
|
42
|
+
|
43
|
+
## 2013-03-18 Hagen Schink <h.schink@finn.de>
|
44
|
+
|
45
|
+
* Swtiched to version 0.2.5
|
46
|
+
* Rails 3.2-ified plug-in
|
data/README.md
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
OpenProject Meeting Plugin
|
2
|
+
==========================
|
3
|
+
|
4
|
+
This plugin adds functions to support project meetings to
|
5
|
+
[OpenProject](https://www.openproject.org). Meetings
|
6
|
+
can be scheduled selecting invitees from the same project to take
|
7
|
+
part in the meeting. An agenda can be created and sent to the invitees.
|
8
|
+
After the meeting, attendants can be selected and minutes can be
|
9
|
+
created based on the agenda. Finally, the minutes can be sent to
|
10
|
+
all attendants and invitees.
|
11
|
+
|
12
|
+
A more detailed feature tour can be found [here](https://www.openproject.org/projects/openproject/wiki/Meetings).
|
13
|
+
|
14
|
+
Requirements
|
15
|
+
------------
|
16
|
+
|
17
|
+
The meetings plugin currently requires the [OpenProject Core](https://github.com/opf/openproject/) in
|
18
|
+
version 3.0.0pre9 or newer.
|
19
|
+
|
20
|
+
|
21
|
+
Installation
|
22
|
+
------------
|
23
|
+
|
24
|
+
Please follow the default [plugin installation instructions for
|
25
|
+
OpenProject](https://www.openproject.org/projects/openproject/wiki/Installation#222-Add-plugins),
|
26
|
+
adding the following line to the Gemfile.plugins:
|
27
|
+
|
28
|
+
`gem "openproject-meeting", :git => "https://github.com/finnlabs/openproject-meeting"`
|
29
|
+
|
30
|
+
Afterwards, run:
|
31
|
+
|
32
|
+
`bundle install`
|
33
|
+
|
34
|
+
This plugin contains migrations. To migrate the database, run:
|
35
|
+
|
36
|
+
`rake openproject_meeting:install:migrations`
|
37
|
+
|
38
|
+
`rake db:migrate`
|
39
|
+
|
40
|
+
Deinstallation
|
41
|
+
--------------
|
42
|
+
|
43
|
+
Remove the line
|
44
|
+
|
45
|
+
`gem "openproject-meeting", :git => "https://github.com/finnlabs/openproject-meeting"`
|
46
|
+
|
47
|
+
from the file `Gemfile.plugins` and run:
|
48
|
+
|
49
|
+
`bundle install`
|
50
|
+
|
51
|
+
Please not that this leaves plugin data in the database. Currently, we do not
|
52
|
+
support full uninstall of the plugin.
|
53
|
+
|
54
|
+
Bug Reporting
|
55
|
+
-------------
|
56
|
+
|
57
|
+
If you find any bugs, you can create a bug ticket at
|
58
|
+
|
59
|
+
https://www.openproject.org/projects/plugin-meetings
|
60
|
+
|
61
|
+
Development
|
62
|
+
-----------
|
63
|
+
|
64
|
+
To contribute, you can create pull request on the official repository at
|
65
|
+
|
66
|
+
`https://github.com/finnlabs/openproject-meeting`
|
67
|
+
|
68
|
+
Credits
|
69
|
+
-------
|
70
|
+
|
71
|
+
Special thanks go to
|
72
|
+
|
73
|
+
* Deutsche Telekom AG (opensource@telekom.de) for project sponsorhip
|
74
|
+
* Le Moign Vincent and his fabulous Minicons icons on [webalys.com](http://www.webalys.com/minicons/icons-free-pack.php)
|
75
|
+
|
76
|
+
License
|
77
|
+
-------
|
78
|
+
|
79
|
+
(c) 2011 - 2013 - Finn GmbH
|
80
|
+
|
81
|
+
This plugin is licensed under the GNU GPL v3. See doc/COPYRIGHT.rdoc and
|
82
|
+
doc/GPL.txt for details.
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,39 @@
|
|
1
|
+
.meetings div.meeting {padding-bottom: 1em;}
|
2
|
+
div.meeting_content {padding-bottom: 2em;}
|
3
|
+
div.meetings_by_date {padding: 1em 0 1em 2em;}
|
4
|
+
dl.meetings p, div#activity dl.meetings dd, div#activity dl.meetings dt {padding: 0;}
|
5
|
+
dl.meetings {margin-bottom: 2em;}
|
6
|
+
|
7
|
+
div.tabular > div { margin: 0;
|
8
|
+
padding: 5px 0 8px 0;
|
9
|
+
padding-left: 180px; /*width of left column containing the label elements*/
|
10
|
+
height: 1%;
|
11
|
+
clear:left;
|
12
|
+
}
|
13
|
+
|
14
|
+
#meeting_agenda_preview fieldset {margin-top: 1em; background: url(<%= asset_path 'draft.png' %>);}
|
15
|
+
#meeting_minutes_preview fieldset {margin-top: 1em; background: url(<%= asset_path 'draft.png' %>);}
|
16
|
+
|
17
|
+
dt.meeting {
|
18
|
+
background-image: url(<%= asset_path 'meeting/meeting.png' %>);
|
19
|
+
}
|
20
|
+
|
21
|
+
dt.meeting-agenda {
|
22
|
+
background-image: url(<%= asset_path 'meeting/agenda.png' %>);
|
23
|
+
}
|
24
|
+
|
25
|
+
dt.meeting-minutes {
|
26
|
+
background-image: url(<%= asset_path 'meeting/minutes.png' %>);
|
27
|
+
}
|
28
|
+
div#activity dl.meetings dt span {
|
29
|
+
padding-left: 15px;
|
30
|
+
}
|
31
|
+
|
32
|
+
div.flash.notice a.link_to_profile {
|
33
|
+
cursor:pointer;
|
34
|
+
color: #008BD0;
|
35
|
+
}
|
36
|
+
|
37
|
+
div.flash.notice a.link_to_profile:hover {
|
38
|
+
text-decoration: underline;
|
39
|
+
}
|
@@ -0,0 +1,33 @@
|
|
1
|
+
#-- copyright
|
2
|
+
# OpenProject is a project management system.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2012-2013 the OpenProject Team
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU General Public License version 3.
|
8
|
+
#
|
9
|
+
# See doc/COPYRIGHT.rdoc for more details.
|
10
|
+
#++
|
11
|
+
|
12
|
+
class MeetingAgendasController < MeetingContentsController
|
13
|
+
|
14
|
+
menu_item :meetings
|
15
|
+
|
16
|
+
def close
|
17
|
+
@meeting.close_agenda_and_copy_to_minutes!
|
18
|
+
|
19
|
+
redirect_back_or_default :controller => '/meetings', :action => 'show', :id => @meeting
|
20
|
+
end
|
21
|
+
|
22
|
+
def open
|
23
|
+
@content.unlock!
|
24
|
+
redirect_back_or_default :controller => '/meetings', :action => 'show', :id => @meeting
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def find_content
|
30
|
+
@content = @meeting.agenda || @meeting.build_agenda
|
31
|
+
@content_type = "meeting_agenda"
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
#-- copyright
|
2
|
+
# OpenProject is a project management system.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2012-2013 the OpenProject Team
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU General Public License version 3.
|
8
|
+
#
|
9
|
+
# See doc/COPYRIGHT.rdoc for more details.
|
10
|
+
#++
|
11
|
+
|
12
|
+
class MeetingContentsController < ApplicationController
|
13
|
+
|
14
|
+
include PaginationHelper
|
15
|
+
|
16
|
+
menu_item :meetings
|
17
|
+
|
18
|
+
helper :watchers
|
19
|
+
helper :wiki
|
20
|
+
helper :meetings
|
21
|
+
helper :meeting_contents
|
22
|
+
helper :watchers
|
23
|
+
helper :meetings
|
24
|
+
|
25
|
+
before_filter :find_meeting, :find_content
|
26
|
+
before_filter :authorize
|
27
|
+
|
28
|
+
def show
|
29
|
+
# Redirect links to the last version
|
30
|
+
(redirect_to :controller => '/meetings', :action => :show, :id => @meeting, :tab => @content_type.sub(/^meeting_/, '') and return) if params[:id].present? && @content.version == params[:id].to_i
|
31
|
+
|
32
|
+
@content = @content.journals.at params[:id].to_i unless params[:id].blank?
|
33
|
+
render 'meeting_contents/show'
|
34
|
+
end
|
35
|
+
|
36
|
+
def update
|
37
|
+
(render_403; return) unless @content.editable? # TODO: not tested!
|
38
|
+
@content.attributes = params[:"#{@content_type}"]
|
39
|
+
@content.author = User.current
|
40
|
+
if @content.save
|
41
|
+
flash[:notice] = l(:notice_successful_update)
|
42
|
+
redirect_back_or_default :controller => '/meetings', :action => 'show', :id => @meeting
|
43
|
+
else
|
44
|
+
end
|
45
|
+
rescue ActiveRecord::StaleObjectError
|
46
|
+
# Optimistic locking exception
|
47
|
+
flash.now[:error] = l(:notice_locking_conflict)
|
48
|
+
params[:tab] ||= "minutes" if @meeting.agenda.present? && @meeting.agenda.locked?
|
49
|
+
render 'meetings/show'
|
50
|
+
end
|
51
|
+
|
52
|
+
def history
|
53
|
+
# don't load text
|
54
|
+
@content_versions = @content.journals.select("id, user_id, notes, created_at, version")
|
55
|
+
.order('version DESC')
|
56
|
+
.page(page_param)
|
57
|
+
.per_page(per_page_param)
|
58
|
+
|
59
|
+
render 'meeting_contents/history', :layout => !request.xhr?
|
60
|
+
end
|
61
|
+
|
62
|
+
def diff
|
63
|
+
@diff = @content.diff(params[:version_to], params[:version_from])
|
64
|
+
render 'meeting_contents/diff'
|
65
|
+
rescue ActiveRecord::RecordNotFound
|
66
|
+
render_404
|
67
|
+
end
|
68
|
+
|
69
|
+
def notify
|
70
|
+
unless @content.new_record?
|
71
|
+
MeetingMailer.content_for_review(@content, @content_type).deliver
|
72
|
+
flash[:notice] = l(:notice_successful_notification)
|
73
|
+
end
|
74
|
+
redirect_back_or_default :controller => '/meetings', :action => 'show', :id => @meeting
|
75
|
+
end
|
76
|
+
|
77
|
+
def preview
|
78
|
+
(render_403; return) unless @content.editable?
|
79
|
+
@text = params[:text]
|
80
|
+
render :partial => 'common/preview'
|
81
|
+
end
|
82
|
+
|
83
|
+
def default_breadcrumb
|
84
|
+
MeetingsController.new.send(:default_breadcrumb)
|
85
|
+
end
|
86
|
+
private
|
87
|
+
|
88
|
+
def find_meeting
|
89
|
+
@meeting = Meeting.find(params[:meeting_id], :include => [:project, :author, :participants, :agenda, :minutes])
|
90
|
+
@project = @meeting.project
|
91
|
+
@author = User.current
|
92
|
+
rescue ActiveRecord::RecordNotFound
|
93
|
+
render_404
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#-- copyright
|
2
|
+
# OpenProject is a project management system.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2012-2013 the OpenProject Team
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU General Public License version 3.
|
8
|
+
#
|
9
|
+
# See doc/COPYRIGHT.rdoc for more details.
|
10
|
+
#++
|
11
|
+
|
12
|
+
class MeetingMinutesController < MeetingContentsController
|
13
|
+
|
14
|
+
menu_item :meetings
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def find_content
|
19
|
+
@content = @meeting.minutes || @meeting.build_minutes
|
20
|
+
@content_type = "meeting_minutes"
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
#-- copyright
|
2
|
+
# OpenProject is a project management system.
|
3
|
+
#
|
4
|
+
# Copyright (C) 2012-2013 the OpenProject Team
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or
|
7
|
+
# modify it under the terms of the GNU General Public License version 3.
|
8
|
+
#
|
9
|
+
# See doc/COPYRIGHT.rdoc for more details.
|
10
|
+
#++
|
11
|
+
|
12
|
+
class MeetingsController < ApplicationController
|
13
|
+
|
14
|
+
around_filter :set_time_zone
|
15
|
+
before_filter :find_project, :only => [:index, :new, :create]
|
16
|
+
before_filter :find_meeting, :except => [:index, :new, :create]
|
17
|
+
before_filter :convert_params, :only => [:create, :update]
|
18
|
+
before_filter :authorize
|
19
|
+
|
20
|
+
helper :journals
|
21
|
+
helper :watchers
|
22
|
+
helper :meeting_contents
|
23
|
+
include WatchersHelper
|
24
|
+
include PaginationHelper
|
25
|
+
|
26
|
+
menu_item :new_meeting, :only => [:new, :create]
|
27
|
+
|
28
|
+
def index
|
29
|
+
scope = @project.meetings
|
30
|
+
|
31
|
+
# from params => today's page otherwise => first page as fallback
|
32
|
+
tomorrows_meetings_count = scope.from_tomorrow.count
|
33
|
+
@page_of_today = 1 + tomorrows_meetings_count / per_page_param
|
34
|
+
|
35
|
+
page = params['page'] ?
|
36
|
+
page_param :
|
37
|
+
@page_of_today
|
38
|
+
|
39
|
+
@meetings = scope.with_users_by_date
|
40
|
+
.page(page)
|
41
|
+
.per_page(per_page_param)
|
42
|
+
|
43
|
+
@meetings_by_start_year_month_date = Meeting.group_by_time(@meetings)
|
44
|
+
end
|
45
|
+
|
46
|
+
def show
|
47
|
+
params[:tab] ||= "minutes" if @meeting.agenda.present? && @meeting.agenda.locked?
|
48
|
+
end
|
49
|
+
|
50
|
+
def create
|
51
|
+
@meeting.participants.clear # Start with a clean set of participants
|
52
|
+
@meeting.participants_attributes = params[:meeting].delete(:participants_attributes)
|
53
|
+
@meeting.attributes = params[:meeting]
|
54
|
+
if params[:copied_from_meeting_id].present? && params[:copied_meeting_agenda_text].present?
|
55
|
+
@meeting.agenda = MeetingAgenda.new(
|
56
|
+
:text => params[:copied_meeting_agenda_text],
|
57
|
+
:comment => "Copied from Meeting ##{params[:copied_from_meeting_id]}")
|
58
|
+
@meeting.agenda.author = User.current
|
59
|
+
end
|
60
|
+
if @meeting.save
|
61
|
+
text = l(:notice_successful_create)
|
62
|
+
if User.current.time_zone.nil?
|
63
|
+
link = l(:notice_timezone_missing, :zone => Time.zone)
|
64
|
+
text += " #{view_context.link_to(link, {:controller => '/my', :action => :account},:class => "link_to_profile")}"
|
65
|
+
end
|
66
|
+
flash[:notice] = text.html_safe
|
67
|
+
|
68
|
+
redirect_to :action => 'show', :id => @meeting
|
69
|
+
else
|
70
|
+
render :action => 'new', :project_id => @project
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def new
|
75
|
+
end
|
76
|
+
|
77
|
+
def copy
|
78
|
+
params[:copied_from_meeting_id] = @meeting.id
|
79
|
+
params[:copied_meeting_agenda_text] = @meeting.agenda.text if @meeting.agenda.present?
|
80
|
+
@meeting = @meeting.copy(:author => User.current)
|
81
|
+
render :action => 'new', :project_id => @project
|
82
|
+
end
|
83
|
+
|
84
|
+
def destroy
|
85
|
+
@meeting.destroy
|
86
|
+
flash[:notice] = l(:notice_successful_delete)
|
87
|
+
redirect_to :action => 'index', :project_id => @project
|
88
|
+
end
|
89
|
+
|
90
|
+
def edit
|
91
|
+
end
|
92
|
+
|
93
|
+
def update
|
94
|
+
@meeting.participants_attributes = params[:meeting].delete(:participants_attributes)
|
95
|
+
@meeting.attributes = params[:meeting]
|
96
|
+
if @meeting.save
|
97
|
+
flash[:notice] = l(:notice_successful_update)
|
98
|
+
redirect_to :action => 'show', :id => @meeting
|
99
|
+
else
|
100
|
+
render :action => 'edit'
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
private
|
105
|
+
|
106
|
+
def set_time_zone
|
107
|
+
old_time_zone = Time.zone
|
108
|
+
zone = User.current.time_zone
|
109
|
+
if zone.nil?
|
110
|
+
localzone = Time.now.utc_offset
|
111
|
+
localzone-= 3600 if Time.now.dst?
|
112
|
+
zone = ::ActiveSupport::TimeZone[localzone]
|
113
|
+
end
|
114
|
+
Time.zone = zone
|
115
|
+
yield
|
116
|
+
ensure
|
117
|
+
Time.zone = old_time_zone
|
118
|
+
end
|
119
|
+
|
120
|
+
def find_project
|
121
|
+
@project = Project.find(params[:project_id])
|
122
|
+
@meeting = Meeting.new
|
123
|
+
@meeting.project = @project
|
124
|
+
@meeting.author = User.current
|
125
|
+
end
|
126
|
+
|
127
|
+
def find_meeting
|
128
|
+
@meeting = Meeting.find(params[:id], :include => [:project, :author, {:participants => :user}, :agenda, :minutes])
|
129
|
+
@project = @meeting.project
|
130
|
+
rescue ActiveRecord::RecordNotFound
|
131
|
+
render_404
|
132
|
+
end
|
133
|
+
|
134
|
+
def convert_params
|
135
|
+
start_date = params[:meeting].delete(:start_date)
|
136
|
+
start_time_4i = params[:meeting].delete(:"start_time(4i)")
|
137
|
+
start_time_5i = params[:meeting].delete(:"start_time(5i)")
|
138
|
+
begin
|
139
|
+
timestring = "#{start_date} #{start_time_4i}:#{start_time_5i}"
|
140
|
+
time = Time.zone.parse(timestring)
|
141
|
+
params[:meeting][:start_time] = time
|
142
|
+
rescue ArgumentError
|
143
|
+
params[:meeting][:start_time] = nil
|
144
|
+
end
|
145
|
+
params[:meeting][:duration] = params[:meeting][:duration].to_hours
|
146
|
+
# Force defaults on participants
|
147
|
+
params[:meeting][:participants_attributes] ||= {}
|
148
|
+
params[:meeting][:participants_attributes].each {|p| p.reverse_merge! :attended => false, :invited => false}
|
149
|
+
end
|
150
|
+
end
|