Merge remote-tracking branch 'origin/master' into rails_3_1

Conflicts:
	Gemfile
	Gemfile.lock
	features/support/env.rb
	locomotive_cms.gemspec
	spec/cells/locomotive/global_actions_spec.rb
	spec/cells/locomotive/main_menu_cell_spec.rb
	spec/cells/locomotive/settings_menu_cell_spec.rb
This commit is contained in:
Mario Visic 2012-01-14 16:37:24 +10:30
commit 75b0137230
9 changed files with 76 additions and 282 deletions

15
Gemfile
View File

@ -13,8 +13,8 @@ gem 'mongo', '~> 1.5.2'
gem 'bson_ext', '~> 1.5.2'
gem 'mongoid', '~> 2.4.0'
gem 'locomotive_mongoid_acts_as_tree', :git => 'git@github.com:locomotivecms/mongoid_acts_as_tree.git'
gem 'custom_fields', :path => '../gems/custom_fields' # DEV
# gem 'custom_fields', :git => 'git://github.com/locomotivecms/custom_fields.git', :branch => 'experimental'
# gem 'custom_fields', :path => '../gems/custom_fields' # DEV
gem 'custom_fields', :git => 'git://github.com/locomotivecms/custom_fields.git', :branch => 'experimental'
gem 'kaminari'
gem 'haml', '~> 3.1.3'
@ -57,19 +57,13 @@ group :development do
gem 'rspec-cells'
end
group :test, :development do
# gem 'linecache', '0.43', :platforms => :mri_18
# gem 'ruby-debug', :platforms => :mri_18
# gem 'ruby-debug19', :platforms => :mri_19
gem 'cucumber-rails'
end
group :test do
gem 'cucumber-rails', '1.2.0', :require => false
gem 'autotest', :platforms => :mri
gem 'ZenTest', :platforms => :mri
gem 'growl-glue'
gem 'rspec-rails', '2.6.1'
gem 'factory_girl_rails', '~> 1.1'
gem 'factory_girl_rails', '~> 1.3.0'
gem 'pickle'
gem 'xpath', '~> 0.1.4'
gem 'capybara'
@ -82,4 +76,3 @@ end
group :production do
gem 'bushido', '0.0.35'
end

View File

@ -1,17 +1,19 @@
GIT
remote: git@github.com:locomotivecms/mongoid_acts_as_tree.git
revision: ca494d22c3d7946385aba1153c017d9c30e9f9d3
specs:
locomotive_mongoid_acts_as_tree (0.1.5.7)
PATH
remote: ../gems/custom_fields
remote: git://github.com/locomotivecms/custom_fields.git
revision: b187a16acbf581b4eef857d2958a69422407a047
branch: experimental
specs:
custom_fields (2.0.0.rc1)
activesupport (~> 3.1.3)
carrierwave-mongoid (~> 0.1.3)
mongoid (~> 2.4.0)
GIT
remote: git@github.com:locomotivecms/mongoid_acts_as_tree.git
revision: ca494d22c3d7946385aba1153c017d9c30e9f9d3
specs:
locomotive_mongoid_acts_as_tree (0.1.5.7)
GEM
remote: http://rubygems.org/
specs:
@ -78,10 +80,10 @@ GEM
cells (3.7.1)
actionpack (~> 3.0)
railties (~> 3.0)
childprocess (0.2.6)
childprocess (0.3.0)
ffi (~> 1.0.6)
chunky_png (1.2.5)
codemirror-rails (0.3.2)
codemirror-rails (2.2)
railties (~> 3.0)
coffee-script (2.2.0)
coffee-script-source
@ -97,9 +99,9 @@ GEM
gherkin (~> 2.7.1)
json (>= 1.4.6)
term-ansicolor (>= 1.0.6)
cucumber-rails (1.2.1)
capybara (>= 1.1.2)
cucumber (>= 1.1.3)
cucumber-rails (1.2.0)
capybara (>= 1.1.1)
cucumber (>= 1.1.1)
nokogiri (>= 1.5.0)
database_cleaner (0.7.0)
delayed_job (3.0.0)
@ -112,17 +114,17 @@ GEM
orm_adapter (~> 0.0.3)
warden (~> 1.1)
diff-lcs (1.1.3)
dragonfly (0.9.9)
dragonfly (0.9.10)
rack
ejs (1.0.0)
erubis (2.7.0)
excon (0.7.12)
execjs (1.2.13)
multi_json (~> 1.0)
factory_girl (2.3.2)
factory_girl (2.2.0)
activesupport
factory_girl_rails (1.4.0)
factory_girl (~> 2.3.0)
factory_girl_rails (1.3.0)
factory_girl (~> 2.2.0)
railties (>= 3.0.0)
ffi (1.0.11)
flash_cookie_session (1.1.1)
@ -141,7 +143,7 @@ GEM
formtastic (2.0.2)
rails (~> 3.0)
fssm (0.2.8.1)
gherkin (2.7.2)
gherkin (2.7.3)
json (>= 1.4.6)
growl-glue (1.0.7)
haml (3.1.4)
@ -182,7 +184,7 @@ GEM
net-ssh (>= 1.99.1)
net-ssh (2.1.4)
nokogiri (1.5.0)
orm_adapter (0.0.5)
orm_adapter (0.0.6)
pickle (0.4.10)
cucumber (>= 0.8)
rake
@ -297,13 +299,13 @@ DEPENDENCIES
codemirror-rails
coffee-script (~> 2.2.0)
compass (~> 0.12.alpha.4)
cucumber-rails
cucumber-rails (= 1.2.0)
custom_fields!
database_cleaner
delayed_job_mongoid (~> 1.0.8)
devise (~> 1.5.3)
dragonfly (~> 0.9.8)
factory_girl_rails (~> 1.1)
factory_girl_rails (~> 1.3.0)
flash_cookie_session (~> 1.1.1)
fog (~> 1.0.0)
formtastic (~> 2.0.2)

