advertnet 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +674 -0
- data/README +257 -0
- data/Rakefile +10 -0
- data/app/controllers/application.rb +40 -0
- data/app/controllers/container_controller.rb +83 -0
- data/app/controllers/content_controller.rb +61 -0
- data/app/controllers/furnitures_controller.rb +87 -0
- data/app/controllers/networks_controller.rb +269 -0
- data/app/controllers/objects_in_world_controller.rb +27 -0
- data/app/controllers/panels_controller.rb +186 -0
- data/app/helpers/application_helper.rb +31 -0
- data/app/helpers/container_helper.rb +2 -0
- data/app/helpers/content_helper.rb +2 -0
- data/app/helpers/furnitures_helper.rb +2 -0
- data/app/helpers/network_helper.rb +2 -0
- data/app/helpers/networks_helper.rb +2 -0
- data/app/helpers/objects_in_world_helper.rb +2 -0
- data/app/helpers/panels_helper.rb +2 -0
- data/app/models/container.rb +51 -0
- data/app/models/furniture.rb +60 -0
- data/app/models/mailer.rb +22 -0
- data/app/models/network.rb +38 -0
- data/app/models/object_in_world.rb +60 -0
- data/app/models/object_off_world.rb +77 -0
- data/app/models/panel.rb +136 -0
- data/app/models/panel_revision.rb +108 -0
- data/app/views/container/list.rhtml +27 -0
- data/app/views/container/show.rhtml +8 -0
- data/app/views/content/_form.rhtml +12 -0
- data/app/views/content/edit.rhtml +8 -0
- data/app/views/content/list.rhtml +26 -0
- data/app/views/content/new.rhtml +8 -0
- data/app/views/furnitures/list.rhtml +51 -0
- data/app/views/furnitures/show.rhtml +7 -0
- data/app/views/layouts/default.rhtml +30 -0
- data/app/views/mailer/avtouch.rhtml +1 -0
- data/app/views/networks/_form.rhtml +11 -0
- data/app/views/networks/_parameters_form.rhtml +8 -0
- data/app/views/networks/edit.rhtml +9 -0
- data/app/views/networks/list.rhtml +25 -0
- data/app/views/networks/new.rhtml +8 -0
- data/app/views/networks/show.rhtml +72 -0
- data/app/views/networks/show_parameters_form.rjs +5 -0
- data/app/views/objects_in_world/list.rhtml +30 -0
- data/app/views/objects_in_world/show.rhtml +8 -0
- data/app/views/panels/list.rhtml +48 -0
- data/app/views/panels/show.rhtml +8 -0
- data/bin/advertnet-install +144 -0
- data/config/boot.rb +45 -0
- data/config/database.yml.default +43 -0
- data/config/environment.rb +67 -0
- data/config/environments/development.rb +21 -0
- data/config/environments/production.rb +21 -0
- data/config/environments/test.rb +19 -0
- data/config/routes.rb +23 -0
- data/db/migrate/001_create_networks.rb +14 -0
- data/db/migrate/002_create_furnitures.rb +17 -0
- data/db/migrate/003_create_containers.rb +16 -0
- data/db/migrate/004_create_objects_in_world.rb +16 -0
- data/db/migrate/005_create_objects_off_world.rb +16 -0
- data/db/migrate/006_create_panels.rb +17 -0
- data/db/migrate/007_join_objects_in_world_panels.rb +17 -0
- data/db/migrate/008_join_objects_off_world_panels.rb +17 -0
- data/db/migrate/009_add_sessions.rb +19 -0
- data/db/migrate/010_add_or_rename_fields.rb +25 -0
- data/db/migrate/011_move_texture_to_object_in_world.rb +25 -0
- data/db/migrate/012_add_permanent_furniture_id.rb +18 -0
- data/db/migrate/013_create_panel_revisions.rb +42 -0
- data/db/schema.rb +102 -0
- data/doc/README_FOR_APP +108 -0
- data/lib/advertnet.rb +13 -0
- data/lib/second_life_validators.rb +89 -0
- data/lib/tasks/documentation.rake +16 -0
- data/lib/tasks/extract_fixtures.rake +23 -0
- data/lib/tasks/load_exported_fixtures.rake +14 -0
- data/public/404.html +30 -0
- data/public/500.html +30 -0
- data/public/dispatch.cgi +10 -0
- data/public/dispatch.fcgi +24 -0
- data/public/dispatch.rb +10 -0
- data/public/favicon.ico +0 -0
- data/public/images/rails.png +0 -0
- data/public/javascripts/application.js +2 -0
- data/public/javascripts/controls.js +833 -0
- data/public/javascripts/dragdrop.js +942 -0
- data/public/javascripts/effects.js +1088 -0
- data/public/javascripts/prototype.js +2515 -0
- data/public/robots.txt +1 -0
- data/public/stylesheets/application.css +25 -0
- data/public/stylesheets/scaffold.css +74 -0
- data/script/about +3 -0
- data/script/breakpointer +3 -0
- data/script/console +3 -0
- data/script/destroy +3 -0
- data/script/generate +3 -0
- data/script/performance/benchmarker +3 -0
- data/script/performance/profiler +3 -0
- data/script/plugin +3 -0
- data/script/process/inspector +3 -0
- data/script/process/reaper +3 -0
- data/script/process/spawner +3 -0
- data/script/runner +3 -0
- data/script/server +3 -0
- data/test/fixtures/containers.yml +44 -0
- data/test/fixtures/furnitures.yml +47 -0
- data/test/fixtures/mailer/avtouch +1 -0
- data/test/fixtures/networks.yml +31 -0
- data/test/fixtures/objects_in_world.yml +71 -0
- data/test/fixtures/objects_in_world_panels.yml +43 -0
- data/test/fixtures/objects_off_world.yml +55 -0
- data/test/fixtures/objects_off_world_panels.yml +20 -0
- data/test/fixtures/panel_revisions.yml +28 -0
- data/test/fixtures/panels.yml +79 -0
- data/test/functional/container_controller_test.rb +167 -0
- data/test/functional/content_controller_test.rb +91 -0
- data/test/functional/furnitures_controller_test.rb +134 -0
- data/test/functional/networks_controller_test.rb +248 -0
- data/test/functional/objects_in_world_controller_test.rb +42 -0
- data/test/functional/panels_controller_test.rb +173 -0
- data/test/test_helper.rb +53 -0
- data/test/unit/container_test.rb +53 -0
- data/test/unit/furniture_test.rb +68 -0
- data/test/unit/mailer_test.rb +40 -0
- data/test/unit/network_test.rb +42 -0
- data/test/unit/object_in_world_test.rb +33 -0
- data/test/unit/object_off_world_test.rb +26 -0
- data/test/unit/panel_revision_test.rb +148 -0
- data/test/unit/panel_test.rb +63 -0
- data/vendor/plugins/annotate_models/ChangeLog +46 -0
- data/vendor/plugins/annotate_models/README +31 -0
- data/vendor/plugins/annotate_models/lib/annotate_models.rb +132 -0
- data/vendor/plugins/annotate_models/tasks/annotate_models_tasks.rake +7 -0
- data/vendor/plugins/foreign_key_migrations/CHANGELOG +99 -0
- data/vendor/plugins/foreign_key_migrations/MIT-LICENSE +20 -0
- data/vendor/plugins/foreign_key_migrations/README +87 -0
- data/vendor/plugins/foreign_key_migrations/about.yml +5 -0
- data/vendor/plugins/foreign_key_migrations/init.rb +3 -0
- data/vendor/plugins/foreign_key_migrations/install.rb +1 -0
- data/vendor/plugins/foreign_key_migrations/lib/red_hill_consulting/foreign_key_migrations/active_record/base.rb +22 -0
- data/vendor/plugins/foreign_key_migrations/lib/red_hill_consulting/foreign_key_migrations/active_record/connection_adapters/abstract_adapter.rb +22 -0
- data/vendor/plugins/foreign_key_migrations/lib/red_hill_consulting/foreign_key_migrations/active_record/connection_adapters/table_definition.rb +28 -0
- data/vendor/plugins/redhillonrails_core/CHANGELOG +154 -0
- data/vendor/plugins/redhillonrails_core/MIT-LICENSE +20 -0
- data/vendor/plugins/redhillonrails_core/README +139 -0
- data/vendor/plugins/redhillonrails_core/init.rb +19 -0
- data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/base.rb +54 -0
- data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/abstract_adapter.rb +31 -0
- data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/column.rb +21 -0
- data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/foreign_key_definition.rb +26 -0
- data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/index_definition.rb +11 -0
- data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/mysql_adapter.rb +82 -0
- data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/mysql_column.rb +8 -0
- data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/postgresql_adapter.rb +107 -0
- data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/schema_statements.rb +23 -0
- data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/sqlite3_adapter.rb +9 -0
- data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/connection_adapters/table_definition.rb +27 -0
- data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/schema.rb +27 -0
- data/vendor/plugins/redhillonrails_core/lib/red_hill_consulting/core/active_record/schema_dumper.rb +47 -0
- metadata +290 -0
@@ -0,0 +1,87 @@
|
|
1
|
+
# == Contrôleur de gestion du mobilier urbain, Furniture.
|
2
|
+
#
|
3
|
+
# Ce contrôleur permet de :
|
4
|
+
# * lister le mobilier existant, sans permettre de le modifier pour l'instant.
|
5
|
+
# * enregistrer un nouveau mobilier.
|
6
|
+
#
|
7
|
+
# Suite à l'enregistrement d'un nouveau mobilier, ses panneaux (Panel) s'enregistreront.
|
8
|
+
class FurnituresController < ApplicationController
|
9
|
+
# Mise en page globale du site
|
10
|
+
layout "default"
|
11
|
+
|
12
|
+
# Filtre de récupération des paramètres Second Life
|
13
|
+
before_filter :get_secondlife_attrs, :only => [ :register ]
|
14
|
+
|
15
|
+
# Renvoie vers l'action 'list'
|
16
|
+
def index
|
17
|
+
list
|
18
|
+
render :action => 'list'
|
19
|
+
end
|
20
|
+
|
21
|
+
# GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
|
22
|
+
verify :method => :post, :only => [ :register ],
|
23
|
+
:redirect_to => { :action => :list }
|
24
|
+
|
25
|
+
# Liste des panneaux.
|
26
|
+
def list
|
27
|
+
@furniture_pages, @furnitures = paginate :furnitures, :per_page => 10
|
28
|
+
end
|
29
|
+
|
30
|
+
# Détail d'un panneau.
|
31
|
+
def show
|
32
|
+
@furniture = Furniture.find(params[:id])
|
33
|
+
end
|
34
|
+
|
35
|
+
# Enregistrement d'un nouveau mobilier
|
36
|
+
#
|
37
|
+
# == Input
|
38
|
+
# * Environnement Second Life transmis en HTTP
|
39
|
+
# * <tt>permanent_id=permanent_id</tt> : identifiant permanent du mobilier, s'il existe déjà
|
40
|
+
#
|
41
|
+
# +permanent_id+ est optionnel, si le mobilier n'en remplace pas un qui existait déjà.
|
42
|
+
#
|
43
|
+
# == Output
|
44
|
+
# * Le délai de mise à jour et l'identifiant permanent, sous la forme :
|
45
|
+
#
|
46
|
+
# delay=delay
|
47
|
+
# permanent_id=permanent_id
|
48
|
+
def register
|
49
|
+
# Création ou mise à jour du mobilier.
|
50
|
+
# Attention à l'astuce "slattrs.delete(:key)". Grâce à celle-ci, l'appel à
|
51
|
+
# 'update_attributes' ne reçoit que les 3 paramètres à mettre à jour, moins "key".
|
52
|
+
furniture = Furniture.find_or_initialize_by_furniture_key(@slattrs.delete(:key))
|
53
|
+
furniture.update_attributes!(@slattrs.merge({ :permanent_id => params[:permanent_id]}))
|
54
|
+
|
55
|
+
render :text => "delay=#{furniture.delay}\npermanent_id=#{furniture.permanent_id}\n",
|
56
|
+
:layout => false,
|
57
|
+
:content_type => "text/plain"
|
58
|
+
end
|
59
|
+
|
60
|
+
# Suppression d'un mobilier. Le mobilier disparaît de la base si ses panneaux ont été
|
61
|
+
# supprimés car non updatés depuis 5 fois le delay (furniture vide)
|
62
|
+
|
63
|
+
def destroy
|
64
|
+
#Panel.find(:first,:conditions => [ "furniture_id = ?", "1"])
|
65
|
+
furniture = Furniture.find(params[:id])
|
66
|
+
if panel=Panel.find(:first,:conditions => [ "furniture_id = ?", params[:id]]) == nil
|
67
|
+
render :text => "Furniture removed from database"
|
68
|
+
furniture.destroy
|
69
|
+
else
|
70
|
+
|
71
|
+
redirect_to(:action => :list)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
# Détruit tous les mobiliers qui n'ont plus de panneaux associés
|
76
|
+
def destroydead
|
77
|
+
for furniture in Furniture.find_all
|
78
|
+
for column in Furniture.content_columns
|
79
|
+
if Panel.find(:first,:conditions => [ "furniture_id = ?", params[:id]]) == nil
|
80
|
+
furniture.destroy
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
redirect_to :action => 'list'
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
@@ -0,0 +1,269 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
|
3
|
+
# == Gestion des réseaux de publicité
|
4
|
+
#
|
5
|
+
# Ce contrôleur gère les objets Network. Il permet de :
|
6
|
+
#
|
7
|
+
# * Lister les réseaux
|
8
|
+
# * Créer/supprimer des réseaux
|
9
|
+
# * Afficher et modifier le nom et le statut d'un réseau
|
10
|
+
# * Modifier les paramètres d'un réseau :
|
11
|
+
# * Texture
|
12
|
+
# * Landmark
|
13
|
+
# * Notecard
|
14
|
+
# * URL
|
15
|
+
# * Media URL
|
16
|
+
# * etc.
|
17
|
+
# * Ajouter/enlever des panneaux (Panel) d'un réseau.
|
18
|
+
class NetworksController < ApplicationController
|
19
|
+
# Mise en page globale du site
|
20
|
+
layout "default"
|
21
|
+
|
22
|
+
# Renvoie vers l'action 'list'
|
23
|
+
def index
|
24
|
+
list
|
25
|
+
render :action => 'list'
|
26
|
+
end
|
27
|
+
|
28
|
+
# GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
|
29
|
+
verify :method => :post, :only => [ :destroy, :create, :update, :set_parameters, :remove_panel, :add_panel ],
|
30
|
+
:redirect_to => { :action => :list }
|
31
|
+
|
32
|
+
# Liste des réseaux
|
33
|
+
def list
|
34
|
+
@network_pages, @networks = paginate :networks, :per_page => 10
|
35
|
+
end
|
36
|
+
|
37
|
+
# Affiche un réseau, ses caractéristiques et l'ensemble des panneaux membres.
|
38
|
+
# Affiche aussi les formulaire permettant de modifier le réseau, son paramétrage
|
39
|
+
# et sa composition.
|
40
|
+
def show
|
41
|
+
@network = Network.find(params[:id])
|
42
|
+
# La liste de tous les panneaux disponibles.
|
43
|
+
@unassigned_panels = Panel.unassigned_panels.map { |p| [ "#{p.name} (#{p.furniture.name})", p.id ]}
|
44
|
+
# On extrait les caractéristiques du réseau depuis le premier panneau
|
45
|
+
# XXX : Ceci suppose que tous les panneaux du réseau sont strictement dans la même configuration.
|
46
|
+
panel1 = @network.panels.first
|
47
|
+
if panel1
|
48
|
+
@network_parameters = OpenStruct.new(
|
49
|
+
:texture => panel1.objects_in_world.find_by_otype("texture"),
|
50
|
+
:landmark => panel1.objects_in_world.find_by_otype("landmark"),
|
51
|
+
:notecard => panel1.objects_in_world.find_by_otype("notecard"),
|
52
|
+
:url => panel1.objects_off_world.find_by_otype("url"),
|
53
|
+
:mediaurl => panel1.objects_off_world.find_by_otype("mediaurl")
|
54
|
+
)
|
55
|
+
# @network_parameters.texture_id = @network_parameters.texture.id rescue nil
|
56
|
+
# @network_parameters.landmark_id = @network_parameters.landmark.id rescue nil
|
57
|
+
# @network_parameters.notecard_id = @network_parameters.notecard.id rescue nil
|
58
|
+
# @network_parameters.url_id = @network_parameters.url.id rescue nil
|
59
|
+
# @network_parameters.mediaurl_id = @network_parameters.mediaurl.id rescue nil
|
60
|
+
#
|
61
|
+
# @textures = ObjectInWorld.find_all_by_otype("texture", :order => "name").map { |t| [ t.name, t.id ] }
|
62
|
+
# @landmarks = [ [ 'No Landmark', nil ] ] + ObjectInWorld.find_all_by_otype("landmark", :order => "name").map { |t| [ t.name, t.id ] }
|
63
|
+
# @notecards = [ [ 'No Notecard', nil ] ] + ObjectInWorld.find_all_by_otype("notecard", :order => "name").map { |t| [ t.name, t.id ] }
|
64
|
+
# @urls = [ [ 'No URL', nil ] ] + ObjectOffWorld.find_all_by_otype("url", :order => "name").map { |t| [ "#{t.name} : #{t.content}", t.id ] }
|
65
|
+
# @mediaurls = [ [ 'No Media URL', nil ] ] + ObjectOffWorld.find_all_by_otype("mediaurl", :order => "name").map { |t| [ "#{t.name} : #{t.content}", t.id ] }
|
66
|
+
else
|
67
|
+
@network_parameters = nil
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# Affiche le formulaire de modification des paramètres du réseau, en AJAX
|
72
|
+
#
|
73
|
+
# == Input
|
74
|
+
#
|
75
|
+
# * id : Network id
|
76
|
+
def show_parameters_form
|
77
|
+
@network = Network.find(params[:id])
|
78
|
+
# On extrait les caractéristiques du réseau depuis le premier panneau
|
79
|
+
# XXX : Ceci suppose que tous les panneaux du réseau sont strictement dans la même configuration.
|
80
|
+
panel1 = @network.panels.first
|
81
|
+
@network_parameters = OpenStruct.new(
|
82
|
+
:texture => panel1.objects_in_world.find_by_otype("texture"),
|
83
|
+
:landmark => panel1.objects_in_world.find_by_otype("landmark"),
|
84
|
+
:notecard => panel1.objects_in_world.find_by_otype("notecard"),
|
85
|
+
:url => panel1.objects_off_world.find_by_otype("url"),
|
86
|
+
:mediaurl => panel1.objects_off_world.find_by_otype("mediaurl")
|
87
|
+
)
|
88
|
+
@network_parameters.texture_id = @network_parameters.texture.id rescue nil
|
89
|
+
@network_parameters.landmark_id = @network_parameters.landmark.id rescue nil
|
90
|
+
@network_parameters.notecard_id = @network_parameters.notecard.id rescue nil
|
91
|
+
@network_parameters.url_id = @network_parameters.url.id rescue nil
|
92
|
+
@network_parameters.mediaurl_id = @network_parameters.mediaurl.id rescue nil
|
93
|
+
|
94
|
+
@textures = ObjectInWorld.find_all_by_otype("texture", :order => "name").map { |t| [ t.name, t.id ] }
|
95
|
+
@landmarks = [ [ 'No Landmark', nil ] ] + ObjectInWorld.find_all_by_otype("landmark", :order => "name").map { |t| [ t.name, t.id ] }
|
96
|
+
@notecards = [ [ 'No Notecard', nil ] ] + ObjectInWorld.find_all_by_otype("notecard", :order => "name").map { |t| [ t.name, t.id ] }
|
97
|
+
@urls = [ [ 'No URL', nil ] ] + ObjectOffWorld.find_all_by_otype("url", :order => "name").map { |t| [ "#{t.name} : #{t.content}", t.id ] }
|
98
|
+
@mediaurls = [ [ 'No Media URL', nil ] ] + ObjectOffWorld.find_all_by_otype("mediaurl", :order => "name").map { |t| [ "#{t.name} : #{t.content}", t.id ] }
|
99
|
+
end
|
100
|
+
|
101
|
+
# Formulaire de création d'un nouveau réseau.
|
102
|
+
def new
|
103
|
+
@network = Network.new
|
104
|
+
end
|
105
|
+
|
106
|
+
# Création d'un nouveau réseau vide.
|
107
|
+
#
|
108
|
+
# == Input
|
109
|
+
#
|
110
|
+
# * <tt>network[]</tt> : Paramètres de création du réseau
|
111
|
+
def create
|
112
|
+
@network = Network.new(params[:network])
|
113
|
+
if @network.save
|
114
|
+
flash[:notice] = 'Network was successfully created.'
|
115
|
+
redirect_to :action => 'show', :id => @network
|
116
|
+
else
|
117
|
+
render :action => 'new'
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
# Formulaire d'édition d'un réseau.
|
122
|
+
#
|
123
|
+
# == Input
|
124
|
+
#
|
125
|
+
# * +id+ : Network id
|
126
|
+
def edit
|
127
|
+
@network = Network.find(params[:id])
|
128
|
+
end
|
129
|
+
|
130
|
+
# Edition d'un réseau.
|
131
|
+
#
|
132
|
+
# == Input
|
133
|
+
#
|
134
|
+
# * +id+ : Network id
|
135
|
+
def update
|
136
|
+
@network = Network.find(params[:id])
|
137
|
+
if @network.update_attributes(params[:network])
|
138
|
+
flash[:notice] = 'Network was successfully updated.'
|
139
|
+
redirect_to :action => 'show', :id => @network
|
140
|
+
else
|
141
|
+
render :action => 'edit'
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
# Suppression d'un réseau.
|
146
|
+
#
|
147
|
+
# Tous les panneaux membres du réseau deviennent disponibles.
|
148
|
+
#
|
149
|
+
# == Input
|
150
|
+
#
|
151
|
+
# * +id+ : Network id
|
152
|
+
def destroy
|
153
|
+
network = Network.find(params[:id])
|
154
|
+
network.destroy
|
155
|
+
flash[:notice] = "Network '#{network.name}' deleted."
|
156
|
+
redirect_to :action => 'list'
|
157
|
+
end
|
158
|
+
|
159
|
+
# Modifie les paramètres du réseau et de ses panneaux :
|
160
|
+
#
|
161
|
+
# * Texture
|
162
|
+
# * Notecard
|
163
|
+
# * Landmark
|
164
|
+
# * URL
|
165
|
+
# * Media URL
|
166
|
+
# * etc.
|
167
|
+
#
|
168
|
+
# La liste des ObjectInWold et ObjectOffWorld est dans les constantes TYPES
|
169
|
+
# définies dans chacun des deux modèles.
|
170
|
+
#
|
171
|
+
# Les paramètres sont fournis par l'action 'show'.
|
172
|
+
#
|
173
|
+
# == Input
|
174
|
+
#
|
175
|
+
# * +id+ : Network id
|
176
|
+
def set_parameters
|
177
|
+
network = Network.find(params[:id])
|
178
|
+
|
179
|
+
# liste des panneaux à mettre à jour
|
180
|
+
panels = network.panels
|
181
|
+
# Messages à afficher
|
182
|
+
messages = []
|
183
|
+
|
184
|
+
# Traitement Texture, Landmark et Notecard (et autres)
|
185
|
+
ObjectInWorld::TYPES.each do |obj_type|
|
186
|
+
obj_id = params[:network_parameters]["#{obj_type}_id".intern]
|
187
|
+
# Si obj_id est une chaîne vide, alors il faut supprimer l'association avec ce type d'objet
|
188
|
+
# uniquement. Sinon il faut aussi le remplacer dans le nouvel objet.
|
189
|
+
obj = ObjectInWorld.find(obj_id) rescue nil
|
190
|
+
obj_name = obj ? obj.name : 'None'
|
191
|
+
panels.each do |p|
|
192
|
+
# On simule les expressions de type "p.texture = obj" avec 'send'
|
193
|
+
p.send("#{obj_type}=", obj)
|
194
|
+
end
|
195
|
+
messages << "#{obj_type.humanize} set to '%s'." % obj_name
|
196
|
+
end
|
197
|
+
|
198
|
+
# Traitement URL, Media URL, etc
|
199
|
+
ObjectOffWorld::TYPES.collect { |t| t.last }.each do |obj_type|
|
200
|
+
obj_id = params[:network_parameters]["#{obj_type}_id".intern]
|
201
|
+
# Si obj_id est une chaîne vide, alors il faut supprimer l'association avec ce type d'objet
|
202
|
+
# uniquement. Sinon il faut aussi le remplacer dans le nouvel objet.
|
203
|
+
obj = ObjectOffWorld.find(obj_id) rescue nil
|
204
|
+
obj_name = obj ? obj.name : 'None'
|
205
|
+
panels.each do |p|
|
206
|
+
# On simule les expressions de type "p.url = obj" avec 'send'
|
207
|
+
p.send("#{obj_type}=", obj)
|
208
|
+
end
|
209
|
+
messages << "#{obj_type.humanize} set to '%s'." % obj_name
|
210
|
+
end
|
211
|
+
|
212
|
+
if messages.empty?
|
213
|
+
flash[:notice] = "Network not modified"
|
214
|
+
else
|
215
|
+
panels.each { |p| p.save! }
|
216
|
+
flash[:notice] = messages.join(" ")
|
217
|
+
end
|
218
|
+
redirect_to :action => 'show', :id => network
|
219
|
+
end
|
220
|
+
|
221
|
+
# Enlève un panneau d'un réseau, sans le supprimer.
|
222
|
+
#
|
223
|
+
# == Input
|
224
|
+
#
|
225
|
+
# * +id+ : Network id
|
226
|
+
# * Variable POST +panel_id+ : Panel id
|
227
|
+
def remove_panel
|
228
|
+
network = Network.find(params[:id])
|
229
|
+
panel = network.panels.find(params[:panel_id])
|
230
|
+
network.panels.delete(panel)
|
231
|
+
flash[:notice] = "Panel '#{panel.name} : #{panel.furniture.name}' removed from network."
|
232
|
+
redirect_to :action => 'show', :id => network
|
233
|
+
rescue ActiveRecord::RecordNotFound
|
234
|
+
flash[:notice] = "Remove panel: Invalid network id ('#{params[:id]}') or panel id ('#{params[:panel_id]}')."
|
235
|
+
redirect_to :action => 'list'
|
236
|
+
end
|
237
|
+
|
238
|
+
# Ajoute un panneau dans un réseau.
|
239
|
+
#
|
240
|
+
# == Input
|
241
|
+
#
|
242
|
+
# * Variable POST +panel_id+
|
243
|
+
def add_panel
|
244
|
+
network = Network.find(params[:id])
|
245
|
+
panel = Panel.find(params[:panel_id])
|
246
|
+
# On n'ajoute pas un panneau déjà membre d'un autre réseau
|
247
|
+
if panel.network.nil?
|
248
|
+
# Si le réseau a déjà des panneaux, donc des caractéristiques, il faut les appliquer
|
249
|
+
# au nouveau panneau
|
250
|
+
reference_panel = network.panels.first
|
251
|
+
if reference_panel
|
252
|
+
panel.texture = reference_panel.texture
|
253
|
+
panel.notecard = reference_panel.notecard
|
254
|
+
panel.landmark = reference_panel.landmark
|
255
|
+
panel.url = reference_panel.url
|
256
|
+
panel.mediaurl = reference_panel.mediaurl
|
257
|
+
end
|
258
|
+
# Et maintenant on ajoute le panneau au réseau
|
259
|
+
network.panels << panel
|
260
|
+
flash[:notice] = "Panel '#{panel.name} : #{panel.furniture.name}' added to network."
|
261
|
+
else
|
262
|
+
flash[:notice] = "Panel '#{panel.name} : #{panel.furniture.name}' already belongs to a network ('#{panel.network.name}')."
|
263
|
+
end
|
264
|
+
redirect_to :action => 'show', :id => network
|
265
|
+
rescue ActiveRecord::RecordNotFound
|
266
|
+
flash[:notice] = "Add panel: Invalid network id ('#{params[:id]}') or panel id ('#{params[:panel_id]}')."
|
267
|
+
redirect_to :action => 'list'
|
268
|
+
end
|
269
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# == Contrôleur de gestion des ObjectInWorld
|
2
|
+
#
|
3
|
+
# Ce contrôleur liste les ObjectInWorld.
|
4
|
+
class ObjectsInWorldController < ApplicationController
|
5
|
+
# Mise en page globale du site
|
6
|
+
layout "default"
|
7
|
+
|
8
|
+
# Renvoie vers l'action 'list'
|
9
|
+
def index
|
10
|
+
list
|
11
|
+
render :action => 'list'
|
12
|
+
end
|
13
|
+
|
14
|
+
# GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
|
15
|
+
verify :method => :post, :only => [ :destroy, :create, :update ],
|
16
|
+
:redirect_to => { :action => :list }
|
17
|
+
|
18
|
+
# Liste des ObjectInWorld
|
19
|
+
def list
|
20
|
+
@object_in_world_pages, @objects_in_world = paginate :objects_in_world, :per_page => 10
|
21
|
+
end
|
22
|
+
|
23
|
+
# Détail d'un ObjectInWorld
|
24
|
+
def show
|
25
|
+
@object_in_world = ObjectInWorld.find(params[:id])
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,186 @@
|
|
1
|
+
# == Gestion des panneaux
|
2
|
+
#
|
3
|
+
# Ce contrôleur gère les panneaux (Panel). Il permet de :
|
4
|
+
#
|
5
|
+
# * Liste les panneaux
|
6
|
+
# * Enregistrer un nouveau panneau depuis SL
|
7
|
+
# * Mettre à jour un panneau depuis SL
|
8
|
+
# * Enregistrer le clic d'un avatar dans SL et lui envoyer URL ou Media URL
|
9
|
+
class PanelsController < ApplicationController
|
10
|
+
# Mise en page globale du site
|
11
|
+
layout "default"
|
12
|
+
|
13
|
+
# Filtre de récupération des paramètres Second Life
|
14
|
+
before_filter :get_secondlife_attrs, :only => [ :register, :update, :avtouch ]
|
15
|
+
|
16
|
+
# Affiche l'index, par défaut la liste des panneaux
|
17
|
+
def index
|
18
|
+
list
|
19
|
+
render :action => 'list'
|
20
|
+
end
|
21
|
+
|
22
|
+
# GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html)
|
23
|
+
verify :method => :post, :only => [ :register ],
|
24
|
+
:redirect_to => { :action => :list }
|
25
|
+
|
26
|
+
# Liste des panneauxs disponibles
|
27
|
+
def list
|
28
|
+
@panel_pages, @panels = paginate :panels, :per_page => 10
|
29
|
+
end
|
30
|
+
|
31
|
+
# Affiche le détail d'un panneau
|
32
|
+
def show
|
33
|
+
@panel = Panel.find(params[:id])
|
34
|
+
end
|
35
|
+
|
36
|
+
# Enregistrement d'un nouveau panneau
|
37
|
+
#
|
38
|
+
# == Input
|
39
|
+
# * Environnement Second Life transmis en HTTP
|
40
|
+
# * +furniture_key+:: Clé SL du mobilier possédant ce panneau
|
41
|
+
#
|
42
|
+
# == Output
|
43
|
+
# * Le délai de mise à jour, sous la forme :
|
44
|
+
#
|
45
|
+
# delay=delay
|
46
|
+
def register
|
47
|
+
# Quel est le mobilier parent ?
|
48
|
+
furniture_key = params[:furniture_key]
|
49
|
+
furniture = Furniture.find_by_furniture_key(furniture_key)
|
50
|
+
if furniture.nil?
|
51
|
+
render :text => "The furniture id '#{furniture_key}' does not exist.",
|
52
|
+
:status => "409 Undefined furniture '#{furniture_key}'",
|
53
|
+
:layout => false,
|
54
|
+
:content_type => "text/plain"
|
55
|
+
return
|
56
|
+
end
|
57
|
+
# Création ou mise à jour du panneau
|
58
|
+
panel = Panel.find_or_initialize_by_panel_key(@slattrs[:key])
|
59
|
+
panel.furniture = furniture
|
60
|
+
panel.update_attributes!(:name => @slattrs[:name])
|
61
|
+
|
62
|
+
render :text => "delay=%#{furniture.delay}%",
|
63
|
+
:layout => false,
|
64
|
+
:content_type => "text/plain"
|
65
|
+
end
|
66
|
+
|
67
|
+
# Mise à jour du panel
|
68
|
+
#
|
69
|
+
# == Input
|
70
|
+
# * Environnement Second Life transmis en HTTP
|
71
|
+
#
|
72
|
+
# == Output
|
73
|
+
# * Le délai de mise à jour, la texture, l'url, la media url sous la forme suivante avec un attribut par ligne :
|
74
|
+
#
|
75
|
+
# delay=delay
|
76
|
+
# texture=texture_key
|
77
|
+
# url=url
|
78
|
+
# mediaurl=mediaurl
|
79
|
+
#
|
80
|
+
# Quand il n'y a pas d'URL ou de Media URL, le contenu envoyé est respectivement +nourl+ ou +nomedia+.
|
81
|
+
def update
|
82
|
+
# Mise à jour du panel
|
83
|
+
panel = Panel.find_by_panel_key(@slattrs[:key])
|
84
|
+
if panel.nil?
|
85
|
+
render :text => "The panel id '#{@slattrs[:key]}' does not exist.",
|
86
|
+
:status => "409 Undefined panel '#{@slattrs[:key]}'",
|
87
|
+
:layout => false,
|
88
|
+
:content_type => "text/plain"
|
89
|
+
return
|
90
|
+
end
|
91
|
+
# Trouve la texture associée
|
92
|
+
texture = panel.texture.object_key
|
93
|
+
# Trouve les URL et Media URL associées, ou une valeur par défaut
|
94
|
+
url = if (obj = panel.url)
|
95
|
+
obj.content
|
96
|
+
else "nourl" end
|
97
|
+
mediaurl = if (obj = panel.mediaurl)
|
98
|
+
obj.content
|
99
|
+
else "nomedia" end
|
100
|
+
|
101
|
+
# Construit et envoie la réponse
|
102
|
+
panel_response = [ ["delay", panel.furniture.delay],
|
103
|
+
["texture", texture],
|
104
|
+
["url", url],
|
105
|
+
["mediaurl", mediaurl] ].map { |pair| "#{pair[0]}=#{pair[1]}" }.join("\n")
|
106
|
+
render :text => panel_response,
|
107
|
+
:layout => false,
|
108
|
+
:content_type => "text/plain"
|
109
|
+
end
|
110
|
+
|
111
|
+
# Un avatar clique sur le panel
|
112
|
+
#
|
113
|
+
# == Input
|
114
|
+
# * Environnement Second Life transmis en HTTP
|
115
|
+
# * +avatar_key+ : Clé SL de l'avatar qui a cliqué
|
116
|
+
#
|
117
|
+
# == Output
|
118
|
+
# * Le serveur envoie 1 ou 2 mails à des containers pour qu'ils envoient à leur tour
|
119
|
+
# un landmark et/ou une notecard à l'avatar.
|
120
|
+
def avtouch
|
121
|
+
# Récupère le panel, l'avatar, la notecard, le landmark
|
122
|
+
panel = Panel.find_by_panel_key(@slattrs[:key])
|
123
|
+
if panel.nil?
|
124
|
+
render :text => "The panel id '#{@slattrs[:key]}' does not exist.",
|
125
|
+
:status => "409 Undefined panel '#{@slattrs[:key]}'",
|
126
|
+
:layout => false,
|
127
|
+
:content_type => "text/plain"
|
128
|
+
return
|
129
|
+
end
|
130
|
+
if !(avatar_key = params[:avatar_key])
|
131
|
+
render :text => "Missing avatar key.",
|
132
|
+
:status => "409 Missing avatar key",
|
133
|
+
:layout => false,
|
134
|
+
:content_type => "text/plain"
|
135
|
+
return
|
136
|
+
end
|
137
|
+
# Trouve les landmark et notecard associés, ou une valeur par défaut
|
138
|
+
landmark = panel.landmark
|
139
|
+
notecard = panel.notecard
|
140
|
+
|
141
|
+
# On envoie successivement un mail pour landmark et un pour notecard,
|
142
|
+
# mais uniquement s'il y a quelque chose à envoyer (!= nil).
|
143
|
+
[ landmark, notecard ].each do |obj|
|
144
|
+
Mailer.deliver_avtouch(obj.container.container_key,
|
145
|
+
avatar_key,
|
146
|
+
obj.name) if obj
|
147
|
+
end
|
148
|
+
# Fini
|
149
|
+
render :text => "Objects sent.",
|
150
|
+
:layout => false,
|
151
|
+
:content_type => "text/plain"
|
152
|
+
end
|
153
|
+
|
154
|
+
# Si le panneau n'a pas donné signe de vie depuis 5 fois le délais prévu
|
155
|
+
# on le supprime de la base
|
156
|
+
def destroy
|
157
|
+
# On récupère le delay du furniture associé
|
158
|
+
panel = Panel.find(params[:id])
|
159
|
+
delay = Furniture.find(panel.furniture.id).delay
|
160
|
+
updated_time = panel.updated_at + 5 * delay * 60
|
161
|
+
# Si la date actuelle est > à date du updated_at + 5xdelay (également présent dans la vue)
|
162
|
+
#
|
163
|
+
# on affiche le bouton de suppression
|
164
|
+
if updated_time < Time::now
|
165
|
+
# On sauve dans la table revision
|
166
|
+
# save_to_revision_table
|
167
|
+
panel.destroy
|
168
|
+
end
|
169
|
+
redirect_to :action => 'list'
|
170
|
+
end
|
171
|
+
|
172
|
+
# Détruit tous les panneaux qui n'ont pas contacté le serveur
|
173
|
+
# depuis 5 x le delay
|
174
|
+
def destroydead
|
175
|
+
for panel in Panel.find_all
|
176
|
+
for column in Panel.content_columns
|
177
|
+
if (panel.updated_at + 5 * Furniture.find(panel.furniture.id).delay * 60) < Time.now
|
178
|
+
panel.destroy
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
redirect_to :action => 'list'
|
183
|
+
end
|
184
|
+
|
185
|
+
end
|
186
|
+
|