Class: NetworksController

Inherits:
ApplicationController show all
Defined in:
app/controllers/networks_controller.rb

Overview

Gestion des réseaux de publicité

Ce contrôleur gère les objets Network. Il permet de :

  • Lister les réseaux

  • Créer/supprimer des réseaux

  • Afficher et modifier le nom et le statut d’un réseau

  • Modifier les paramètres d’un réseau :

    • Texture

    • Landmark

    • Notecard

    • URL

    • Media URL

    • etc.

  • Ajouter/enlever des panneaux (Panel) d’un réseau.

Instance Method Summary collapse

Instance Method Details

#add_panelObject

Ajoute un panneau dans un réseau.

Input

  • Variable POST panel_id



243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
# File 'app/controllers/networks_controller.rb', line 243

def add_panel
  network = Network.find(params[:id])
  panel = Panel.find(params[:panel_id])
  # On n'ajoute pas un panneau déjà membre d'un autre réseau
  if panel.network.nil?
    # Si le réseau a déjà des panneaux, donc des caractéristiques, il faut les appliquer
    # au nouveau panneau
    reference_panel = network.panels.first
    if reference_panel
      panel.texture  = reference_panel.texture
      panel.notecard = reference_panel.notecard
      panel.landmark = reference_panel.landmark
      panel.url      = reference_panel.url
      panel.mediaurl = reference_panel.mediaurl
    end
    # Et maintenant on ajoute le panneau au réseau
    network.panels << panel
    flash[:notice] = "Panel '#{panel.name} : #{panel.furniture.name}' added to network."
  else
    flash[:notice] = "Panel '#{panel.name} : #{panel.furniture.name}' already belongs to a network ('#{panel.network.name}')."
  end
  redirect_to :action => 'show', :id => network
rescue ActiveRecord::RecordNotFound
  flash[:notice] = "Add panel: Invalid network id ('#{params[:id]}') or panel id ('#{params[:panel_id]}')."
  redirect_to :action => 'list'
end

#createObject

Création d’un nouveau réseau vide.

Input

  • network[] : Paramètres de création du réseau



111
112
113
114
115
116
117
118
119
# File 'app/controllers/networks_controller.rb', line 111

def create
  @network = Network.new(params[:network])
  if @network.save
    flash[:notice] = 'Network was successfully created.'
    redirect_to :action => 'show', :id => @network
  else
    render :action => 'new'
  end
end

#destroyObject

Suppression d’un réseau.

Tous les panneaux membres du réseau deviennent disponibles.

Input

  • id : Network id



152
153
154
155
156
157
# File 'app/controllers/networks_controller.rb', line 152

def destroy
  network = Network.find(params[:id])
  network.destroy
  flash[:notice] = "Network '#{network.name}' deleted."
  redirect_to :action => 'list'
end

#editObject

Formulaire d’édition d’un réseau.

Input

  • id : Network id



126
127
128
# File 'app/controllers/networks_controller.rb', line 126

def edit
  @network = Network.find(params[:id])
end

#indexObject

Renvoie vers l’action ‘list’



23
24
25
26
# File 'app/controllers/networks_controller.rb', line 23

def index
  list
  render :action => 'list'
end

#listObject

Liste des réseaux



33
34
35
# File 'app/controllers/networks_controller.rb', line 33

def list
  @network_pages, @networks = paginate :networks, :per_page => 10
end

#newObject

Formulaire de création d’un nouveau réseau.



102
103
104
# File 'app/controllers/networks_controller.rb', line 102

def new
  @network = Network.new
end

#remove_panelObject

Enlève un panneau d’un réseau, sans le supprimer.

Input

  • id : Network id

  • Variable POST panel_id : Panel id



227
228
229
230
231
232
233
234
235
236
# File 'app/controllers/networks_controller.rb', line 227