View File

@ -6,6 +6,7 @@ de:
change_password: Update
new_item: "+ hinzufügen"
switch_to_site: Los
delete: "Löschen"
messages:
confirm: Bist du sicher ?
@ -14,7 +15,9 @@ de:
header:
welcome: Willkommen, %{name}
see: Webseite ansehen
switch: Mandant wechseln
logout: Ausloggen
help: Hilfe
menu:
contents: Inhalte
assets: Galerien
@ -49,6 +52,9 @@ de:
title: "Hi %{firstname}, nur damit du Bescheid weißt! Am %{date} wurde folgende neue Instanz erstellt."
type: "Model: %{type}"
sites_picker:
new: + Neuer Mandant
custom_fields:
edit:
title: Benutzerdefinierte Felder bearbeiten
@ -136,6 +142,10 @@ de:
ask_for_name: "Bitte gib den neuen Namen der Webseite an"
memberships:
roles:
admin: Administrator
designer: Designer
author: Autor
new:
title: Neuer Account
help: "Bitte gib eine Email für den neuen Account an. Wenn diese noch nicht registriert ist, wirst du zu einem Formular zur Erstellung weitergeleitet."
@ -179,6 +189,10 @@ de:
edit:
title: "Bearbeite %{file}"
help: "Diese Datei kann über folgende URL erreicht werden: <a href='%{url}'>%{url}</a>"
help_image: "Das Bild kann über den folgenden Liquid Code in Seitenvorlagen oder Snipplets eingebunden werden: <span class='code'>{{ '%{path}' | theme_image_tag }}</span>.<br/>Die aktuelle Bildgröße ist: <b>%{width}px x %{height}px</b>.<br/>"
help_javascript: "Die Javascript Datei kann über den folgenden Liquid Code in Seitenvorlagen oder Snipplets eingebunden werden: <span class='code'>{{ '%{path}' | javascript_tag }}</span>.<br/>"
help_stylesheet: "Die Stylesheet Datei kann über den folgenden Liquid Code in Seitenvorlagen oder Snipplets eingebunden werden: <span class='code'>{{ '%{path}' | stylesheet_tag }}</span>.<br/>"
form:
picker_link: Füge eine Datei in den Code ein
choose_file: Datei auswählen
@ -278,28 +292,19 @@ de:
installation:
common:
title: Erst-Installation von getbenga
title: Locomotive CMS Initialisierung
next: Weiter
step_1:
title: Schritt 1/3
explanations: Dies ist der erste Schritt zur Installation von getbenga. Bitte lies die folgenden Texte genau durch.
database:
label: "Datenbank-Name: <em>%{name}</em>"
notes: "All Verbindungseinstellungen für mongodb findest du in der <b>config/mongoid.yml</b> Datei."
default_domain:
label: "Standard Domain-Name: <em>%{name}</em>"
notes: "Basically, Locomotive is a multi websites platform. Each site instance has a default entry, also called subdomain and based on the default domain name. Obviously, you are free to map other domains to your site instance working like aliases. <br/>The default domain name value can be found in the <b>config/initializers/locomotive.rb</b> file."
step_2:
title: "Schritt 2/3 &mdash; Account erstellen"
title: "Schritt 1/2 &mdash; Zugang erstellen"
name: Nachname
firstname: Vorname
company: Unternehmen
email: Email
password: Passwort
password_confirmation: Passwort-Bestätigung
done: "Du hast bereits einen Account hinzugefügt:<br/><strong>%{name}</strong>, <em>%{email}</em>"
next: Account erstellen
step_3:
title: "Schritt 3/3 &mdash; Erstelle deine erste Webseite"
explanations: "Dies ist der letzte Schritt der Installation. Du kannst nun ein fertiges Template als zip-Datei hochladen. <a href=\'http://www.locomotivecms.com/support/themes\'>Hier</a> findest du ein paar kostenlose Templates, die du gerne kostenlos verwenden kannst."
done: "Du hast bereits einen Zugang erstellt:<br/><strong>%{name}</strong>, <em>%{email}</em>"
next: Zugang erstellen
step_2:
title: "Schritt 2/2 &mdash; Webseite erstellen"
explanations: "Wenn Du schon ein Standard Template hochgeladen hast (siehe Hilfe), kannst Du es gleich benutzen. Oder Du kannst ein fertiges Template als zip-Datei hochladen. <a href='http://www.locomotivecms.com/support/themes'>Hier</a> findest du ein paar kostenlose Templates, die du gerne kostenlos verwenden kannst."
back_to_default_template: "Klicken Sie <a href='#'>hier</a> um die Standardvorlage zu verwenden."
next: Webseite erstellen

