Commit b1d29dcd050116396c42979d114161d0ed292caf

Authored by Victor Costa
1 parent 604b5243

virtuoso: accept stylesheet in templates

plugins/virtuoso/Gemfile
@@ -2,3 +2,5 @@ gem 'rdf' @@ -2,3 +2,5 @@ gem 'rdf'
2 gem 'rdf-virtuoso' 2 gem 'rdf-virtuoso'
3 gem 'oai' 3 gem 'oai'
4 gem 'liquid' 4 gem 'liquid'
  5 +gem 'roadie'
  6 +gem 'roadie-rails'
plugins/virtuoso/db/migrate/20141113131439_create_custom_queries.rb
@@ -6,6 +6,7 @@ class CreateCustomQueries < ActiveRecord::Migration @@ -6,6 +6,7 @@ class CreateCustomQueries < ActiveRecord::Migration
6 t.string :name 6 t.string :name
7 t.text :query 7 t.text :query
8 t.text :template 8 t.text :template
  9 + t.text :stylesheet
9 t.boolean :enabled, :default => true 10 t.boolean :enabled, :default => true
10 t.timestamps 11 t.timestamps
11 end 12 end
plugins/virtuoso/features/edit_template.feature 0 → 100644
@@ -0,0 +1,25 @@ @@ -0,0 +1,25 @@
  1 +Feature: edit template
  2 + As a noosfero user
  3 + I want to create and edit templates
  4 +
  5 + Background:
  6 + Given I am on the homepage
  7 + And plugin Virtuoso is enabled on environment
  8 + And the following users
  9 + | login | name |
  10 + | joaosilva | Joao Silva |
  11 + And I am logged in as "joaosilva"
  12 + And the following custom queries
  13 + | name | query | template |
  14 + | Default | query-1 | template-1 |
  15 +
  16 + @selenium
  17 + Scenario:
  18 + Given I am on joaosilva's control panel
  19 + And I follow "Manage Content"
  20 + And I should see "New content"
  21 + And I follow "New content"
  22 + And I should see "Triples template" within ".article-types"
  23 + When I follow "Triples template" within ".article-types"
  24 + And I follow "Copy" within ".custom-query"
  25 + Then the "SPARQL Query" field should contain "query-1"
plugins/virtuoso/features/step_definitions/virtuoso_plugin_steps.rb 0 → 100644
@@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
  1 +Given /^the following custom queries$/ do |table|
  2 + table.hashes.map{|item| item.dup}.each do |item|
  3 + VirtuosoPlugin::CustomQuery.create!(item.merge(:environment => Environment.default))
  4 + end
  5 +end
plugins/virtuoso/lib/virtuoso_plugin/custom_query.rb
@@ -2,7 +2,7 @@ class VirtuosoPlugin::CustomQuery < Noosfero::Plugin::ActiveRecord @@ -2,7 +2,7 @@ class VirtuosoPlugin::CustomQuery < Noosfero::Plugin::ActiveRecord
2 2
3 belongs_to :environment 3 belongs_to :environment
4 4
5 - attr_accessible :enabled, :environment, :query, :template, :name 5 + attr_accessible :enabled, :environment, :query, :template, :name, :stylesheet
6 6
7 validates_presence_of :name 7 validates_presence_of :name
8 8
plugins/virtuoso/lib/virtuoso_plugin/triples_template.rb
@@ -10,8 +10,9 @@ class VirtuosoPlugin::TriplesTemplate < Article @@ -10,8 +10,9 @@ class VirtuosoPlugin::TriplesTemplate < Article
10 10
11 settings_items :query, :type => :string 11 settings_items :query, :type => :string
12 settings_items :template, :type => :string 12 settings_items :template, :type => :string
  13 + settings_items :stylesheet, :type => :string
13 14
14 - attr_accessible :query, :template 15 + attr_accessible :query, :template, :stylesheet
15 16
16 def to_html(options = {}) 17 def to_html(options = {})
17 article = self 18 article = self
@@ -28,11 +29,20 @@ class VirtuosoPlugin::TriplesTemplate < Article @@ -28,11 +29,20 @@ class VirtuosoPlugin::TriplesTemplate < Article
28 begin 29 begin
29 results = plugin.virtuoso_client.query(query) 30 results = plugin.virtuoso_client.query(query)
30 liquid_template = Liquid::Template.parse("{% for row in results %}#{template}{% endfor %}") 31 liquid_template = Liquid::Template.parse("{% for row in results %}#{template}{% endfor %}")
31 - liquid_template.render('results' => results) 32 + page = liquid_template.render('results' => results)
  33 + transform_html(page)