def remove_panel
  network = Network.find(params[:id])
  panel = network.panels.find(params[:panel_id])
  network.panels.delete(panel)
  flash[:notice] = "Panel '#{panel.name} : #{panel.furniture.name}' removed from network."
  redirect_to :action => 'show', :id => network
rescue ActiveRecord::RecordNotFound
  flash[:notice] = "Remove panel: Invalid network id ('#{params[:id]}') or panel id ('#{params[:panel_id]}')."
  redirect_to :action => 'list'
end

#set_parametersObject

Modifie les paramètres du réseau et de ses panneaux :

  • Texture

  • Notecard

  • Landmark

  • URL

  • Media URL

  • etc.

La liste des ObjectInWold et ObjectOffWorld est dans les constantes TYPES définies dans chacun des deux modèles.

Les paramètres sont fournis par l’action ‘show’.

Input

  • id : Network id



176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
# File 'app/controllers/networks_controller.rb', line 176

def set_parameters
  network = Network.find(params[:id])
  
  # liste des panneaux à mettre à jour
  panels = network.panels
  # Messages à afficher
  messages = []

  # Traitement Texture, Landmark et Notecard (et autres)
  ObjectInWorld::TYPES.each do |obj_type|
    obj_id = params[:network_parameters]["#{obj_type}_id".intern]
    # Si obj_id est une chaîne vide, alors il faut supprimer l'association avec ce type d'objet
    # uniquement. Sinon il faut aussi le remplacer dans le nouvel objet.
    obj = ObjectInWorld.find(obj_id) rescue nil
    obj_name = obj ? obj.name : 'None'
    panels.each do |p|
      # On simule les expressions de type "p.texture = obj" avec 'send'
      p.send("#{obj_type}=", obj)
    end
    messages << "#{obj_type.humanize} set to '%s'." % obj_name
  end
  
  # Traitement URL, Media URL, etc
  ObjectOffWorld::TYPES.collect { |t| t.last }.each do |obj_type|
    obj_id = params[:network_parameters]["#{obj_type}_id".intern]
    # Si obj_id est une chaîne vide, alors il faut supprimer l'association avec ce type d'objet
    # uniquement. Sinon il faut aussi le remplacer dans le nouvel objet.
    obj = ObjectOffWorld.find(obj_id) rescue nil
    obj_name = obj ? obj.name : 'None'
    panels.each do |p|
      # On simule les expressions de type "p.url = obj" avec 'send'
      p.send("#{obj_type}=", obj)
    end
    messages << "#{obj_type.humanize} set to '%s'." % obj_name
  end
  
  if messages.empty?
    flash[:notice] = "Network not modified"
  else
    panels.each { |p| p.save! }
    flash[:notice] = messages.join(" ")
  end
  redirect_to :action => 'show', :id => network
end

#showObject

Affiche un réseau, ses caractéristiques et l’ensemble des panneaux membres. Affiche aussi les formulaire permettant de modifier le réseau, son paramétrage et sa composition.



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'app/controllers/networks_controller.rb', line 40

def show
  @network = Network.find(params[:id])
  # La liste de tous les panneaux disponibles.
  @unassigned_panels = Panel.unassigned_panels.map { |p| [ "#{p.name} (#{p.furniture.name})", p.id ]}
  # On extrait les caractéristiques du réseau depuis le premier panneau
  # XXX : Ceci suppose que tous les panneaux du réseau sont strictement dans la même configuration.
  panel1 = @network.panels.first
  if panel1
    @network_parameters = OpenStruct.new(
      :texture  => panel1.objects_in_world.find_by_otype("texture"),
      :landmark => panel1.objects_in_world.find_by_otype("landmark"),
      :notecard => panel1.objects_in_world.find_by_otype("notecard"),
      :url      => panel1.objects_off_world.find_by_otype("url"),
      :mediaurl => panel1.objects_off_world.find_by_otype("mediaurl")
    )