View File

@ -4,6 +4,8 @@ de:
information: Allgemeine Informationen
advanced_options: Fortgeschrittene Optionen
meta: Suchmaschinen-Metadaten
seo: SEO Einstellungen
robots_txt: Robots.txt Datei
code: Code
raw_template: Vorlage
credentials: Persönliche Daten
@ -36,12 +38,18 @@ de:
source: Datei
samples: Beispiele kopieren
reset: Webseite zurücksetzen
default_site_template: "Benutze Standard Webseiten Template. Klicke <a href='#'>hier</a>, um ein anderes Template als zip-Datei hochzuladen."
content_type:
item_template: Baustein Template
api_accounts: Benachrichtigte Accounts
content_instance:
_slug: Permalink
account:
edit:
password: "Neues Passwort"
password_confirmation: "Bestätigung des neuen Passworts"
page:
seo_title: Titel
hints:
page:
@ -50,12 +58,16 @@ de:
templatized: "Nutze diese Seite als Vorlage für einen Baustein, den du erstellt hast."
listed: "Regele, ob die Seite in den generierten Menüs angezeigt werden soll."
content_type_id: "Der Baustein für den diese Seite als Vorlage dienen soll."
snippet:
slug: "You need to know it in order to insert the snippet inside a page"
site:
meta_keywords: "Meta-Schlagworte, die im HEAD-Berecih der Webseite genutzt werden. Die einzelnen Wörter werden durch eine Leertaste getrennt. Diese werden für die Suchmaschinen benötigt."
seo_title: "Wähle einen Titel für den 'title' Tag im Seiten Header. Lass es leer, wenn der Seitentitel verwendet werden soll."
meta_keywords: "Meta-Schlagworte, die im HEAD-Bereich der Webseite genutzt werden. Die einzelnen Wörter werden durch eine Leertaste getrennt. Diese werden für die Suchmaschinen benötigt."
meta_description: "Meta-Beschreibung, die im HEAD-Bereich der Webseite genutzt wird. Diese wird für die Suchmaschinen benötigt."
domain_name: "z.B: getbenga.com"
snippet:
slug: "Um ein Snippet einzubinden, musst Du diesen Slug benutzen."
site:
meta_keywords: "Meta-Schlagworte, die im HEAD-Bereich der Webseite genutzt werden. Die einzelnen Wörter werden durch eine Leertaste getrennt. Diese werden für die Suchmaschinen benötigt."
meta_description: "Meta-Beschreibung, die im HEAD-Bereich der Webseite genutzt wird. Diese wird für die Suchmaschinen benötigt."
domain_name: "z.B: locomotiveapp.org"
robots_txt: "Inhalt der <span class='code'>/robots.txt</span> Datei. Siehe auch diese <a href='http://www.w3.org/TR/html4/appendix/notes.html#h-B.4.1.1'>Seite</a> für mehr Informationen."
theme_asset:
slug: "Du musst die Dateiendung nicht angeben (.css or .js)"
edit:
@ -71,10 +83,16 @@ de:
field:
name: "Merkmal verfügbar in den liquid-Templates"
hint: "Hilfe-Text, der im Formular des Bausteins direkt unter dem jeweiligen Feld angezeigt wird"
content_instance:
_slug: "Merkmal, was für die Erstellung der URL für diesen Baustein benutzt wird. (ex: \"template_page/{{ your_object._permalink }})\"."
seo_title: "Wähle einen Titel für den 'title' Tag im Seiten Header. Lass es leer, wenn der Seitentitel verwendet werden soll."
meta_keywords: "Meta-Schlagworte, die im HEAD-Bereich der Webseite genutzt werden. Die einzelnen Wörter werden durch eine Leertaste getrennt. Diese werden für die Suchmaschinen benötigt."
meta_description: "Meta-Beschreibung, die im HEAD-Bereich der Webseite genutzt wird. Diese wird für die Suchmaschinen benötigt."
import:
source: "Eine zip-Datei, die eine databse.yml, Assets und Templates enthält"
samples: "Bei Aktivierung werden auch Inhalte und Assets importiert"
reset: "Bei Aktivierung werden alle Daten deiner Webseite gelöscht, bevor die neue Webseite importiert wird"
content_type:
item_template: "Du kannst den Text für jeden Baustein einfach anpassen. Benutze einfach folgendes in Liquid : ({{ content.name }})"
api_enabled: "Dies wird genutzt, um Besuchern deiner Webseite die Möglichkeit zu geben neue Elemente zu erstellen (z.B: Nachrichten in einem Kontakt-Formular)"
api_accounts: "Sobald ein Besucher ein neues Element erstellt, wird eine Benachrichtigungs-Email an alle unten aufgeführten Accounts gesendet"
api_accounts: "Sobald ein Besucher ein neues Element erstellt, wird eine Benachrichtigungs-Email an alle unten aufgeführten Accounts gesendet"

