1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2025-02-21 15:54:22 +01:00

[Bug #28] Event type disappear when editing the event

This commit is contained in:
Sylvain 2016-07-25 16:16:25 +02:00
parent 54740d13f8
commit 32d239f723
18 changed files with 68 additions and 38 deletions

View File

@ -17,6 +17,7 @@
- Filter events by category, theme and age range in public view - Filter events by category, theme and age range in public view
- Statistics will include informations abouts events category, theme and age range - Statistics will include informations abouts events category, theme and age range
- Fix a bug: project drafts are shown on public profiles - Fix a bug: project drafts are shown on public profiles
- Fix a bug: event category disappear when editing the event
- [TODO DEPLOY] `rake fablab:es_add_event_filters` - [TODO DEPLOY] `rake fablab:es_add_event_filters`
- [TODO DEPLOY] `rake db:migrate` - [TODO DEPLOY] `rake db:migrate`

View File

@ -322,7 +322,7 @@ Application.Controllers.controller "NewEventController", ["$scope", "$state", "$
end_time: new Date() end_time: new Date()
all_day: 'false' all_day: 'false'
recurrence: 'none' recurrence: 'none'
category_ids: [] category_id: null
## Possible types of recurrences for an event ## Possible types of recurrences for an event
$scope.recurrenceTypes = [ $scope.recurrenceTypes = [

View File

@ -69,7 +69,7 @@
</div> <!-- ./panel-body --> </div> <!-- ./panel-body -->
<div class="panel-footer no-padder"> <div class="panel-footer no-padder">
<input type="submit" ng-value="submitName" class="r-b btn-valid btn btn-warning btn-block p-lg btn-lg text-u-c" ng-disabled="eventForm.$invalid || event.category_ids.length === 0"/> <input type="submit" ng-value="submitName" class="r-b btn-valid btn btn-warning btn-block p-lg btn-lg text-u-c" ng-disabled="eventForm.$invalid || event.category_id === null"/>
</div> </div>
</section> </section>
@ -83,11 +83,10 @@
<h3 translate>{{ 'event_type' }} *</h3> <h3 translate>{{ 'event_type' }} *</h3>
</div> </div>
<div class="widget-content no-bg wrapper"> <div class="widget-content no-bg wrapper">
<input type="hidden" name="event[category_ids][]" value="" /> <ui-select ng-model="event.category_id" name="event[category_id][]">
<ui-select ng-model="event.category_ids" name="event[category_ids][]">
<ui-select-match> <ui-select-match>
<span ng-bind="$select.selected.name"></span> <span ng-bind="$select.selected.name"></span>
<input type="hidden" name="event[category_ids][]" value="{{$select.selected.id}}" /> <input type="hidden" name="event[category_id]" value="{{$select.selected.id}}" />
</ui-select-match> </ui-select-match>
<ui-select-choices repeat="c.id as c in (categories | filter: $select.search)"> <ui-select-choices repeat="c.id as c in (categories | filter: $select.search)">
<span ng-bind-html="c.name | highlight: $select.search"></span> <span ng-bind-html="c.name | highlight: $select.search"></span>

View File

@ -50,7 +50,7 @@
<a class="block bg-white img-full p-sm p-l-m box-h-m event b b-light-dark m-t-sm" ui-sref="app.public.events_show({id: event.id})"> <a class="block bg-white img-full p-sm p-l-m box-h-m event b b-light-dark m-t-sm" ui-sref="app.public.events_show({id: event.id})">
<div class="pull-left half-w m-t-n-sm"> <div class="pull-left half-w m-t-n-sm">
<h5 class="text-xs">{{event.categories[0].name}}</h5> <h5 class="text-xs">{{event.category.name}}</h5>
<h4 class="m-n text-sm clear l-n">{{event.title}}</h4> <h4 class="m-n text-sm clear l-n">{{event.title}}</h4>
<h3 class="m-n" ng-show="onSingleDay(event)">{{event.start_date | amDateFormat:'L'}}</h3> <h3 class="m-n" ng-show="onSingleDay(event)">{{event.start_date | amDateFormat:'L'}}</h3>
<h3 class="m-n" ng-hide="onSingleDay(event)">{{event.start_date | amDateFormat:'L'}} <span class="text-sm font-thin" translate> {{ 'to_date' }} </span> {{event.end_date | amDateFormat:'L'}}</h3> <h3 class="m-n" ng-hide="onSingleDay(event)">{{event.start_date | amDateFormat:'L'}} <span class="text-sm font-thin" translate> {{ 'to_date' }} </span> {{event.end_date | amDateFormat:'L'}}</h3>

View File

@ -10,7 +10,7 @@
</div> </div>
<div class="col-xs-10 col-sm-10 col-md-8 b-l b-r-md"> <div class="col-xs-10 col-sm-10 col-md-8 b-l b-r-md">
<section class="heading-title"> <section class="heading-title">
<h1>{{ event.title }} <span class="v-middle badge text-xs bg-event">{{event.categories[0].name}}</span></h1> <h1>{{ event.title }} <span class="v-middle badge text-xs bg-event">{{event.category.name}}</span></h1>
</section> </section>
</div> </div>
@ -67,7 +67,7 @@
<div class="panel-content wrapper"> <div class="panel-content wrapper">
<h5>{{event.categories[0].name}}</h5> <h5>{{event.category.name}}</h5>
<dl class="text-sm"> <dl class="text-sm">
<dt ng-if="event.event_themes.length > 0"><i class="fa fa-tags" aria-hidden="true"></i> {{event.event_themes[0].name}}</dt> <dt ng-if="event.event_themes.length > 0"><i class="fa fa-tags" aria-hidden="true"></i> {{event.event_themes[0].name}}</dt>
<dt ng-if="event.age_range"><i class="fa fa-users" aria-hidden="true"></i> {{event.age_range.name}}</dt> <dt ng-if="event.age_range"><i class="fa fa-users" aria-hidden="true"></i> {{event.age_range.name}}</dt>

View File

@ -97,7 +97,7 @@
<h1 class="m-b">{{event.title}}</h1> <h1 class="m-b">{{event.title}}</h1>
</div> </div>
<div class="col-xs-3"> <div class="col-xs-3">
<span class="v-middle badge text-xs" ng-class="'bg-{{event.categories[0].name | lowercase}}'">{{event.categories[0].name}}</span> <span class="v-middle badge text-xs" ng-class="'bg-{{event.category.name | lowercase}}'">{{event.category.name}}</span>
</div> </div>
</div> </div>
<p>{{event.description | humanize : 500 }}</p> <p>{{event.description | humanize : 500 }}</p>

View File

@ -18,7 +18,7 @@ class API::EventsController < API::ApiController
# GET /events/upcoming/:limit # GET /events/upcoming/:limit
def upcoming def upcoming
limit = params[:limit] limit = params[:limit]
@events = Event.includes(:event_image, :event_files, :availability, :categories) @events = Event.includes(:event_image, :event_files, :availability, :category)
.where('availabilities.start_at >= ?', Time.now) .where('availabilities.start_at >= ?', Time.now)
.order('availabilities.start_at ASC').references(:availabilities).limit(limit) .order('availabilities.start_at ASC').references(:availabilities).limit(limit)
end end
@ -64,8 +64,8 @@ class API::EventsController < API::ApiController
def event_params def event_params
event_preparams = params.required(:event).permit(:title, :description, :start_date, :start_time, :end_date, :end_time, event_preparams = params.required(:event).permit(:title, :description, :start_date, :start_time, :end_date, :end_time,
:amount, :reduced_amount, :nb_total_places, :availability_id, :amount, :reduced_amount, :nb_total_places, :availability_id,
:all_day, :recurrence, :recurrence_end_at, :category_ids, :event_theme_ids, :all_day, :recurrence, :recurrence_end_at, :category_id, :event_theme_ids,
:age_range_id, event_theme_ids: [], category_ids: [], :age_range_id, event_theme_ids: [],
event_image_attributes: [:attachment], event_files_attributes: [:id, :attachment, :_destroy]) event_image_attributes: [:attachment], event_files_attributes: [:id, :attachment, :_destroy])
start_date = Time.zone.parse(event_preparams[:start_date]) start_date = Time.zone.parse(event_preparams[:start_date])
end_date = Time.zone.parse(event_preparams[:end_date]) end_date = Time.zone.parse(event_preparams[:end_date])

View File

@ -2,7 +2,7 @@ class Category < ActiveRecord::Base
extend FriendlyId extend FriendlyId
friendly_id :name, use: :slugged friendly_id :name, use: :slugged
has_and_belongs_to_many :events, join_table: :events_categories, dependent: :destroy has_many :events, dependent: :destroy
after_create :create_statistic_subtype after_create :create_statistic_subtype
after_update :update_statistic_subtype, if: :name_changed? after_update :update_statistic_subtype, if: :name_changed?

View File

@ -5,8 +5,8 @@ class Event < ActiveRecord::Base
accepts_nested_attributes_for :event_image, allow_destroy: true accepts_nested_attributes_for :event_image, allow_destroy: true
has_many :event_files, as: :viewable, dependent: :destroy has_many :event_files, as: :viewable, dependent: :destroy
accepts_nested_attributes_for :event_files, allow_destroy: true, reject_if: :all_blank accepts_nested_attributes_for :event_files, allow_destroy: true, reject_if: :all_blank
has_and_belongs_to_many :categories, join_table: :events_categories belongs_to :category
validates :categories, presence: true validates :category, presence: true
has_many :reservations, as: :reservable, dependent: :destroy has_many :reservations, as: :reservable, dependent: :destroy
has_and_belongs_to_many :event_themes, join_table: :events_event_themes, dependent: :destroy has_and_belongs_to_many :event_themes, join_table: :events_event_themes, dependent: :destroy
@ -81,7 +81,7 @@ class Event < ActiveRecord::Base
event_files: efs, event_files: efs,
availability: Availability.new(start_at: start_at, end_at: end_at, available_type: 'event'), availability: Availability.new(start_at: start_at, end_at: end_at, available_type: 'event'),
availability_id: nil, availability_id: nil,
category_ids: category_ids, category_id: category_id,
amount: amount, amount: amount,
reduced_amount: reduced_amount, reduced_amount: reduced_amount,
nb_total_places: nb_total_places, nb_total_places: nb_total_places,

View File

@ -2,12 +2,12 @@ class EventPolicy < ApplicationPolicy
class Scope < Scope class Scope < Scope
def resolve def resolve
if user.nil? or (user and !user.is_admin?) if user.nil? or (user and !user.is_admin?)
scope.includes(:event_image, :event_files, :availability, :categories) scope.includes(:event_image, :event_files, :availability, :category)
.where('availabilities.start_at >= ?', Time.now) .where('availabilities.start_at >= ?', Time.now)
.order('availabilities.start_at ASC') .order('availabilities.start_at ASC')
.references(:availabilities) .references(:availabilities)
else else
scope.includes(:event_image, :event_files, :availability, :categories) scope.includes(:event_image, :event_files, :availability, :category)
.order('availabilities.start_at DESC') .order('availabilities.start_at DESC')
.references(:availabilities) .references(:availabilities)
end end

View File

@ -200,7 +200,7 @@ class StatisticService
date: options[:start_date].to_date, date: options[:start_date].to_date,
reservation_id: r.id, reservation_id: r.id,
event_id: r.reservable.id, event_id: r.reservable.id,
event_type: r.reservable.categories.first.name, event_type: r.reservable.category.name,
event_name: r.reservable.name, event_name: r.reservable.name,
event_date: slot.start_at.to_date, event_date: slot.start_at.to_date,
event_theme: (r.reservable.event_themes.first ? r.reservable.event_themes.first.name : ''), event_theme: (r.reservable.event_themes.first ? r.reservable.event_themes.first.name : ''),

View File

@ -5,10 +5,10 @@ json.event_files_attributes event.event_files do |f|
json.attachment f.attachment_identifier json.attachment f.attachment_identifier
json.attachment_url f.attachment_url json.attachment_url f.attachment_url
end end
json.category_ids event.category_ids json.category_id event.category_id
json.categories event.categories do |c| json.category do
json.id c.id json.id event.category.id
json.name c.name json.name event.category.name
end end
json.event_theme_ids event.event_theme_ids json.event_theme_ids event.event_theme_ids
json.event_themes event.event_themes do |e| json.event_themes event.event_themes do |e|

View File

@ -0,0 +1,5 @@
class AddCategoryIdToEvent < ActiveRecord::Migration
def change
add_reference :events, :category, index: true, foreign_key: true
end
end

View File

@ -0,0 +1,18 @@
class SingleizeEventCategories < ActiveRecord::Migration
def up
execute 'UPDATE events AS e
SET category_id = ec.category_id
FROM events_categories AS ec
WHERE e.id = ec.event_id;'
end
def down
execute 'INSERT INTO events_categories
(event_id, category_id, created_at, updated_at)
SELECT id, category_id, now(), now()
FROM events;'
execute 'UPDATE events
SET category_id = NULL;'
end
end

View File

@ -0,0 +1,14 @@
class DropEventsCategories < ActiveRecord::Migration
def up
drop_table :events_categories
end
def down
create_table :events_categories do |t|
t.belongs_to :event, index: true
t.belongs_to :category, index: true
t.timestamps
end
end
end

View File

@ -11,7 +11,7 @@
# #
# It's strongly recommended that you check this file into your version control system. # It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20160720124355) do ActiveRecord::Schema.define(version: 20160725135112) do
# These are extensions that must be enabled in order to support this database # These are extensions that must be enabled in order to support this database
enable_extension "plpgsql" enable_extension "plpgsql"
@ -147,21 +147,13 @@ ActiveRecord::Schema.define(version: 20160720124355) do
t.integer "nb_free_places" t.integer "nb_free_places"
t.integer "recurrence_id" t.integer "recurrence_id"
t.integer "age_range_id" t.integer "age_range_id"
t.integer "category_id"
end end
add_index "events", ["availability_id"], name: "index_events_on_availability_id", using: :btree add_index "events", ["availability_id"], name: "index_events_on_availability_id", using: :btree
add_index "events", ["category_id"], name: "index_events_on_category_id", using: :btree
add_index "events", ["recurrence_id"], name: "index_events_on_recurrence_id", using: :btree add_index "events", ["recurrence_id"], name: "index_events_on_recurrence_id", using: :btree
create_table "events_categories", force: :cascade do |t|
t.integer "event_id"
t.integer "category_id"
t.datetime "created_at"
t.datetime "updated_at"
end
add_index "events_categories", ["category_id"], name: "index_events_categories_on_category_id", using: :btree
add_index "events_categories", ["event_id"], name: "index_events_categories_on_event_id", using: :btree
create_table "events_event_themes", force: :cascade do |t| create_table "events_event_themes", force: :cascade do |t|
t.integer "event_id" t.integer "event_id"
t.integer "event_theme_id" t.integer "event_theme_id"
@ -737,6 +729,7 @@ ActiveRecord::Schema.define(version: 20160720124355) do
add_foreign_key "availability_tags", "availabilities" add_foreign_key "availability_tags", "availabilities"
add_foreign_key "availability_tags", "tags" add_foreign_key "availability_tags", "tags"
add_foreign_key "events", "categories"
add_foreign_key "events_event_themes", "event_themes" add_foreign_key "events_event_themes", "event_themes"
add_foreign_key "events_event_themes", "events" add_foreign_key "events_event_themes", "events"
add_foreign_key "invoices", "wallet_transactions" add_foreign_key "invoices", "wallet_transactions"

View File

@ -17,7 +17,7 @@ class EventsTest < ActionDispatch::IntegrationTest
start_time: 1.week.from_now.utc.change({hour: 16}), start_time: 1.week.from_now.utc.change({hour: 16}),
end_date: 1.week.from_now.utc, end_date: 1.week.from_now.utc,
end_time: 1.week.from_now.utc.change({hour: 20}), end_time: 1.week.from_now.utc.change({hour: 20}),
category_ids: [Category.first.id], category_id: Category.first.id,
amount: 0 amount: 0
} }
}.to_json, }.to_json,
@ -45,7 +45,7 @@ class EventsTest < ActionDispatch::IntegrationTest
start_time: 1.week.from_now.utc.change({hour: 16}), start_time: 1.week.from_now.utc.change({hour: 16}),
end_date: 1.week.from_now.utc, end_date: 1.week.from_now.utc,
end_time: 1.week.from_now.utc.change({hour: 20}), end_time: 1.week.from_now.utc.change({hour: 20}),
category_ids: [Category.first.id], category_id: Category.first.id,
amount: 0, amount: 0,
nb_total_places: 10 nb_total_places: 10
} }
@ -99,7 +99,7 @@ class EventsTest < ActionDispatch::IntegrationTest
start_time: 1.week.from_now.utc.change({hour: 16}), start_time: 1.week.from_now.utc.change({hour: 16}),
end_date: 1.week.from_now.utc, end_date: 1.week.from_now.utc,
end_time: 1.week.from_now.utc.change({hour: 20}), end_time: 1.week.from_now.utc.change({hour: 20}),
category_ids: [Category.first.id], category_id: Category.first.id,
amount: 0, amount: 0,
nb_total_places: 20 nb_total_places: 20
} }

View File

@ -3,7 +3,7 @@ require 'test_helper'
class EventTest < ActiveSupport::TestCase class EventTest < ActiveSupport::TestCase
test 'event must have a category' do test 'event must have a category' do
e = Event.first e = Event.first
assert_not_nil e.categories.first assert_not_nil e.category
end end
test 'event must have a theme' do test 'event must have a theme' do