From: Lukasz Rekucki Date: Tue, 18 Aug 2009 14:32:47 +0000 (+0200) Subject: 1. Wyświetlanie i edycja pola "source_file" w widoku ticketu. X-Git-Url: https://git.mdrn.pl/redakcja_redmine.git/commitdiff_plain/378fe7c80dbc369bceb24e57e2cd81d3bd690ee9 1. Wyświetlanie i edycja pola "source_file" w widoku ticketu. 2. Pobieranie przez HTTP listy zagadnień związych z daną publikacją --- 378fe7c80dbc369bceb24e57e2cd81d3bd690ee9 diff --git a/README.rdoc b/README.rdoc new file mode 100644 index 0000000..2bcee99 --- /dev/null +++ b/README.rdoc @@ -0,0 +1,3 @@ += publications + +Description goes here diff --git a/app/controllers/publications_controller.rb b/app/controllers/publications_controller.rb new file mode 100644 index 0000000..c7d16e3 --- /dev/null +++ b/app/controllers/publications_controller.rb @@ -0,0 +1,30 @@ + +class PublicationsController < ApplicationController + unloadable + + @@source_file_field_id = 1 + + def issues + logger.info "Searching for issues with document name = " + params[:pub] + "." + joins = "JOIN issue_publications ON (issues.id = issue_publications.issue_id) JOIN publications ON (issue_publications.publication_id = publications.id)" + + conditions = ['publications.source_file = ? ', params[:pub] ] + @issues = Issue.all(:joins => joins, :conditions => conditions) + respond_to do |format| + format.html + format.xml do + render :xml => @issues + end + + format.json do + headers['Content-Type'] = 'application/json' + render :json => @issues + end + end + end + + def redirect_to_platform + render :text => "" + end + +end diff --git a/app/helpers/publications_helper.rb b/app/helpers/publications_helper.rb new file mode 100644 index 0000000..50f110e --- /dev/null +++ b/app/helpers/publications_helper.rb @@ -0,0 +1,2 @@ +module PublicationsHelper +end diff --git a/app/models/issue_publication.rb b/app/models/issue_publication.rb new file mode 100644 index 0000000..ef7bf92 --- /dev/null +++ b/app/models/issue_publication.rb @@ -0,0 +1,4 @@ +class IssuePublication < ActiveRecord::Base + belongs_to :publication + belongs_to :issue +end diff --git a/app/models/publication.rb b/app/models/publication.rb new file mode 100644 index 0000000..b0e567d --- /dev/null +++ b/app/models/publication.rb @@ -0,0 +1,3 @@ +class Publication < ActiveRecord::Base + has_many :issues, :through => :issuepublications +end diff --git a/app/views/issues/_issue_form_pub.html.erb b/app/views/issues/_issue_form_pub.html.erb new file mode 100644 index 0000000..638c0f6 --- /dev/null +++ b/app/views/issues/_issue_form_pub.html.erb @@ -0,0 +1,6 @@ +
+

+' /> +

diff --git a/app/views/publications/index.html.erb b/app/views/publications/index.html.erb new file mode 100644 index 0000000..423d724 --- /dev/null +++ b/app/views/publications/index.html.erb @@ -0,0 +1,4 @@ +

Microrest#related-issues