View File

@ -1,81 +0,0 @@
# DEPRECATED
# module Locomotive
# module Liquid
# module Drops
# class Contents < ::Liquid::Drop
#
# # TODO: refactoring
#
# def before_method(meth)
# type = @context.registers[:site].content_types.where(:slug => meth.to_s).first
# ProxyCollection.new(type)
# end
#
# end
#
# class ProxyCollection < ::Liquid::Drop
#
# def initialize(content_type)
# @content_type = content_type
# @collection = nil
# end
#
# def first
# self.collection.first
# end
#
# def last
# self.collection.last
# end
#
# def each(&block)
# self.collection.each(&block)
# end
#
# def each_with_index(&block)
# self.collection.each_with_index(&block)
# end
#
# def size
# self.collection.size
# end
#
# alias :length :size
#
# def empty?
# self.collection.empty?
# end
#
# def any?
# self.collection.any?
# end
#
# def api
# { 'create' => @context.registers[:controller].send('api_contents_url', @content_type.slug) }
# end
#
# def before_method(meth)
# klass = @content_type.entries.klass # delegate to the proxy class
#
# if (meth.to_s =~ /^group_by_.+$/) == 0
# klass.send(meth, :ordered_contents)
# else
# klass.send(meth)
# end
# end
#
# protected
#
# def paginate(options = {})
# @collection = Kaminari.paginate_array(self.collection).page(options[:page]).per(options[:per_page])
# end
#
# def collection
# @collection ||= @content_type.ordered_contents(@context['with_scope'])
# end
# end
#
# end
# end
# end

View File

@ -34,8 +34,7 @@ Gem::Specification.new do |s|
s.add_dependency 'sass', '3.1.2'
s.add_dependency 'locomotive_liquid', '2.2.2'
s.add_dependency 'formtastic', '~> 1.2.3'
# s.add_dependency 'inherited_resources', '~> 1.1.2'
s.add_dependency 'cells'
s.add_dependency 'cells', '~> 3.7.0'
s.add_dependency 'highline'
s.add_dependency 'sanitize'
@ -54,9 +53,8 @@ Gem::Specification.new do |s|
s.add_dependency 'mimetype-fu'
s.add_dependency 'actionmailer-with-request'
s.add_dependency 'httparty', '0.7.8'
s.add_dependency 'RedCloth', '4.2.8'
s.add_dependency 'delayed_job', '3.0.0.pre4'
s.add_dependency 'delayed_job_mongoid', '1.0.6'
s.add_dependency 'RedCloth', '4.2.9'
s.add_dependency 'delayed_job_mongoid', '1.0.8'
s.add_dependency 'rubyzip'
s.add_dependency 'locomotive_jammit-s3'

View File

