diff --git a/app/controllers/events_controller.rb b/app/controllers/events_controller.rb index 390418a..df7d61e 100644 --- a/app/controllers/events_controller.rb +++ b/app/controllers/events_controller.rb @@ -8,18 +8,46 @@ class EventsController < ApplicationController @item = Item.find_by_key(params[:key]) dates = params[:event].delete(:dates) - e = Event.new(params[:event].merge(:item => @item)) - if e.valid? - dates = extract_dates(dates) - p dates + event = Event.new(params[:event].merge(:item => @item)) + flash[:errors] = "" + flash[:title] = params[:event][:title] + flash[:details] = params[:event][:details] + flash[:dates] = dates + + if event.valid? + event.save + parsed_dates = extract_dates(dates) + if parsed_dates.all? {|d| d.first == :success } + bookings = [] + parsed_dates.map do |d| + bookings << Booking.new(:start_at => d[1], :end_at => d[2], :event => event) + end + if bookings.all?(&:valid?) + bookings.each do |b| + b.event = event + b.save + end + else + bookings.each do |b| + b.errors.each do |_,msg| + flash[:errors] += "
  • #{msg}
  • " + end + end + end + + else + parsed_dates.select {|d| d.first == :error}.each do |err| + flash[:errors] += "
  • La date à la ligne #{err.last+1} est invalide
  • " + end + end else - flash[:errors] = "" e.errors.each do |attr,msg| flash[:errors] += "
  • #{msg}
  • " end - redirect_to item_path(:key => @item.key) end + + redirect_to item_path(:key => @item.key) end # PUT /:key/event/:id @@ -32,6 +60,23 @@ class EventsController < ApplicationController private def extract_dates(text) - text.each_line.to_a + results = [] + text.each_line.to_a.map(&:chomp).each_with_index do |line,lineno| + if line =~ /^(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2}) (\d{2}):(\d{2})/ + day = "%s-%s-%s" % [$~[3], $~[2], $~[1]] + begin + start_at = ("#{day} %s:%s:00" % [$~[4], $~[5]]).to_datetime + end_at = ("#{day} %s:%s:00" % [$~[6], $~[7]]).to_datetime + rescue ArgumentError + results << [:error, lineno] + next + end + + results << [:success, start_at, end_at] + else + results << [:error, lineno] + end + end + results end end diff --git a/app/helpers/item_helper.rb b/app/helpers/item_helper.rb index 109956a..f0a4e23 100644 --- a/app/helpers/item_helper.rb +++ b/app/helpers/item_helper.rb @@ -1,5 +1,6 @@ module ItemHelper def default_dates + return flash[:dates] if flash[:dates] [ @date.strftime('%d/%m/%Y'), hour(+0), hour(+1) ].join(' ') end diff --git a/app/models/booking.rb b/app/models/booking.rb index 246df90..f80ff59 100644 --- a/app/models/booking.rb +++ b/app/models/booking.rb @@ -1,5 +1,6 @@ class Booking < ActiveRecord::Base UNIT = 100 / 24.0 / 4 + belongs_to :event def margin_for(date, offset) @@ -15,4 +16,17 @@ class Booking < ActiveRecord::Base end_at - start_at end + def validate + if self[:start_at] > self[:end_at] + errors.add_to_base("Date de départ et de fin incohérentes.") + end + + bs = self.event.item.bookings.count(:conditions => + ['(start_at > ? AND start_at < ?) OR'+ + '(end_at > ? AND end_at < ?)', + self[:start_at], self[:end_at], + self[:start_at], self[:end_at]]) + errors.add_to_base("Conflit de date.") unless bs.zero? + end + end diff --git a/app/models/event.rb b/app/models/event.rb index 1db1991..605f50c 100644 --- a/app/models/event.rb +++ b/app/models/event.rb @@ -4,6 +4,8 @@ class Event < ActiveRecord::Base belongs_to :item has_many :bookings + before_create :generate_color + validates_presence_of :title, :message => "Le titre ne peut pas être vide" validates_length_of :title, :within => 4...140, :message => "Le titre doit faire entre 4 et 140 caractères" diff --git a/app/views/items/show.html.erb b/app/views/items/show.html.erb index 598db5e..86184db 100644 --- a/app/views/items/show.html.erb +++ b/app/views/items/show.html.erb @@ -8,7 +8,7 @@

    Réserver

    - <% if flash[:errors] %> + <% if flash[:errors] && !flash[:errors].empty? %> @@ -16,12 +16,12 @@ <% form_for :event, :url => add_event_path(:key => @item.key) do |f| %>

    <%= f.label :title, "Titre :" %> - <%= f.text_field :title %> + <%= text_field_tag 'event[title]', flash[:title]||"" %> 140 caractères maximum

    <%= f.label :details, "Détails :" %> - <%= f.text_area :details, :rows => 5, :cols => 20 %> + <%= text_area_tag 'event[details]', flash[:details]||"", :rows => 5, :cols => 20 %>

    <%= f.label :dates, "Dates :" %>