+<%= @issues %> + + diff --git a/db/migrate/001_create_publications.rb b/db/migrate/001_create_publications.rb new file mode 100644 index 0000000..f9d93ef --- /dev/null +++ b/db/migrate/001_create_publications.rb @@ -0,0 +1,11 @@ +class CreatePublications < ActiveRecord::Migration + def self.up + create_table :publications do |t| + t.column :source_file, :string, :null => false + end + end + + def self.down + drop_table :publications + end +end diff --git a/db/migrate/002_create_issue_publications.rb b/db/migrate/002_create_issue_publications.rb new file mode 100644 index 0000000..e972442 --- /dev/null +++ b/db/migrate/002_create_issue_publications.rb @@ -0,0 +1,12 @@ +class CreateIssuePublications < ActiveRecord::Migration + def self.up + create_table :issue_publications do |t| + t.column :publication_id, :integer, :null => false + t.column :issue_id, :intrger, :null => false + end + end + + def self.down + drop_table :issue_publications + end +end diff --git a/init.rb b/init.rb new file mode 100644 index 0000000..1df1e93 --- /dev/null +++ b/init.rb @@ -0,0 +1,27 @@ +require 'redmine' + +# Patches to the Redmine core. +require 'dispatcher' + +Dispatcher.to_prepare :redmine_kanban do + require_dependency 'issue' + # Guards against including the module multiple time (like in tests) + # and registering multiple callbacks + unless Issue.included_modules.include? RedminePublications::IssuePatch + Issue.send(:include, RedminePublications::IssuePatch) + end +end + +require_dependency 'issue_publication_hook' + +Redmine::Plugin.register :redmine_publicatons do + name 'Publications managment plugin' + author 'Łukasz Rekucki' + description 'This plugn helps manage issues related to a publication.' + version '0.0.3' + + + requires_redmine :version_or_higher => '0.8.0' + +end + diff --git a/lang/en.yml b/lang/en.yml new file mode 100644 index 0000000..e338591 --- /dev/null +++ b/lang/en.yml @@ -0,0 +1,2 @@ +# English strings go here +my_label: "My label" diff --git a/lib/issue_publication_hook.rb b/lib/issue_publication_hook.rb new file mode 100644 index 0000000..4cfc3ba --- /dev/null +++ b/lib/issue_publication_hook.rb @@ -0,0 +1,16 @@ +# Provides a link to the document on the platform +class IssuesPublicationHook < Redmine::Hook::ViewListener + def view_issues_show_details_bottom(context) + result = "Source File(s):" + names = context[:issue].source_files.map {|name| "" + name + ""} + result << names.join(', ') + result + "" + end + + def controller_issues_edit_before_save(context) + pub_field = context[:params][:issue_source_files] + context[:issue].source_files = pub_field + end + + render_on :view_issues_form_details_bottom, :partial => 'issue_form_pub' +end diff --git a/lib/redmine_publications/.issue_patch.rb.swp b/lib/redmine_publications/.issue_patch.rb.swp new file mode 100644 index 0000000..56af602 Binary files /dev/null and b/lib/redmine_publications/.issue_patch.rb.swp differ diff --git a/lib/redmine_publications/issue_patch.rb b/lib/redmine_publications/issue_patch.rb new file mode 100644 index 0000000..dbcbfa8 --- /dev/null +++ b/lib/redmine_publications/issue_patch.rb @@ -0,0 +1,70 @@ +module RedminePublications + # Patches Redmine's Issues dynamically. Adds a +after_save+ filter. + + module IssuePatch + def self.included(base) # :nodoc: + base.extend(ClassMethods) + + base.send(:include, InstanceMethods) + + # Same as typing in the class + base.class_eval do + unloadable # Send unloadable so it will not be unloaded in development + + after_save :update_relations + # after_destroy :check_relations + + # Add visible to Redmine 0.8.x + unless respond_to?(:visible) + named_scope :visible, lambda {|*args| { :include => :project, + :conditions => Project.allowed_to_condition(args.first || User.current, :view_issues) } } + end + end + + end + + module ClassMethods + end + + module InstanceMethods + def source_files + if not @source_files + @source_files = self.lookup_source_files.map { |pub| pub.source_file } + end + @source_files + end + + def source_files=(value) + @source_files = value + end + + def lookup_source_files + Publication.all( + :joins => + "JOIN issue_publications ON (issue_publications.publication_id = publications.id)", + :conditions => + [" issue_publications.issue_id = ? ", self.id] ) + end + + def update_relations + self.reload + current_assocs = self.lookup_source_files + new_assocs_names = self.source_files.split(' ') + + # delete unused relations + deleted = current_assocs.select { |v| not (new_assocs_names.include?(v.source_file)) } + deleted.each { |pub| IssuePublication.delete_all( + :contitions => ["issue_publications.issue_id = ? AND issue_publicatons.publication_id = ?", + self.id, pub.id]) } + + new_assocs_names.each do |name| + pub = Publication.find_or_create_by_source_file(name) + IssuePublication.find_or_create_by_publication_id_and_issue_id(pub.id, self.id) + end + + return true + end + + end + end +end diff --git a/routes.rb b/routes.rb new file mode 100644 index 0000000..bdca2b8 --- /dev/null +++ b/routes.rb @@ -0,0 +1,10 @@ +connect 'publications/:pub', + :controller => 'publications', + :action => 'redirect_to_platform' + +connect 'publications/:pub/:action', + :controller => 'publications', + :format => 'html' + +connect 'publications/:pub/:action.:format', + :controller => 'publications' diff --git a/test/fixtures/publications.yml b/test/fixtures/publications.yml new file mode 100644 index 0000000..9d7d113 --- /dev/null +++ b/test/fixtures/publications.yml @@ -0,0 +1,7 @@ +# Read about fixtures at http://ar.rubyonrails.org/classes/Fixtures.html +one: + id: 1 + source_file: One +two: + id: 2 + source_file: Two diff --git a/test/functional/publications_controller_test.rb b/test/functional/publications_controller_test.rb new file mode 100644 index 0000000..62b35f6 --- /dev/null +++ b/test/functional/publications_controller_test.rb @@ -0,0 +1,8 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class MicrorestControllerTest < ActionController::TestCase + # Replace this with your real tests. + def test_truth + assert true + end +end diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000..bd1ed0c --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,5 @@ +# Load the normal Rails helper +require File.expand_path(File.dirname(__FILE__) + '/../../../../test/test_helper') + +# Ensure that we are using the temporary fixture path +Engines::Testing.set_fixture_path diff --git a/test/unit/publication_test.rb b/test/unit/publication_test.rb new file mode 100644 index 0000000..ccf8aa4 --- /dev/null +++ b/test/unit/publication_test.rb @@ -0,0 +1,10 @@ +require File.dirname(__FILE__) + '/../test_helper' + +class PublicationTest < Test::Unit::TestCase + fixtures :publications + + # Replace this with your real tests. + def test_truth + assert true + end +end