@ -5,7 +5,7 @@ describe Locomotive::GlobalActionsCell do
# as if it were a controller.
# render_views
let(:menu) { render_cell('locomotive/global_actions', :show, :current_locomotive_account => FactoryGirl.build('admin user'), :current_site_url => 'http://www.yahoo.fr') }
let(:menu) { render_cell('admin/global_actions', :show, :current_admin => FactoryGirl.build('admin user'), :current_site_url => 'http://www.yahoo.fr') }
describe 'show menu' do

View File

@ -1,91 +0,0 @@
require 'spec_helper'
describe Locomotive::ApiContentsController do
before(:each) do
@site = FactoryGirl.create('existing site')
@site.content_types.first.tap do |content_type|
content_type.entries_custom_fields.build :label => 'Name', :type => 'string', :required => true
content_type.entries_custom_fields.build :label => 'Description', :type => 'text'
content_type.entries_custom_fields.build :label => 'File', :type => 'file'
content_type.entries_custom_fields.build :label => 'Active', :type => 'boolean'
end.save
controller.stubs(:require_site).returns(true)
controller.stubs(:current_site).returns(@site)
end
describe 'API disabled' do
it 'blocks the creation of a new instance' do
post 'create', default_post_params
response.code.should eq('403')
response.body.should == 'Api not enabled'
end
end
describe 'API enabled' do
before(:each) do
Locomotive::ContentType.any_instance.stubs(:api_enabled?).returns(true)
end
it 'saves a content' do
post 'create', default_post_params
response.should redirect_to('http://www.locomotivecms.com/success')
@site.reload.content_types.first.entries.size.should == 1
end
it 'does not save a content if required parameters are missing' do
post 'create', default_post_params(:content_entry => { :name => '' })
response.should redirect_to('http://www.locomotivecms.com/failure')
@site.reload.content_types.first.entries.size.should == 0
end
describe 'XSS vulnerability' do
it 'sanitizes the params (simple example)' do
post 'create', default_post_params(:content_entry => { :name => %(Hacking <script type="text/javascript">alert("You have been hacked")</script>) })
entry = @site.reload.content_types.first.entries.first
entry.name.should == "Hacking alert(\"You have been hacked\")"
end
it 'sanitizes the params (more complex example)' do
post 'create', default_post_params(:content_entry => { :name => %(<img src=javascript:alert('Hello')><table background="javascript:alert('Hello')">Hacked) })
entry = @site.reload.content_types.first.entries.first
entry.name.should == "Hacked"
end
it 'does not sanitize non string params' do
lambda {
post 'create', default_post_params(:content_entry => {
:active => true,
:file => ActionDispatch::Http::UploadedFile.new(:tempfile => FixturedAsset.open('5k.png'), :filename => '5k.png', :content_type => 'image/png')
})
}.should_not raise_exception
end
end
end
def default_post_params(options = {})
{
:slug => 'projects',
:content_entry => { :name => 'LocomotiveCMS', :description => 'Lorem ipsum' }.merge(options.delete(:content_entry) || {}),
:success_callback => 'http://www.locomotivecms.com/success',
:error_callback => 'http://www.locomotivecms.com/failure'
}.merge(options)
end
end

View File

@ -1,50 +0,0 @@
require 'spec_helper'
describe Locomotive::Liquid::Drops::Contents do
before(:each) do
@site = FactoryGirl.build(:site)
content_type = FactoryGirl.build(:content_type)
content_type.entries_custom_fields.build :label => 'anything', :type => 'string'
content_type.entries_custom_fields.build :label => 'published_at', :type => 'date'
@content = content_type.entries.build({
:meta_keywords => 'Libidinous, Angsty',
:meta_description => "Quite the combination.",
:published_at => Date.today })
end
describe 'meta_keywords' do
subject { render_template('{{ content.meta_keywords }}') }
it { should == @content.meta_keywords }
end
describe 'meta_description' do
subject { render_template('{{ content.meta_description }}') }
it { should == @content.meta_description }
end
describe 'date comparaison' do
describe 'older than' do
subject { @content.published_at = 3.days.ago; render_template('{% if content.published_at < today %}In the past{% endif %}') }
it { should == 'In the past' }
end
describe 'more recent than' do
subject { @content.published_at = (Time.now + 1.days); render_template('{% if content.published_at > today %}In the future{% endif %}') }
it { should == 'In the future' }
end
describe 'equality' do
subject { render_template('{% if content.published_at == today %}Today{% endif %}') }
it { should == 'Today' }
end
end
def render_template(template = '', assigns = {})
assigns = { 'content' => @content, 'today' => Date.today }.merge(assigns)
Liquid::Template.parse(template).render(::Liquid::Context.new({}, assigns, { :site => @site }))
end
end