32 rescue => ex 34 rescue => ex
33 logger.info ex.to_s 35 logger.info ex.to_s
34 "Failed to process the template" 36 "Failed to process the template"
35 end 37 end
36 end 38 end
37 39
  40 + protected
  41 +
  42 + def transform_html(html)
  43 + document = Roadie::Document.new(html)
  44 + document.add_css(stylesheet) if stylesheet.present?
  45 + document.transform
  46 + end
  47 +
38 end 48 end
plugins/virtuoso/public/custom_query.js
@@ -2,6 +2,7 @@ jQuery(document).ready(function($) { @@ -2,6 +2,7 @@ jQuery(document).ready(function($) {
2 $('#copy_custom_query').on('click', function() { 2 $('#copy_custom_query').on('click', function() {
3 $.getJSON("/plugin/virtuoso/public/custom_query", {id: $('#select_custom_query').val()}, function(data) { 3 $.getJSON("/plugin/virtuoso/public/custom_query", {id: $('#select_custom_query').val()}, function(data) {
4 $('#article_query').val(data.custom_query.query); 4 $('#article_query').val(data.custom_query.query);
  5 + $('#article_stylesheet').val(data.custom_query.stylesheet);
5 tinymce.get('article_template').setContent(data.custom_query.template); 6 tinymce.get('article_template').setContent(data.custom_query.template);
6 }); 7 });
7 }); 8 });
plugins/virtuoso/test/functional/virtuoso_plugin_custom_queries_controller_test.rb
@@ -2,7 +2,7 @@ require 'test_helper' @@ -2,7 +2,7 @@ require 'test_helper'
2 2
3 class VirtuosoPluginCustomQueriesControllerTest < ActionController::TestCase 3 class VirtuosoPluginCustomQueriesControllerTest < ActionController::TestCase
4 setup do 4 setup do
5 - @custom_query = VirtuosoPlugin::CustomQuery.create!(:name => 'name', :query => 'query', :template => 'template', :environment => Environment.default) 5 + @custom_query = VirtuosoPlugin::CustomQuery.create!(:name => 'name', :query => 'query', :template => 'template', :stylesheet => 'stylesheet', :environment => Environment.default)
6 login_as(create_admin_user(Environment.default)) 6 login_as(create_admin_user(Environment.default))
7 end 7 end
8 8
@@ -19,7 +19,7 @@ class VirtuosoPluginCustomQueriesControllerTest &lt; ActionController::TestCase @@ -19,7 +19,7 @@ class VirtuosoPluginCustomQueriesControllerTest &lt; ActionController::TestCase
19 19
20 should "create custom_query" do 20 should "create custom_query" do
21 assert_difference('VirtuosoPlugin::CustomQuery.count') do 21 assert_difference('VirtuosoPlugin::CustomQuery.count') do
22 - post :create, custom_query: { name: @custom_query.name, enabled: @custom_query.enabled, query: @custom_query.query, template: @custom_query.template } 22 + post :create, custom_query: { name: @custom_query.name, enabled: @custom_query.enabled, query: @custom_query.query, template: @custom_query.template, stylesheet: @custom_query.stylesheet }
23 end 23 end
24 24
25 assert_redirected_to :action => :index 25 assert_redirected_to :action => :index
@@ -31,7 +31,7 @@ class VirtuosoPluginCustomQueriesControllerTest &lt; ActionController::TestCase @@ -31,7 +31,7 @@ class VirtuosoPluginCustomQueriesControllerTest &lt; ActionController::TestCase
31 end 31 end
32 32
33 should "update custom_query" do 33 should "update custom_query" do
34 - put :update, id: @custom_query, custom_query: { name: @custom_query.name, enabled: @custom_query.enabled, query: @custom_query.query, template: @custom_query.template } 34 + put :update, id: @custom_query, custom_query: { name: @custom_query.name, enabled: @custom_query.enabled, query: @custom_query.query, template: @custom_query.template, stylesheet: @custom_query.stylesheet }
35 assert_redirected_to :action => :index 35 assert_redirected_to :action => :index
36 end 36 end
37 37
plugins/virtuoso/test/unit/triples_template_test.rb
@@ -14,7 +14,7 @@ class TriplesTemplateTest &lt; ActiveSupport::TestCase @@ -14,7 +14,7 @@ class TriplesTemplateTest &lt; ActiveSupport::TestCase
14 article.plugin.virtuoso_client.expects(:query).returns([{'var' => 'Hello '}, {'var' => 'World'}]) 14 article.plugin.virtuoso_client.expects(:query).returns([{'var' => 'Hello '}, {'var' => 'World'}])
15 article.template = "{{row.var}}" 15 article.template = "{{row.var}}"
16 16
17 - assert_equal 'Hello World', article.template_content 17 + assert_match /Hello World/, article.template_content
18 end 18 end
19 19
20 should 'display error message when failed to execute the query' do 20 should 'display error message when failed to execute the query' do
@@ -26,4 +26,16 @@ class TriplesTemplateTest &lt; ActiveSupport::TestCase @@ -26,4 +26,16 @@ class TriplesTemplateTest &lt; ActiveSupport::TestCase
26 assert_equal "Failed to process the template", article.template_content 26 assert_equal "Failed to process the template", article.template_content
27 end 27 end
28 28
  29 + should 'transform css into inline stylesheet' do
  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'}])
  33 + article.template = "<p>{{row.var}}</p>"
  34 + article.stylesheet = "p {color: red}"
  35 +
  36 + content = article.template_content
  37 + assert_match /<p style="color:red">Hello <\/p>/, content
  38 + assert_match /<p style="color:red">World<\/p>/, content
  39 + end
  40 +
29 end 41 end
plugins/virtuoso/views/cms/virtuoso_plugin/_tinymce_template_editor.html.erb 0 → 100644
@@ -0,0 +1,11 @@ @@ -0,0 +1,11 @@
  1 +<% extend TinymceHelper %>
  2 +
  3 +<%= tinymce_js %>
  4 +
  5 +<script>
  6 + function tinymce_macros_setup(editor) {}
  7 +
  8 + jQuery(document).ready(function($) {
  9 + <%= tinymce_init_js(:valid_children => "+body[style]") %>
  10 + });
  11 +</script>
plugins/virtuoso/views/cms/virtuoso_plugin/_triples_template.html.erb
1 <div class="virtuoso-triples-template"> 1 <div class="virtuoso-triples-template">
2 <%= required_fields_message %> 2 <%= required_fields_message %>
3 3
4 - <%= render :file => 'shared/tiny_mce' %> 4 + <%= render :partial => 'cms/virtuoso_plugin/tinymce_template_editor' %>
5 5
6 <%= required labelled_form_field(_('Title'), text_field(:article, 'name', :size => '64', :maxlength => 150)) %> 6 <%= required labelled_form_field(_('Title'), text_field(:article, 'name', :size => '64', :maxlength => 150)) %>
7 7
@@ -20,6 +20,13 @@ @@ -20,6 +20,13 @@
20 </span> 20 </span>
21 </div> 21 </div>
22 22
  23 + <div class="stylesheet">
  24 + <span class="label"><%= _('Stylesheet') %></span>
  25 + <span>
  26 + <%= text_area(:article, :stylesheet, :style => 'width: 98%; height: 100px;') %>
  27 + </span>
  28 + </div>
  29 +
23 <%= render :partial => 'shared/lead_and_body', :locals => {:tiny_mce => true} %> 30 <%= render :partial => 'shared/lead_and_body', :locals => {:tiny_mce => true} %>
24 <%= render :partial => 'general_fields' %> 31 <%= render :partial => 'general_fields' %>
25 </div> 32 </div>
plugins/virtuoso/views/virtuoso_plugin_custom_queries/_form.html.erb
@@ -24,6 +24,10 @@ @@ -24,6 +24,10 @@
24 <%= f.text_area :template %> 24 <%= f.text_area :template %>
25 </div> 25 </div>
26 <div class="field"> 26 <div class="field">
  27 + <%= f.label :stylesheet %><br />
  28 + <%= f.text_area :stylesheet %>
  29 + </div>
  30 + <div class="field">
27 <%= f.label :enabled %><br /> 31 <%= f.label :enabled %><br />
28 <%= f.check_box :enabled %> 32 <%= f.check_box :enabled %>
29 </div> 33 </div>