#      @network_parameters.texture_id  = @network_parameters.texture.id rescue nil
#      @network_parameters.landmark_id = @network_parameters.landmark.id rescue nil
#      @network_parameters.notecard_id = @network_parameters.notecard.id rescue nil
#      @network_parameters.url_id      = @network_parameters.url.id rescue nil
#      @network_parameters.mediaurl_id = @network_parameters.mediaurl.id rescue nil
#
#      @textures  = ObjectInWorld.find_all_by_otype("texture",   :order => "name").map { |t| [ t.name, t.id ] }
#      @landmarks = [ [ 'No Landmark', nil ] ]  + ObjectInWorld.find_all_by_otype("landmark",  :order => "name").map { |t| [ t.name, t.id ] }
#      @notecards = [ [ 'No Notecard', nil ] ]  + ObjectInWorld.find_all_by_otype("notecard",  :order => "name").map { |t| [ t.name, t.id ] }
#      @urls      = [ [ 'No URL', nil ] ]       + ObjectOffWorld.find_all_by_otype("url",      :order => "name").map { |t| [ "#{t.name} : #{t.content}", t.id ] }
#      @mediaurls = [ [ 'No Media URL', nil ] ] + ObjectOffWorld.find_all_by_otype("mediaurl", :order => "name").map { |t| [ "#{t.name} : #{t.content}", t.id ] }
  else
    @network_parameters = nil
  end
end

#show_parameters_formObject

Affiche le formulaire de modification des paramètres du réseau, en AJAX

Input

  • id : Network id



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'app/controllers/networks_controller.rb', line 76

def show_parameters_form
  @network = Network.find(params[:id])
  # On extrait les caractéristiques du réseau depuis le premier panneau
  # XXX : Ceci suppose que tous les panneaux du réseau sont strictement dans la même configuration.
  panel1 = @network.panels.first
  @network_parameters = OpenStruct.new(
    :texture  => panel1.objects_in_world.find_by_otype("texture"),
    :landmark => panel1.objects_in_world.find_by_otype("landmark"),
    :notecard => panel1.objects_in_world.find_by_otype("notecard"),
    :url      => panel1.objects_off_world.find_by_otype("url"),
    :mediaurl => panel1.objects_off_world.find_by_otype("mediaurl")
  )
  @network_parameters.texture_id  = @network_parameters.texture.id rescue nil
  @network_parameters.landmark_id = @network_parameters.landmark.id rescue nil
  @network_parameters.notecard_id = @network_parameters.notecard.id rescue nil
  @network_parameters.url_id      = @network_parameters.url.id rescue nil
  @network_parameters.mediaurl_id = @network_parameters.mediaurl.id rescue nil

  @textures  = ObjectInWorld.find_all_by_otype("texture",   :order => "name").map { |t| [ t.name, t.id ] }
  @landmarks = [ [ 'No Landmark', nil ] ]  + ObjectInWorld.find_all_by_otype("landmark",  :order => "name").map { |t| [ t.name, t.id ] }
  @notecards = [ [ 'No Notecard', nil ] ]  + ObjectInWorld.find_all_by_otype("notecard",  :order => "name").map { |t| [ t.name, t.id ] }
  @urls      = [ [ 'No URL', nil ] ]       + ObjectOffWorld.find_all_by_otype("url",      :order => "name").map { |t| [ "#{t.name} : #{t.content}", t.id ] }
  @mediaurls = [ [ 'No Media URL', nil ] ] + ObjectOffWorld.find_all_by_otype("mediaurl", :order => "name").map { |t| [ "#{t.name} : #{t.content}", t.id ] }
end

#updateObject

Edition d’un réseau.

Input

  • id : Network id



135
136
137
138
139
140
141
142
143
# File 'app/controllers/networks_controller.rb', line 135

def update
  @network = Network.find(params[:id])
  if @network.update_attributes(params[:network])
    flash[:notice] = 'Network was successfully updated.'
    redirect_to :action => 'show', :id => @network
  else
    render :action => 'edit'
  end
end