# This patch file was generated by NetBeans IDE # Following Index: paths are relative to: /Users/Florian/Dev/RubyProjects/redmine-svn # This patch can be applied using context Tools: Patch action on respective folder. # It uses platform neutral UTF-8 encoding and \n newlines. # Above lines and this line are ignored by the patching process. Index: app/controllers/application.rb --- app/controllers/application.rb Base (BASE) +++ app/controllers/application.rb Locally Modified (Based On LOCAL) @@ -22,6 +22,8 @@ include Redmine::MenuManager::MenuController helper Redmine::MenuManager::MenuHelper + require 'icalendar' + REDMINE_SUPPORTED_SCM.each do |scm| require_dependency "repository/#{scm.underscore}" end @@ -155,6 +157,20 @@ render :template => "common/feed.atom.rxml", :layout => false, :content_type => 'application/atom+xml' end + def render_ics(items, options={}) + cal = Icalendar::Calendar.new + items.each { |i| + event = Icalendar::Event.new + event.dtstart = i.start_date + event.dtend = i.due_date + event.summary = i.subject + event.description = i.description + cal.add_event(event) + } + @cal_string = cal.to_ical + render :template => "common/calendar.ics.erb", :layout => false , :content_type => Mime::ICS + end + def self.accept_key_auth(*actions) actions = actions.flatten.map(&:to_s) write_inheritable_attribute('accept_key_auth_actions', actions) Index: app/controllers/projects_controller.rb --- app/controllers/projects_controller.rb Base (BASE) +++ app/controllers/projects_controller.rb Locally Modified (Based On LOCAL) @@ -336,6 +336,9 @@ @calendar = Redmine::Helpers::Calendar.new(Date.civil(@year, @month, 1), current_language, :month) @with_subprojects = params[:with_subprojects].nil? ? Setting.display_subprojects_issues? : (params[:with_subprojects] == '1') events = [] + if (request.format == Mime::ICS) + @calendar.startdt = @project.created_on.to_s(:db) + end @project.issues_with_subprojects(@with_subprojects) do events += Issue.find(:all, :include => [:tracker, :status, :assigned_to, :priority, :project], @@ -346,8 +349,11 @@ end @calendar.events = events - render :layout => false if request.xhr? + respond_to do |format| + format.html { render :layout => false if request.xhr? } + format.ics { render_ics(events) } end + end def gantt @trackers = @project.rolled_up_trackers Index: app/views/common/calendar.ics.erb --- app/views/common/calendar.ics.erb Locally New +++ app/views/common/calendar.ics.erb Locally New @@ -0,0 +1 @@ +<%= @cal_string %> \ No newline at end of file Index: app/views/projects/calendar.rhtml MIME: application/octet-stream; encoding: Base64; length: 2690 PGgyPjwlPSAiI3ttb250aF9uYW1lKEBtb250aCl9ICN7QHllYXJ9IiAlPjwv aDI+Cgo8dGFibGUgd2lkdGg9IjEwMCUiPgo8dHI+PHRkIGFsaWduPSJsZWZ0 Ij4KICAgIDwlPSBsaW5rX3RvX3JlbW90ZSAoJyYjMTcxOyAnICsgKEBtb250 aD09MSA/ICIje21vbnRoX25hbWUoMTIpfSAje0B5ZWFyLTF9IiA6ICIje21v bnRoX25hbWUoQG1vbnRoLTEpfSIpKSwgCiAgICAgICAgICAgICAgICAgICAg ICAgIHs6dXBkYXRlID0+ICJjb250ZW50IiwgOnVybCA9PiB7IDp5ZWFyID0+ IChAbW9udGg9PTEgPyBAeWVhci0xIDogQHllYXIpLCA6bW9udGggPT4oQG1v bnRoPT0xID8gMTIgOiBAbW9udGgtMSksIDp0cmFja2VyX2lkcyA9PiBAc2Vs ZWN0ZWRfdHJhY2tlcl9pZHMsIDp3aXRoX3N1YnByb2plY3RzID0+IHBhcmFt c1s6d2l0aF9zdWJwcm9qZWN0c10gfX0sCiAgICAgICAgICAgICAgICAgICAg ICAgIHs6aHJlZiA9PiB1cmxfZm9yKDphY3Rpb24gPT4gJ2NhbGVuZGFyJywg OnllYXIgPT4gKEBtb250aD09MSA/IEB5ZWFyLTEgOiBAeWVhciksIDptb250 aCA9PihAbW9udGg9PTEgPyAxMiA6IEBtb250aC0xKSwgOnRyYWNrZXJfaWRz ID0+IEBzZWxlY3RlZF90cmFja2VyX2lkcywgOndpdGhfc3VicHJvamVjdHMg PT4gcGFyYW1zWzp3aXRoX3N1YnByb2plY3RzXSl9CiAgICAgICAgICAgICAg ICAgICAgICAgICU+CjwvdGQ+PHRkIGFsaWduPSJyaWdodCI+CiAgICA8JT0g bGlua190b19yZW1vdGUgKChAbW9udGg9PTEyID8gIiN7bW9udGhfbmFtZSgx KX0gI3tAeWVhcisxfSIgOiAiI3ttb250aF9uYW1lKEBtb250aCsxKX0iKSAr ICcgJiMxODc7JyksIAogICAgICAgICAgICAgICAgICAgICAgICB7OnVwZGF0 ZSA9PiAiY29udGVudCIsIDp1cmwgPT4geyA6eWVhciA9PiAoQG1vbnRoPT0x MiA/IEB5ZWFyKzEgOiBAeWVhciksIDptb250aCA9PihAbW9udGg9PTEyID8g MSA6IEBtb250aCsxKSwgOnRyYWNrZXJfaWRzID0+IEBzZWxlY3RlZF90cmFj a2VyX2lkcywgOndpdGhfc3VicHJvamVjdHMgPT4gcGFyYW1zWzp3aXRoX3N1 YnByb2plY3RzXSB9fSwKICAgICAgICAgICAgICAgICAgICAgICAgezpocmVm ID0+IHVybF9mb3IoOmFjdGlvbiA9PiAnY2FsZW5kYXInLCA6eWVhciA9PiAo QG1vbnRoPT0xMiA/IEB5ZWFyKzEgOiBAeWVhciksIDptb250aCA9PihAbW9u dGg9PTEyID8gMSA6IEBtb250aCsxKSwgOnRyYWNrZXJfaWRzID0+IEBzZWxl Y3RlZF90cmFja2VyX2lkcywgOndpdGhfc3VicHJvamVjdHMgPT4gcGFyYW1z Wzp3aXRoX3N1YnByb2plY3RzXSl9CiAgICAgICAgICAgICAgICAgICAgICAg ICU+CjwvdGQ+PC90cj4KPC90YWJsZT4KCjwlPSByZW5kZXIgOnBhcnRpYWwg PT4gJ2NvbW1vbi9jYWxlbmRhcicsIDpsb2NhbHMgPT4gezpjYWxlbmRhciA9 PiBAY2FsZW5kYXJ9ICU+Cgo8JT0gaW1hZ2VfdGFnICdhcnJvd19mcm9tLnBu ZycgJT4mbmJzcDsmbmJzcDs8JT0gbCg6dGV4dF90aXBfdGFza19iZWdpbl9k YXkpICU+PGJyIC8+CjwlPSBpbWFnZV90YWcgJ2Fycm93X3RvLnBuZycgJT4m bmJzcDsmbmJzcDs8JT0gbCg6dGV4dF90aXBfdGFza19lbmRfZGF5KSAlPjxi ciAvPgo8JT0gaW1hZ2VfdGFnICdhcnJvd19idy5wbmcnICU+Jm5ic3A7Jm5i c3A7PCU9IGwoOnRleHRfdGlwX3Rhc2tfYmVnaW5fZW5kX2RheSkgJT48YnIg Lz4KCjxwIGNsYXNzPSJvdGhlci1mb3JtYXRzIj4KICAgIDwlPSBsKDpsYWJl bF9leHBvcnRfdG8pICU+CiAgICA8c3Bhbj48JT0gbGlua190byAnaUNhbCcs IHsgOmZvcm1hdCA9PiA6aWNzLCA6a2V5ID0+IFVzZXIuY3VycmVudC5yc3Nf a2V5IH0sIDpjbGFzcyA9PiAnZmVlZCcgJT48L3NwYW4+CjwvcD4KCjwlIGNv bnRlbnRfZm9yIDpzaWRlYmFyIGRvICU+CiAgICA8aDM+PCU9IGwoOmxhYmVs X2NhbGVuZGFyKSAlPjwvaDM+CiAgICAKICAgIDwlIGZvcm1fdGFnKHt9LCA6 bWV0aG9kID0+IDpnZXQpIGRvICU+CiAgICA8cD48JT0gc2VsZWN0X21vbnRo KEBtb250aCwgOnByZWZpeCA9PiAibW9udGgiLCA6ZGlzY2FyZF90eXBlID0+ IHRydWUpICU+CiAgICA8JT0gc2VsZWN0X3llYXIoQHllYXIsIDpwcmVmaXgg PT4gInllYXIiLCA6ZGlzY2FyZF90eXBlID0+IHRydWUpICU+PC9wPgogICAg CiAgICA8JSBAdHJhY2tlcnMuZWFjaCBkbyB8dHJhY2tlcnwgJT4KICAgICAg PGxhYmVsPjwlPSBjaGVja19ib3hfdGFnICJ0cmFja2VyX2lkc1tdIiwgdHJh Y2tlci5pZCwgKEBzZWxlY3RlZF90cmFja2VyX2lkcy5pbmNsdWRlPyB0cmFj a2VyLmlkLnRvX3MpICU+IDwlPSB0cmFja2VyLm5hbWUgJT48L2xhYmVsPjxi ciAvPgogICAgPCUgZW5kICU+CiAgICA8JSBpZiBAcHJvamVjdC5hY3RpdmVf Y2hpbGRyZW4uYW55PyAlPgogICAgPGJyIC8+PGxhYmVsPjwlPSBjaGVja19i b3hfdGFnICd3aXRoX3N1YnByb2plY3RzJywgMSwgQHdpdGhfc3VicHJvamVj dHMgJT4gPCU9bCg6bGFiZWxfc3VicHJvamVjdF9wbHVyYWwpJT48L2xhYmVs PgogICAgPCU9IGhpZGRlbl9maWVsZF90YWcgJ3dpdGhfc3VicHJvamVjdHMn LCAwICU+CiAgICA8JSBlbmQgJT4KICAgIDxwPjwlPSBzdWJtaXRfdGFnIGwo OmJ1dHRvbl9hcHBseSksIDpjbGFzcyA9PiAnYnV0dG9uLXNtYWxsJywgOm5h bWUgPT4gbmlsICU+PC9wPgogICAgPCUgZW5kICU+CjwlIGVuZCAlPgoKPCUg aHRtbF90aXRsZShsKDpsYWJlbF9jYWxlbmRhcikpIC0lPgo= Index: lib/redmine/helpers/calendar.rb --- lib/redmine/helpers/calendar.rb Base (BASE) +++ lib/redmine/helpers/calendar.rb Locally Modified (Based On LOCAL) @@ -45,6 +45,10 @@ end end + def startdt=(dt) + @startdt = dt + end + # Sets calendar events def events=(events) @events = events