Commit 8202dfdc5d9b2c061813a8f0b7fe384dcbbbd842
Exists in
theme-brasil-digital-from-staging
and in
9 other branches
Merge branch 'virtuoso_integration' of gitlab.com:participa/noosfero into virtuoso_integration
Conflicts: plugins/virtuoso/lib/virtuoso_plugin.rb plugins/virtuoso/public/style.css plugins/virtuoso/views/virtuoso_plugin_admin/index.html.erb
Showing
12 changed files
with
185 additions
and
25 deletions
Show diff stats
plugins/virtuoso/controllers/virtuoso_plugin_admin_controller.rb
... | ... | @@ -18,12 +18,12 @@ class VirtuosoPluginAdminController < AdminController |
18 | 18 | end |
19 | 19 | |
20 | 20 | def force_harvest |
21 | - VirtuosoPlugin::DspaceHarvest.harverst_all(environment, params[:from_start]) | |
21 | + VirtuosoPlugin::DspaceHarvest.harvest_all(environment, params[:from_start]) | |
22 | 22 | session[:notice] = _('Harvest started') |
23 | 23 | redirect_to :action => :index |
24 | 24 | end |
25 | 25 | |
26 | - def triple_management | |
26 | + def triples_management | |
27 | 27 | triples_management = VirtuosoPlugin::TriplesManagement.new(environment) |
28 | 28 | @triples = [] |
29 | 29 | if request.post? |
... | ... | @@ -48,4 +48,36 @@ class VirtuosoPluginAdminController < AdminController |
48 | 48 | redirect_to :action => :triple_management |
49 | 49 | end |
50 | 50 | |
51 | + def add_triple | |
52 | + if request.post? | |
53 | + | |
54 | + triple = VirtuosoPlugin::Triple.new | |
55 | + triple.graph = params[:triple][:graph] | |
56 | + triple.subject = params[:triple][:subject] | |
57 | + triple.predicate = params[:triple][:predicate] | |
58 | + triple.object = params[:triple][:object] | |
59 | + | |
60 | + triples_management = VirtuosoPlugin::TriplesManagement.new(environment) | |
61 | + triples_management.add_triple(triple) | |
62 | + | |
63 | + @triples = [] | |
64 | + | |
65 | + session[:notice] = _('Triple succesfully added.') | |
66 | + render :action => :triple_management | |
67 | + end | |
68 | + end | |
69 | + | |
70 | + def remove_triple | |
71 | + triple = VirtuosoPlugin::Triple.new | |
72 | + triple.graph = params[:triple][:graph] | |
73 | + triple.subject = params[:triple][:subject] | |
74 | + triple.predicate = params[:triple][:predicate] | |
75 | + triple.object = params[:triple][:object] | |
76 | + | |
77 | + triples_management = VirtuosoPlugin::TriplesManagement.new(environment) | |
78 | + triples_management.remove_triple(triple) | |
79 | + | |
80 | + render json: { :ok => true, :message => _('Triple succesfully removed.') } | |
81 | + end | |
82 | + | |
51 | 83 | end | ... | ... |
plugins/virtuoso/lib/virtuoso_plugin.rb
... | ... | @@ -19,11 +19,21 @@ class VirtuosoPlugin < Noosfero::Plugin |
19 | 19 | end |
20 | 20 | |
21 | 21 | def virtuoso_client |
22 | - @virtuoso_client ||= RDF::Virtuoso::Repository.new("#{settings.virtuoso_uri}/sparql", :update_uri => "#{settings.virtuoso_uri}/sparql-auth", :username => settings.virtuoso_username, :password => settings.virtuoso_password, :auth_method => 'digest', :timeout => 30) | |
22 | + @virtuoso_client ||= virtuoso_client_builder(settings.virtuoso_uri, settings.virtuoso_username, settings.virtuoso_password) | |
23 | + end | |
24 | + | |
25 | + def virtuoso_readonly_client | |
26 | + @virtuoso_readonly_client ||= virtuoso_client_builder(settings.virtuoso_uri, settings.virtuoso_readonly_username, settings.virtuoso_readonly_password) | |
23 | 27 | end |
24 | 28 | |
25 | 29 | def stylesheet? |
26 | 30 | true |
27 | 31 | end |
28 | 32 | |
33 | + protected | |
34 | + | |
35 | + def virtuoso_client_builder(uri, username, password) | |
36 | + RDF::Virtuoso::Repository.new("#{uri}/sparql", :update_uri => "#{uri}/sparql-auth", :username => username, :password => password, :auth_method => 'digest', :timeout => 30) | |
37 | + end | |
38 | + | |
29 | 39 | end | ... | ... |
... | ... | @@ -0,0 +1,16 @@ |
1 | +class VirtuosoPlugin::Triple | |
2 | + | |
3 | + attr_accessor :graph, :subject, :predicate, :object | |
4 | + | |
5 | + def object=(value) | |
6 | + @object = format_triple_term(value) | |
7 | + end | |
8 | + | |
9 | + protected | |
10 | + | |
11 | + def format_triple_term(term) | |
12 | + term =~ /^(http|https):\/\// ? "<#{term}>" : "'#{term}'" | |
13 | + end | |
14 | + | |
15 | +end | |
16 | + | ... | ... |
plugins/virtuoso/lib/virtuoso_plugin/triples_management.rb
... | ... | @@ -29,6 +29,16 @@ class VirtuosoPlugin::TriplesManagement |
29 | 29 | plugin.virtuoso_client.query(query) |
30 | 30 | end |
31 | 31 | |
32 | + def add_triple(triple) | |
33 | + query = "WITH <#{triple.graph}> INSERT { <#{triple.subject}> <#{triple.predicate}> #{triple.object} }" | |
34 | + plugin.virtuoso_client.query(query) | |
35 | + end | |
36 | + | |
37 | + def remove_triple(triple) | |
38 | + query = "WITH <#{triple.graph}> DELETE { <#{triple.subject}> <#{triple.predicate}> #{triple.object} }" | |
39 | + plugin.virtuoso_client.query(query) | |
40 | + end | |
41 | + | |
32 | 42 | protected |
33 | 43 | |
34 | 44 | def format_triple_term(term) | ... | ... |
plugins/virtuoso/lib/virtuoso_plugin/triples_template.rb
... | ... | @@ -37,7 +37,7 @@ class VirtuosoPlugin::TriplesTemplate < Article |
37 | 37 | |
38 | 38 | def template_content |
39 | 39 | begin |
40 | - results = plugin.virtuoso_client.query(query) | |
40 | + results = plugin.virtuoso_readonly_client.query(query) | |
41 | 41 | liquid_template = Liquid::Template.parse(template) |
42 | 42 | page = liquid_template.render('results' => results) |
43 | 43 | transform_html(page) | ... | ... |
plugins/virtuoso/public/style.css
... | ... | @@ -0,0 +1,37 @@ |
1 | +function remove_triple(triple_id) { | |
2 | + graph = jQuery("input#graph_uri").val(); | |
3 | + subject = jQuery("input#triples_triple" + triple_id + "_from_subject").val(); | |
4 | + predicate = jQuery("input#triples_triple" + triple_id + "_from_predicate").val(); | |
5 | + object = jQuery("input#triples_triple" + triple_id + "_from_object").val(); | |
6 | + | |
7 | + var formData = { triple: { graph: graph, subject: subject, predicate: predicate, object: object } } | |
8 | + | |
9 | + jQuery.ajax({ | |
10 | + cache: false, | |
11 | + type: 'POST', | |
12 | + url: '/admin/plugin/virtuoso/remove_triple', | |
13 | + data: formData, | |
14 | + dataType: 'json', | |
15 | + success: function(data, status, ajax){ | |
16 | + if ( !data.ok ) { | |
17 | + display_notice(data.error.message); | |
18 | + } | |
19 | + else { | |
20 | + display_notice(data.message); | |
21 | + jQuery("li#triple-" + triple_id).fadeOut(700, function() { | |
22 | + if (jQuery("ul#triples-list > li").length == 1) { | |
23 | + jQuery("form#form-triples-edit").remove(); | |
24 | + } | |
25 | + else { | |
26 | + jQuery("li#triple-" + triple_id).remove(); | |
27 | + } | |
28 | + }); | |
29 | + } | |
30 | + }, | |
31 | + error: function(ajax, status, errorThrown) { | |
32 | + alert('Send request - HTTP '+status+': '+errorThrown); | |
33 | + } | |
34 | + }); | |
35 | + | |
36 | + return false; | |
37 | +} | ... | ... |
plugins/virtuoso/test/unit/triples_template_test.rb
... | ... | @@ -10,8 +10,8 @@ class TriplesTemplateTest < ActiveSupport::TestCase |
10 | 10 | |
11 | 11 | should 'evaluate template using query results' do |
12 | 12 | article.stubs(:plugin).returns(mock) |
13 | - article.plugin.expects(:virtuoso_client).at_least_once.returns(mock) | |
14 | - article.plugin.virtuoso_client.expects(:query).returns([{'var' => 'Hello '}, {'var' => 'World'}]) | |
13 | + article.plugin.expects(:virtuoso_readonly_client).at_least_once.returns(mock) | |
14 | + article.plugin.virtuoso_readonly_client.expects(:query).returns([{'var' => 'Hello '}, {'var' => 'World'}]) | |
15 | 15 | article.template = "{% for row in results %}{{row.var}}{% endfor %}" |
16 | 16 | |
17 | 17 | assert_match /Hello World/, article.template_content |
... | ... | @@ -19,8 +19,8 @@ class TriplesTemplateTest < ActiveSupport::TestCase |
19 | 19 | |
20 | 20 | should 'display error message when failed to execute the query' do |
21 | 21 | article.stubs(:plugin).returns(mock) |
22 | - article.plugin.expects(:virtuoso_client).at_least_once.returns(mock) | |
23 | - article.plugin.virtuoso_client.expects(:query).raises(RuntimeError.new) | |
22 | + article.plugin.expects(:virtuoso_readonly_client).at_least_once.returns(mock) | |
23 | + article.plugin.virtuoso_readonly_client.expects(:query).raises(RuntimeError.new) | |
24 | 24 | article.template = "{% for row in results %}{{row.var}}{% endfor %}" |
25 | 25 | |
26 | 26 | assert_equal "Failed to process the template", article.template_content |
... | ... | @@ -28,8 +28,8 @@ class TriplesTemplateTest < ActiveSupport::TestCase |
28 | 28 | |
29 | 29 | should 'transform css into inline stylesheet' do |
30 | 30 | article.stubs(:plugin).returns(mock) |
31 | - article.plugin.expects(:virtuoso_client).at_least_once.returns(mock) | |
32 | - article.plugin.virtuoso_client.expects(:query).returns([{'var' => 'Hello '}, {'var' => 'World'}]) | |
31 | + article.plugin.expects(:virtuoso_readonly_client).at_least_once.returns(mock) | |
32 | + article.plugin.virtuoso_readonly_client.expects(:query).returns([{'var' => 'Hello '}, {'var' => 'World'}]) | |
33 | 33 | article.template = "{% for row in results %}<p>{{row.var}}</p>{% endfor %}" |
34 | 34 | article.stylesheet = "p {color: red}" |
35 | 35 | |
... | ... | @@ -40,8 +40,8 @@ class TriplesTemplateTest < ActiveSupport::TestCase |
40 | 40 | |
41 | 41 | should 'do not allow js injection' do |
42 | 42 | article.stubs(:plugin).returns(mock) |
43 | - article.plugin.expects(:virtuoso_client).at_least_once.returns(mock) | |
44 | - article.plugin.virtuoso_client.expects(:query).returns([{'var' => RDF::Literal.new('<script>alert("hello");</script>')}]) | |
43 | + article.plugin.expects(:virtuoso_readonly_client).at_least_once.returns(mock) | |
44 | + article.plugin.virtuoso_readonly_client.expects(:query).returns([{'var' => RDF::Literal.new('<script>alert("hello");</script>')}]) | |
45 | 45 | article.template = "{% for row in results %}{{row.var}}{% endfor %}" |
46 | 46 | |
47 | 47 | assert_no_match /<script>/, article.template_content | ... | ... |
plugins/virtuoso/test/unit/virtuoso_plugin_test.rb
... | ... | @@ -4,13 +4,29 @@ class VirtuosoPluginTest < ActiveSupport::TestCase |
4 | 4 | |
5 | 5 | def setup |
6 | 6 | @environment = Environment.default |
7 | - @plugin = VirtuosoPlugin.new | |
7 | + @plugin = VirtuosoPlugin.new(self) | |
8 | 8 | end |
9 | 9 | |
10 | - attr_reader :plugin | |
10 | + attr_reader :plugin, :environment | |
11 | 11 | |
12 | 12 | should 'define a new content' do |
13 | 13 | assert_equal [VirtuosoPlugin::TriplesTemplate], plugin.content_types |
14 | 14 | end |
15 | 15 | |
16 | + should 'create a client for virtuoso using admin account' do | |
17 | + plugin.stubs(:settings).returns(mock) | |
18 | + plugin.settings.expects(:virtuoso_uri) | |
19 | + plugin.settings.expects(:virtuoso_username) | |
20 | + plugin.settings.expects(:virtuoso_password) | |
21 | + plugin.virtuoso_client | |
22 | + end | |
23 | + | |
24 | + should 'create a client for virtuoso using a read-only account' do | |
25 | + plugin.stubs(:settings).returns(mock) | |
26 | + plugin.settings.expects(:virtuoso_uri) | |
27 | + plugin.settings.expects(:virtuoso_readonly_username) | |
28 | + plugin.settings.expects(:virtuoso_readonly_password) | |
29 | + plugin.virtuoso_readonly_client | |
30 | + end | |
31 | + | |
16 | 32 | end | ... | ... |
plugins/virtuoso/views/virtuoso_plugin_admin/add_triple.html.erb
0 → 100644
... | ... | @@ -0,0 +1,27 @@ |
1 | +<div id="virtuoso-triples-management"> | |
2 | + <h1><%= _('Virtuoso settings » Triples Management » Add Triple')%></h1> | |
3 | + | |
4 | + <%= form_tag('/admin/plugin/virtuoso/add_triple', :method => 'post') do %> | |
5 | + | |
6 | + <ul> | |
7 | + <li> | |
8 | + <%= labelled_form_field(_('Graph:'), text_field_tag('triple[graph]', '') ) %> | |
9 | + </li> | |
10 | + <li> | |
11 | + <%= labelled_form_field(_('Subject:'), text_field_tag('triple[subject]', '') ) %> | |
12 | + </li> | |
13 | + <li> | |
14 | + <%= labelled_form_field(_('Predicate:'), text_field_tag('triple[predicate]', '') ) %> | |
15 | + </li> | |
16 | + <li> | |
17 | + <%= labelled_form_field(_('Object:'), text_field_tag('triple[object]', '') ) %> | |
18 | + </li> | |
19 | + </ul> | |
20 | + | |
21 | + <% button_bar do %> | |
22 | + <%= submit_button(:save, _('Save')) %> | |
23 | + <% end %> | |
24 | + | |
25 | + <% end %> | |
26 | + | |
27 | +</div> | ... | ... |
plugins/virtuoso/views/virtuoso_plugin_admin/index.html.erb
... | ... | @@ -6,11 +6,13 @@ |
6 | 6 | <%= form_for(:settings) do |f| %> |
7 | 7 | <strong> |
8 | 8 | <%= labelled_form_field _('Virtuoso URL:'), f.text_field(:virtuoso_uri) %> |
9 | - <%= labelled_form_field _('Virtuoso Username:'), f.text_field(:virtuoso_username) %> | |
10 | - <%= labelled_form_field _('Virtuoso Password:'), f.password_field(:virtuoso_password) %> | |
9 | + <%= labelled_form_field _('Virtuoso Admin Username:'), f.text_field(:virtuoso_username) %> | |
10 | + <%= labelled_form_field _('Virtuoso Admin Password:'), f.password_field(:virtuoso_password) %> | |
11 | + <%= labelled_form_field _('Virtuoso Read-Only Username:'), f.text_field(:virtuoso_readonly_username) %> | |
12 | + <%= labelled_form_field _('Virtuoso Read-Only Password:'), f.password_field(:virtuoso_readonly_password) %> | |
13 | + <%= labelled_form_field _('DSpace URL:'), f.text_field(:dspace_uri) %> | |
11 | 14 | </strong> |
12 | - <BR> | |
13 | - | |
15 | + <BR> | |
14 | 16 | <div class="dspace-servers-config-box" > |
15 | 17 | |
16 | 18 | <strong><%= _('Dspace Servers\' URL:') %></strong> |
... | ... | @@ -49,7 +51,7 @@ |
49 | 51 | <hr /> |
50 | 52 | <div class="triple-management"> |
51 | 53 | <div class="actions"> |
52 | - <%= button :edit, _('Triple management'), :action => :triple_management %> | |
54 | + <%= button :edit, _('Triples management'), :action => :triples_management %> | |
53 | 55 | <%= button :edit, _('Custom Queries'), :action => :index, :controller => 'virtuoso_plugin_custom_queries' %> |
54 | 56 | </div> |
55 | -</div> | |
56 | 57 | \ No newline at end of file |
58 | +</div> | ... | ... |
plugins/virtuoso/views/virtuoso_plugin_admin/triple_management.html.erb
1 | 1 | <div id="virtuoso-triples-management"> |
2 | 2 | <h1><%= _('Virtuoso settings » Triples Management')%></h1> |
3 | 3 | |
4 | - <%= form_tag('/admin/plugin/virtuoso/triple_management', :method => 'post') do %> | |
5 | - <%= labelled_form_field(_('Default Graph IRI:'), text_field_tag(:graph_uri, @graph_uri) ) %> | |
4 | + <%= form_tag('/admin/plugin/virtuoso/triples_management', :method => 'post') do %> | |
5 | + <%= labelled_form_field(_('Graph URI:'), text_field_tag(:graph_uri, @graph_uri) ) %> | |
6 | 6 | <%= labelled_form_field(_('Query SPARQL:'), text_area_tag(:query, @query, :rows => 7)) %> |
7 | 7 | <% button_bar do %> |
8 | - <%= submit_button(:search, _('Search')) %> | |
8 | + <%= submit_button(:search, _('Search triples')) %> | |
9 | + <%= button :add, _('Add triple'), :action => :add_triple %> | |
9 | 10 | <% end %> |
10 | 11 | <% end %> |
11 | 12 | |
12 | 13 | <% unless @triples.empty? %> |
13 | 14 | |
14 | - <%= form_tag('/admin/plugin/virtuoso/triple_update', :method => 'post') do %> | |
15 | + <%= form_tag('/admin/plugin/virtuoso/triple_update', :method => 'post', :id => 'form-triples-edit') do %> | |
15 | 16 | <%= hidden_field_tag(:graph_uri, @graph_uri) %> |
16 | 17 | |
17 | 18 | <ul id="triples-list"> |
... | ... | @@ -20,7 +21,7 @@ |
20 | 21 | |
21 | 22 | <% @triples.each { |triple| %> |
22 | 23 | |
23 | - <li> | |
24 | + <li id="triple-<%=triple_counter%>"> | |
24 | 25 | <ul class="triple"> |
25 | 26 | <li> |
26 | 27 | <%= hidden_field_tag("triples[triple#{triple_counter}[from][subject]]", triple[:s].to_s) %> |
... | ... | @@ -34,6 +35,9 @@ |
34 | 35 | <%= hidden_field_tag("triples[triple#{triple_counter}[from][object]]", triple[:o].to_s) %> |
35 | 36 | <%= labelled_form_field(_('Object:'), text_field_tag("triples[triple#{triple_counter}[to][object]]", triple[:o].to_s) ) %> |
36 | 37 | </li> |
38 | + <li class="triple-actions"> | |
39 | + <%= button :remove, _('Remove triple'), {}, :href => '#', :onclick => "remove_triple(#{triple_counter}); return false;" %> | |
40 | + </li> | |
37 | 41 | </ul> |
38 | 42 | </li> |
39 | 43 | |
... | ... | @@ -52,3 +56,5 @@ |
52 | 56 | <% end %> |
53 | 57 | |
54 | 58 | </div> |
59 | + | |
60 | +<%= javascript_include_tag '/plugins/virtuoso/triples_management.js' %> | ... | ... |