diff --git a/Gemfile b/Gemfile index 159b799f..a269ad53 100644 --- a/Gemfile +++ b/Gemfile @@ -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 - diff --git a/Gemfile.lock b/Gemfile.lock index d67fec61..232a6a8b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -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) diff --git a/config/locales/admin_ui.de.yml b/config/locales/admin_ui.de.yml index 9f8d0554..35d409d8 100644 --- a/config/locales/admin_ui.de.yml +++ b/config/locales/admin_ui.de.yml @@ -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: %{url}" + help_image: "Das Bild kann über den folgenden Liquid Code in Seitenvorlagen oder Snipplets eingebunden werden: {{ '%{path}' | theme_image_tag }}.
Die aktuelle Bildgröße ist: %{width}px x %{height}px.
" + help_javascript: "Die Javascript Datei kann über den folgenden Liquid Code in Seitenvorlagen oder Snipplets eingebunden werden: {{ '%{path}' | javascript_tag }}.
" + help_stylesheet: "Die Stylesheet Datei kann über den folgenden Liquid Code in Seitenvorlagen oder Snipplets eingebunden werden: {{ '%{path}' | stylesheet_tag }}.
" + 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: %{name}" - notes: "All Verbindungseinstellungen für mongodb findest du in der config/mongoid.yml Datei." - default_domain: - label: "Standard Domain-Name: %{name}" - 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.
The default domain name value can be found in the config/initializers/locomotive.rb file." - step_2: - title: "Schritt 2/3 — Account erstellen" + title: "Schritt 1/2 — 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:
%{name}, %{email}" - next: Account erstellen - step_3: - title: "Schritt 3/3 — Erstelle deine erste Webseite" - explanations: "Dies ist der letzte Schritt der Installation. Du kannst nun ein fertiges Template als zip-Datei hochladen. Hier findest du ein paar kostenlose Templates, die du gerne kostenlos verwenden kannst." + done: "Du hast bereits einen Zugang erstellt:
%{name}, %{email}" + next: Zugang erstellen + step_2: + title: "Schritt 2/2 — 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. Hier findest du ein paar kostenlose Templates, die du gerne kostenlos verwenden kannst." + back_to_default_template: "Klicken Sie hier um die Standardvorlage zu verwenden." next: Webseite erstellen diff --git a/config/locales/formtastic.de.yml b/config/locales/formtastic.de.yml index 1a73388d..ce1c8855 100644 --- a/config/locales/formtastic.de.yml +++ b/config/locales/formtastic.de.yml @@ -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 hier, 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 /robots.txt Datei. Siehe auch diese Seite 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" \ No newline at end of file + api_accounts: "Sobald ein Besucher ein neues Element erstellt, wird eine Benachrichtigungs-Email an alle unten aufgeführten Accounts gesendet" diff --git a/lib/locomotive/liquid/drops/contents.rb b/lib/locomotive/liquid/drops/contents.rb deleted file mode 100644 index 3ba6841e..00000000 --- a/lib/locomotive/liquid/drops/contents.rb +++ /dev/null @@ -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 diff --git a/locomotive_cms.gemspec b/locomotive_cms.gemspec index 457c569e..766827b5 100644 --- a/locomotive_cms.gemspec +++ b/locomotive_cms.gemspec @@ -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' diff --git a/spec/cells/locomotive/global_actions_spec.rb b/spec/cells/locomotive/global_actions_spec.rb index e2db9733..a07eecd7 100644 --- a/spec/cells/locomotive/global_actions_spec.rb +++ b/spec/cells/locomotive/global_actions_spec.rb @@ -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 diff --git a/spec/controllers/locomotive/api_contents_controller_spec.rb b/spec/controllers/locomotive/api_contents_controller_spec.rb deleted file mode 100644 index e55fe8fd..00000000 --- a/spec/controllers/locomotive/api_contents_controller_spec.rb +++ /dev/null @@ -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 ) }) - - 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 => %(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 diff --git a/spec/lib/locomotive/liquid/drops/contents_spec.rb b/spec/lib/locomotive/liquid/drops/contents_spec.rb deleted file mode 100644 index 76f7c203..00000000 --- a/spec/lib/locomotive/liquid/drops/contents_spec.rb +++ /dev/null @@ -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