gestion 1.9.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (233) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +48 -0
  3. data/.project +14 -0
  4. data/Binaries/adduser_to_buzz +15 -0
  5. data/Binaries/backup +7 -0
  6. data/Binaries/check_gestion +8 -0
  7. data/Binaries/gestion.gnumail +22 -0
  8. data/Binaries/gestion.logrotate +34 -0
  9. data/Binaries/gestion.service +12 -0
  10. data/Binaries/gestion_update.rb +183 -0
  11. data/Binaries/gestion_update.service +10 -0
  12. data/Binaries/get_compta +11 -0
  13. data/Binaries/kill_gestion +16 -0
  14. data/Binaries/ldap/add_indexes +51 -0
  15. data/Binaries/ldap/backup +2 -0
  16. data/Binaries/ldap/install_ldap +92 -0
  17. data/Binaries/ldap/restore +7 -0
  18. data/Binaries/lib_backup +5 -0
  19. data/Binaries/log_scan_errors +8 -0
  20. data/Binaries/loop_gestion +64 -0
  21. data/Binaries/onetimers/sync_courses_from_compta.rb +74 -0
  22. data/Binaries/onetimers/transfer_cash_from_ldap_to_csv +26 -0
  23. data/Binaries/reboot +5 -0
  24. data/Binaries/restore +3 -0
  25. data/Binaries/restore_do +22 -0
  26. data/Binaries/sort_events +31 -0
  27. data/Binaries/start_gestion +18 -0
  28. data/Binaries/swipe_gestion +18 -0
  29. data/Binaries/update_africompta +21 -0
  30. data/Binaries/update_users +3 -0
  31. data/Diplomas.src/accredited.odg +0 -0
  32. data/Diplomas.src/diploma.odg +0 -0
  33. data/Diplomas.src/label.odg +0 -0
  34. data/Diplomas.src/presence_sheet.ods +0 -0
  35. data/Diplomas.src/presence_sheet_small.ods +0 -0
  36. data/Diplomas.src/student_card.odg +0 -0
  37. data/Doc/130514-it-ideas.odt +0 -0
  38. data/Doc/Compta-cash.mm +179 -0
  39. data/Doc/General.odt +0 -0
  40. data/Entities/AccessGroups.rb +117 -0
  41. data/Entities/Activity.rb +178 -0
  42. data/Entities/ChatMsg.rb +142 -0
  43. data/Entities/Classroom.rb +11 -0
  44. data/Entities/Client.rb +19 -0
  45. data/Entities/Computer.rb +21 -0
  46. data/Entities/ConfigBase.rb +280 -0
  47. data/Entities/Course.rb +1588 -0
  48. data/Entities/CourseType.rb +171 -0
  49. data/Entities/DFiles.rb +466 -0
  50. data/Entities/FilesManage.rb +226 -0
  51. data/Entities/Grade.rb +186 -0
  52. data/Entities/Internet.rb +300 -0
  53. data/Entities/Netdev.rb +10 -0
  54. data/Entities/Person.rb +1175 -0
  55. data/Entities/Plug.rb +98 -0
  56. data/Entities/Quiz.rb +33 -0
  57. data/Entities/Recharges.rb +37 -0
  58. data/Entities/Report.rb +136 -0
  59. data/Entities/Room.rb +12 -0
  60. data/Entities/SMS.rb +30 -0
  61. data/Entities/ScheduleType.rb +33 -0
  62. data/Entities/Share.rb +120 -0
  63. data/Entities/Task.rb +51 -0
  64. data/Entities/Ticket.rb +72 -0
  65. data/Entities/Usage.rb +143 -0
  66. data/Entities/Worker.rb +29 -0
  67. data/Files/apache-profeda.conf +36 -0
  68. data/Files/label.erb +121 -0
  69. data/Files/label_notfound.erb +64 -0
  70. data/Files/label_notpassed.erb +84 -0
  71. data/Files/mobileinfo.erb +115 -0
  72. data/Files/smb.conf +333 -0
  73. data/Files/timetable.html +36 -0
  74. data/Files/timetable.js +239 -0
  75. data/Gemfile +12 -0
  76. data/Gemfile.dev +12 -0
  77. data/Gemfile.dev.lock +127 -0
  78. data/Gemfile.lock +127 -0
  79. data/Gemfile.prod +8 -0
  80. data/Gestion +35 -0
  81. data/Gestion.rb +220 -0
  82. data/INSTALL +40 -0
  83. data/Images/connection.xcf +0 -0
  84. data/Images/connection_no.png +0 -0
  85. data/Images/connection_wait.png +0 -0
  86. data/Images/connection_yes.png +0 -0
  87. data/Paths/Exas.rb +13 -0
  88. data/Paths/Files.rb +19 -0
  89. data/Paths/GetDiplomas.rb +20 -0
  90. data/Paths/Info.rb +114 -0
  91. data/Paths/Label.rb +187 -0
  92. data/Paths/MobileInfo.rb +19 -0
  93. data/Paths/internetCash.rb +34 -0
  94. data/Paths/internetWifi.rb +54 -0
  95. data/README.md +60 -0
  96. data/Rakefile +13 -0
  97. data/TODO +1391 -0
  98. data/Test/.gitignore +3 -0
  99. data/Test/Diplomas/base_gestion.odt +0 -0
  100. data/Test/Diplomas/base_report.odt +0 -0
  101. data/Test/Diplomas/carte_etudiant.odg +0 -0
  102. data/Test/Diplomas/exam_language.odt +0 -0
  103. data/Test/Diplomas/label.odg +0 -0
  104. data/Test/Diplomas/presence_sheet.ods +0 -0
  105. data/Test/Diplomas/presence_sheet_small.ods +0 -0
  106. data/Test/Diplomas/student_card.odg +0 -0
  107. data/Test/Manual/testMerge +18 -0
  108. data/Test/config_test.yaml +26 -0
  109. data/Test/db.testGestion +0 -0
  110. data/Test/dfiles/descs/avg-rescue.desc +10 -0
  111. data/Test/dfiles/descs/avg.desc +8 -0
  112. data/Test/dfiles/descs/driver.desc +8 -0
  113. data/Test/dfiles/descs/linuxmint.desc +7 -0
  114. data/Test/dfiles/files/avg-160203.exe +1 -0
  115. data/Test/dfiles/files/avg.iso +1 -0
  116. data/Test/dfiles/files/driver.exe +1 -0
  117. data/Test/dfiles/index_post.html +3 -0
  118. data/Test/dfiles/index_pre.html +8 -0
  119. data/Test/dfiles/priorities +5 -0
  120. data/Test/ge_activity.rb +124 -0
  121. data/Test/ge_chat.rb +106 -0
  122. data/Test/ge_compta.rb +67 -0
  123. data/Test/ge_configbase.rb +54 -0
  124. data/Test/ge_course.rb +1114 -0
  125. data/Test/ge_dfiles.rb +121 -0
  126. data/Test/ge_filesmanage.rb +180 -0
  127. data/Test/ge_info.rb +27 -0
  128. data/Test/ge_internet.rb +246 -0
  129. data/Test/ge_login.rb +55 -0
  130. data/Test/ge_person.rb +373 -0
  131. data/Test/ge_qvinfo.rb +28 -0
  132. data/Test/ge_report.rb +97 -0
  133. data/Test/ge_share.rb +27 -0
  134. data/Test/ge_sms.rb +34 -0
  135. data/Test/ge_tasks.rb +19 -0
  136. data/Test/ge_usage.rb +168 -0
  137. data/Test/ge_view.rb +46 -0
  138. data/Test/multiconf-captive +29 -0
  139. data/Test/test.conf +7 -0
  140. data/Test/test.rb +49 -0
  141. data/Test/test_bytes.png +0 -0
  142. data/VERSION +140 -0
  143. data/Views/Admin/Backup.rb +91 -0
  144. data/Views/Admin/Configuration.rb +44 -0
  145. data/Views/Admin/Credit.rb +32 -0
  146. data/Views/Admin/FilesManage.rb +219 -0
  147. data/Views/Admin/Function.rb +39 -0
  148. data/Views/Admin/Power.rb +49 -0
  149. data/Views/Admin/Printer.rb +37 -0
  150. data/Views/Admin/Server.rb +252 -0
  151. data/Views/Admin/Tabs.rb +5 -0
  152. data/Views/Admin/Update.rb +73 -0
  153. data/Views/Admin/UpdateSystem.rb +26 -0
  154. data/Views/Cashbox/Activity.rb +191 -0
  155. data/Views/Cashbox/Course.rb +141 -0
  156. data/Views/Cashbox/Credit.rb +79 -0
  157. data/Views/Cashbox/Report.rb +115 -0
  158. data/Views/Cashbox/Service.rb +105 -0
  159. data/Views/Cashbox/Tabs.rb +10 -0
  160. data/Views/Compta/Accounts.rb +36 -0
  161. data/Views/Compta/Course.rb +96 -0
  162. data/Views/Compta/Show.rb +6 -0
  163. data/Views/Compta/Transfer.rb +66 -0
  164. data/Views/Course/Diploma.rb +203 -0
  165. data/Views/Course/Grade.rb +401 -0
  166. data/Views/Course/Modify.rb +447 -0
  167. data/Views/Course/Print.rb +94 -0
  168. data/Views/Course/Responsible.rb +44 -0
  169. data/Views/Course/Stats.rb +76 -0
  170. data/Views/Course/Students.rb +92 -0
  171. data/Views/Course/Tabs.rb +220 -0
  172. data/Views/Internet/Access.rb +134 -0
  173. data/Views/Internet/ClassEdit.rb +24 -0
  174. data/Views/Internet/ClassUsers.rb +81 -0
  175. data/Views/Internet/Config.rb +32 -0
  176. data/Views/Internet/Mobile.rb +213 -0
  177. data/Views/Internet/Recharges.rb +49 -0
  178. data/Views/Internet/Tabs.rb +6 -0
  179. data/Views/Inventory/Computer.rb +24 -0
  180. data/Views/Inventory/Room.rb +18 -0
  181. data/Views/Inventory/Tabs.rb +9 -0
  182. data/Views/Inventory/TicketClosed.rb +7 -0
  183. data/Views/Inventory/TicketOpen.rb +23 -0
  184. data/Views/Library/Person.rb +36 -0
  185. data/Views/Library/Tabs.rb +7 -0
  186. data/Views/Network/Block.rb +87 -0
  187. data/Views/Network/Netdevs.rb +21 -0
  188. data/Views/Network/Restriction.rb +37 -0
  189. data/Views/Network/Share.rb +167 -0
  190. data/Views/Network/Tables.rb +28 -0
  191. data/Views/Network/Tabs.rb +6 -0
  192. data/Views/Person/Admin.rb +99 -0
  193. data/Views/Person/Center.rb +48 -0
  194. data/Views/Person/Course.rb +72 -0
  195. data/Views/Person/Modify.rb +153 -0
  196. data/Views/Person/Tabs.rb +162 -0
  197. data/Views/Report/ComptaExecutive.rb +221 -0
  198. data/Views/Report/ComptaFlat.rb +79 -0
  199. data/Views/Report/ReportCourse.rb +47 -0
  200. data/Views/Report/Tabs.rb +8 -0
  201. data/Views/Report/Usage.rb +52 -0
  202. data/Views/Report/UsageCases.rb +59 -0
  203. data/Views/Self/Cash.rb +67 -0
  204. data/Views/Self/Chat.rb +55 -0
  205. data/Views/Self/Concours.rb +109 -0
  206. data/Views/Self/Email.rb +34 -0
  207. data/Views/Self/Internet.rb +255 -0
  208. data/Views/Self/Results.rb +17 -0
  209. data/Views/Self/Services.rb +85 -0
  210. data/Views/Self/Show.rb +47 -0
  211. data/Views/Self/Tabs.rb +5 -0
  212. data/Views/Special/DFileEdit.rb +13 -0
  213. data/Views/Special/PlugEdit.rb +56 -0
  214. data/Views/Special/Tabs.rb +6 -0
  215. data/Views/Special/Vnc.rb +39 -0
  216. data/Views/Task/Client.rb +21 -0
  217. data/Views/Task/Edit.rb +33 -0
  218. data/Views/Task/List.rb +55 -0
  219. data/Views/Task/Tabs.rb +9 -0
  220. data/Views/Task/Worker.rb +30 -0
  221. data/Views/Template/Activity.rb +33 -0
  222. data/Views/Template/CourseType.rb +63 -0
  223. data/Views/Template/ScheduleType.rb +29 -0
  224. data/Views/Template/Tabs.rb +5 -0
  225. data/Views/Welcome.rb +121 -0
  226. data/config.yaml.default +36 -0
  227. data/po/Gestion-ar.po +2356 -0
  228. data/po/Gestion-en.mo +0 -0
  229. data/po/Gestion-en.po +4363 -0
  230. data/po/Gestion-fr.mo +0 -0
  231. data/po/Gestion-fr.po +4345 -0
  232. data/po/traduction-ar.rtf +76 -0
  233. metadata +381 -0
@@ -0,0 +1,167 @@
1
+ class NetworkShare < View
2
+ include VTListPane
3
+
4
+ def layout
5
+ set_data_class :Shares
6
+
7
+ @order = 50
8
+ @update = true
9
+ @functions_need = [:share]
10
+
11
+ @samba = Entities.Statics.get(:NetworkSamba)
12
+ if @samba.data_str.class != Hash
13
+ dputs(4) { "Oups - samba is #{@samba.data_str.inspect}" }
14
+ @samba.data_str = {}
15
+ end
16
+
17
+ gui_vbox :nogroup do
18
+ gui_hbox do
19
+ gui_vbox :nogroup do
20
+ vtlp_list :shares, :name
21
+ show_button :new, :delete
22
+ end
23
+ gui_vbox :nogroup do
24
+ show_block :config, :width => 200
25
+ show_button :share_save, :change_path, :add_htaccess
26
+ end
27
+ gui_vbox :nogroup do
28
+ show_list_single :users, :width => 200
29
+ show_button :no_access, :read_write, :read_only
30
+ end
31
+ end
32
+ gui_hbox :nogroup do
33
+ gui_vbox :nogroup do
34
+ show_str :domain, :width => 200
35
+ show_str :hostname
36
+ show_button :samba_save
37
+ end
38
+ gui_vbox :nogroup do
39
+ end
40
+ end
41
+
42
+ gui_window :msg do
43
+ show_html :msg_txt
44
+ show_button :close
45
+ end
46
+ end
47
+ end
48
+
49
+ def users_update(session)
50
+ if session and (share_str = session.s_data[:share])
51
+ users = Persons.search_by_groups('share')
52
+ share = Shares.match_by_share_id(share_str)
53
+ dputs(3) { "Users is #{users.inspect} and share is #{share.inspect}" }
54
+ if users and share
55
+ dputs(3) { "Acl of #{share.name} is #{share.acl.inspect}" }
56
+ share.acl.collect { |k, v|
57
+ if user = Persons.match_by_login_name(k)
58
+ users.delete(user)
59
+ access = v == 'ro' ? 'read-only' : 'read-write'
60
+ name = user.full_name
61
+ name.to_s == 0 and name = user.login_name
62
+ [k, "#{name}: #{access}"]
63
+ else
64
+ nil
65
+ end
66
+ }.compact.sort { |a, b| a[1] <=> b[1] } +
67
+ users.collect { |u|
68
+ [u.login_name, u.full_name]
69
+ }.sort { |a, b| a[1] <=> b[1] }
70
+ else
71
+ return []
72
+ end
73
+ else
74
+ return []
75
+ end
76
+ end
77
+
78
+ alias_method :rpc_list_choice_old, :rpc_list_choice
79
+
80
+ def rpc_list_choice(session, name, *args)
81
+ dputs(3) { "rpc_list_choice with #{name} - #{args.inspect}" }
82
+ if name == @vtlp_field
83
+ session.s_data[:share] = args[0][name][0]
84
+ dputs(4) { "session.s_data is #{session.s_data.inspect}" }
85
+ end
86
+ rpc_list_choice_old(session, name, args[0])
87
+ end
88
+
89
+
90
+ def rpc_update(session)
91
+ dputs(4) { "Updating samba: #{users_update(session)}" }
92
+ show_users = reply(:hide, :users)
93
+ begin
94
+ if (share_id = session.s_data[:share]) and
95
+ (Shares.match_by_share_id(share_id).public == ['No'])
96
+ show_users = reply(:unhide, :users)
97
+ end
98
+ rescue NoMethodError
99
+ end
100
+ reply(:empty, [:users]) +
101
+ reply(:update,
102
+ :users => users_update(session)) +
103
+ %w( domain hostname ).collect { |d|
104
+ reply(:update, d => @samba.data_str[d])
105
+ }.flatten +
106
+ show_users
107
+ end
108
+
109
+ def rpc_button(session, name, data)
110
+ case name
111
+ when /no_access|read_write|read_only/
112
+ if (user = Persons.match_by_login_name(data['users'][0])) and
113
+ (share = Shares.match_by_share_id(data['shares'][0]))
114
+ case name
115
+ when /no_access/
116
+ share.acl.delete user.login_name
117
+ when /read_write/
118
+ share.acl[user.login_name] = 'rw'
119
+ when /read_only/
120
+ share.acl[user.login_name] = 'ro'
121
+ end
122
+ dputs(4) { "Share.acl is #{share.acl.inspect}" }
123
+ session.s_data[:share] = data['shares'][0]
124
+ else
125
+ return reply(:window_show, :msg) +
126
+ reply(:update, :msg_txt => 'First choose a share<br>' +
127
+ 'then a user')
128
+ end
129
+ rpc_update(session)
130
+ when /new/
131
+ rpc_button_new(session, data) +
132
+ reply(:hide, :users)
133
+ else
134
+ super(session, name, data)
135
+ end
136
+ end
137
+
138
+ def rpc_button_share_save(session, data)
139
+ ret = rpc_button_save(session, data) +
140
+ rpc_button_samba_save(session, data)
141
+ end
142
+
143
+ def rpc_button_close(session, data)
144
+ reply(:window_hide)
145
+ end
146
+
147
+ def rpc_button_samba_save(session, data)
148
+ %w( domain hostname ).each { |d|
149
+ dputs(4) { "Saving -#{d}- for -#{@samba.data_str.inspect}-" }
150
+ store = data[d] ? data[d] : d
151
+ @samba.data_str[d] = store
152
+ }
153
+ dputs(4) { "@samba is now -#{@samba.data_str.inspect}-" }
154
+
155
+ Shares.save_config(@samba.data_str['domain'])
156
+ return []
157
+ end
158
+
159
+ def rpc_button_add_htaccess(session, data)
160
+ share = Shares.find_by_share_id(data['shares'][0])
161
+ dputs(3) { "Working with #{share}" }
162
+
163
+ share.add_htaccess
164
+ end
165
+
166
+ end
167
+
@@ -0,0 +1,28 @@
1
+ class NetworkTables < View
2
+ def layout
3
+ set_data_class :ConfigBases
4
+ #@visible = false
5
+ @order = 100
6
+ @update = true
7
+ @functions_need = [:network]
8
+
9
+ gui_vbox do
10
+ show_block :captive
11
+ show_arg :prerouting, :width => 300
12
+ show_button :save_costs
13
+ end
14
+ end
15
+
16
+ def rpc_button_save_costs(session, data)
17
+ ConfigBase.data_set_hash(data)
18
+ ConfigBase.send_config
19
+ end
20
+
21
+ def update(session)
22
+ ConfigBase.to_hash
23
+ end
24
+
25
+ def rpc_update(session)
26
+ super
27
+ end
28
+ end
@@ -0,0 +1,6 @@
1
+ class NetworkTabs < View
2
+ def layout
3
+ @order = 55
4
+ @functions_need = [:network]
5
+ end
6
+ end
@@ -0,0 +1,99 @@
1
+ # Allows to add, modify and delete persons
2
+
3
+ class PersonAdmin < View
4
+ def layout
5
+ set_data_class :Persons
6
+ @update = true
7
+ @order = 30
8
+
9
+ gui_vboxg do
10
+ gui_group do
11
+ gui_hboxg :nogroup do
12
+ gui_hboxg :nogroup do
13
+ gui_fields do
14
+ show_str_ro :login_name
15
+ show_str_ro :person_id
16
+ show_block :admin
17
+ show_arg :permissions, :flexheight => 1
18
+ end
19
+ end
20
+ gui_vbox :nogroup do
21
+ gui_vbox :nogroup do
22
+ show_field :groups
23
+ end
24
+ end
25
+ end
26
+ show_button :save
27
+ end
28
+
29
+ gui_window :win_error do
30
+ show_html :err_html
31
+ show_entity_person :centers, :drop, :full_name, :width => 200
32
+ show_button :chose
33
+ end
34
+ end
35
+ end
36
+
37
+ def rpc_button_save(session, data)
38
+ dputs(3) { "#{data.inspect}" }
39
+ person = Persons.match_by_person_id(data._person_id)
40
+ rep = reply(:empty_nonlists)
41
+ if person
42
+ log_msg :persons, "#{session.owner.login_name} saves #{data.inspect}"
43
+ Persons.save_data(data)
44
+ person.update_accounts
45
+ if (centers = Persons.search_by_permissions(:center)).count > 1 &&
46
+ !ConfigBase.has_function?(:course_server)
47
+ centers_name = centers.collect { |p| p.listp_full_name }
48
+ rep += reply(:window_show, :win_error) +
49
+ reply(:update, :err_html => "<p>There can't be more than one center<br>" +
50
+ 'in the database. Please chose one') +
51
+ reply(:empty, :centers) +
52
+ reply(:update, :centers => centers_name)
53
+ end
54
+ rep += update_form_data(person)
55
+ end
56
+ rep + rpc_update(session)
57
+ end
58
+
59
+ def rpc_button_chose(session, data)
60
+ Persons.search_by_permissions(:center).each { |p|
61
+ dputs(2) { "Comparing #{p} with #{data._centers}" }
62
+ if p != data._centers
63
+ p.permissions -= ['center']
64
+ end
65
+ }
66
+ person = Persons.match_by_person_id(data._person_id)
67
+ reply(:window_hide) +
68
+ reply(:empty_nonlists) +
69
+ update_form_data(person)
70
+ end
71
+
72
+ def rpc_find(session, field, data)
73
+ rep = Persons.find(field, data)
74
+ if not rep
75
+ rep = {"#{field}" => data}
76
+ end
77
+ update_layout(session) +
78
+ reply(:update, rep) + rpc_update(session)
79
+ end
80
+
81
+ def rpc_list_choice(session, name, data)
82
+ if name == 'persons'
83
+ dputs(2) { "Got data: #{data.inspect}" }
84
+ if p = Persons.match_by_login_name(data['persons'].flatten[0])
85
+ #reply( :empty_nonlists, [:internet_none] ) +
86
+ reply(:empty_nonlists, [:permissions, :groups]) +
87
+ reply(:update, :permissions => Permission.list.sort) +
88
+ reply(:update, :groups => eval(Persons.get_value(:groups).list)) +
89
+ reply(:update, p)
90
+ end
91
+ end
92
+ end
93
+
94
+ def update(session)
95
+ if ConfigBase.has_function? :accounting
96
+ {:your_account_total_due => session.owner.account_total_due}
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,48 @@
1
+ # Some special, restricted administration-things for a center-director
2
+
3
+ class PersonCenter < View
4
+ def layout
5
+ set_data_class :Persons
6
+ @update = true
7
+ @order = 40
8
+ @functions_need = [:course_server]
9
+
10
+ gui_vbox do
11
+ gui_hbox :nogroup do
12
+ show_str_ro :login_name
13
+ show_str_ro :person_id
14
+ show_field :role_diploma
15
+ show_list :permissions, "%w( teacher center_director )"
16
+ show_button :save
17
+ end
18
+ end
19
+ end
20
+
21
+ def reply_person( p )
22
+ reply( :empty_nonlists, [:permissions] ) +
23
+ reply( :update, :permissions => %w( teacher center_director ) ) +
24
+ reply( :update, :login_name => p.login_name, :person_id => p.person_id,
25
+ :role_diploma => p.role_diploma,
26
+ :permissions => p.permissions & %w( teacher center_director ) )
27
+ end
28
+
29
+ def rpc_button_save( session, data )
30
+ person = Persons.match_by_person_id( data['person_id'] )
31
+ if person
32
+ log_msg :persons, "#{session.owner.login_name} saves #{data.inspect}"
33
+ person.role_diploma = data._role_diploma
34
+ person.permissions = person.permissions - %w( teacher center_director ) +
35
+ data._permissions
36
+ reply_person( person )
37
+ end
38
+ end
39
+
40
+ def rpc_list_choice( session, name, data )
41
+ if name == "persons"
42
+ dputs( 2 ){ "Got data: #{data.inspect}" }
43
+ if p = Persons.match_by_login_name( data['persons'].flatten[0])
44
+ reply_person( p )
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,72 @@
1
+ # Allows to add, modify and delete persons
2
+
3
+ class PersonCourse < View
4
+ def layout
5
+ set_data_class :Persons
6
+ @update = true
7
+ @order = 45
8
+ @functions_need = [:courses]
9
+
10
+ gui_vbox do
11
+ show_str_ro :first_name
12
+ show_str_ro :family_name
13
+ show_list_single :courses, :maxheight => 150
14
+ show_button :add, :delete
15
+
16
+ gui_window :new_course do
17
+ show_list_single :courses_available, 'Entities.Courses.list_courses',
18
+ :maxheight => 150
19
+ show_button :add_course, :close
20
+ end
21
+ end
22
+ end
23
+
24
+ def rpc_update( session )
25
+ reply( :empty_nonlists, [:courses] )
26
+ end
27
+
28
+ def rpc_list_choice( session, name, args )
29
+ dputs( 3 ){ "args is #{args.inspect}" }
30
+ ret = reply( :empty_nonlists, [:courses] )
31
+ if name == "persons" and args['persons']
32
+ p = Entities.Persons.match_by_login_name( args['persons'].flatten[0] )
33
+ if p
34
+ ret += reply( :update, :courses => Entities.Courses.list_courses_for_person( p ) ) +
35
+ update_form_data( p )
36
+ end
37
+ end
38
+ ret
39
+ end
40
+
41
+ def rpc_button_add( session, args )
42
+ if args['persons'].flatten.length > 0
43
+ reply( :empty, [ :courses_available ] ) +
44
+ reply( :update, :courses_available =>
45
+ ( Entities.Courses.list_courses -
46
+ Entities.Courses.list_courses_for_person( args['persons'].flatten[0] ) ) ) +
47
+ reply( :window_show, :new_course )
48
+ end
49
+ end
50
+
51
+ def rpc_button_delete( session, args )
52
+ if ca = args['courses'] and ca.length > 0
53
+ c = Entities.Courses.match_by_id( ca[0] )
54
+ c.students.delete( args['persons'].flatten[0] )
55
+ end
56
+ rpc_list_choice( session, 'persons', args )
57
+ end
58
+
59
+ def rpc_button_add_course( session, args )
60
+ if ca = args['courses_available'] and ca.length > 0
61
+ c = Entities.Courses.match_by_id( ca[0] )
62
+ c.students_add args['persons'].flatten[0]
63
+ end
64
+ reply( :window_hide ) +
65
+ rpc_list_choice( session, 'persons', args )
66
+ end
67
+
68
+ def rpc_button_close( session, args )
69
+ reply( :window_hide )
70
+ end
71
+
72
+ end
@@ -0,0 +1,153 @@
1
+ # Allows to add, modify and delete persons
2
+
3
+ class PersonModify < View
4
+ include PrintButton
5
+
6
+ def layout
7
+ set_data_class :Persons
8
+ @update = true
9
+ @order = 10
10
+
11
+ gui_hbox do
12
+ gui_vbox do
13
+ gui_fields do
14
+ show_str_ro :login_name, :width => 150
15
+ show_str_ro :person_id
16
+ show_block :address
17
+ end
18
+ gui_hbox :nogroup do
19
+ show_button :save, :print
20
+ end
21
+ end
22
+
23
+ gui_vbox :nogroup do
24
+ show_str :new_password
25
+ show_str_ro :password_plain
26
+ show_html :not_allowed
27
+ show_button :change_password
28
+ end
29
+
30
+ gui_window :printing do
31
+ show_html :msg_print
32
+ show_button :next_page, :close
33
+ end
34
+
35
+ gui_window :print_choice do
36
+ show_print :print_student
37
+ show_print :print_library
38
+ show_print :print_responsible
39
+ show_button :close
40
+ end
41
+ end
42
+ end
43
+
44
+ def rpc_button(session, name, data)
45
+ dputs(3) { "Pressed button #{name} with #{data.inspect}" }
46
+ person = Persons.match_by_person_id(data['person_id'])
47
+
48
+ rep = []
49
+ owner = session.owner
50
+ if person
51
+ case name
52
+ when 'change_password'
53
+ if owner.has_all_rights_of(person) ||
54
+ (owner.permissions.index(:center) &&
55
+ person.login_name =~ /^#{owner.login_name}_/)
56
+ person.password = data['new_password']
57
+ rep = reply(:empty, [:new_password]) +
58
+ reply(:update, :password_plain => person.password_plain)
59
+ end
60
+ when 'save'
61
+ log_msg :persons, "#{session.owner.login_name} saves #{data.inspect}"
62
+ rep = reply(:update, Persons.save_data(data))
63
+ when 'print_student', 'print_library', 'print_responsible'
64
+ rep = reply(:window_hide) +
65
+ rpc_print(session, name, data)
66
+ files = ''
67
+ case name
68
+ when 'print_student'
69
+ person.lp_cmd = nil
70
+ files = OpenPrint.pdf_nup_duplex(person.print, 'student_cards')
71
+ when 'print_library'
72
+ files = ActivityPayments.active_for(person).first.print
73
+ when 'print_responsible'
74
+ person.lp_cmd = nil
75
+ files = person.print(:responsible)
76
+ end
77
+ if lpr = cmd_printer(session, name)
78
+ rep += reply(:window_show, :printing) +
79
+ reply(:unhide, :next_page) +
80
+ reply(:update, :msg_print => 'Printing front page')
81
+ System.run_bool("#{lpr} #{files[0]}")
82
+ session.s_data._person_page = files
83
+ else
84
+ rep += reply(:window_show, :printing) +
85
+ reply(:update, :msg_print => 'Click to download:<ul>' +
86
+ files.to_a.collect { |file|
87
+ "<li><a target='other' href=\"#{file}\">#{file}</a></li>" }.join +
88
+ '</ul>') +
89
+ reply(:hide, :next_page)
90
+ end
91
+ when 'next_page'
92
+ System.run_bool("#{cmd_printer(session, :print_student)} #{session.s_data._person_page[1]}")
93
+ rep += reply(:update, :msg_print => 'Printing back page') +
94
+ reply(:hide, :next_page)
95
+ when 'close'
96
+ rep += reply(:window_hide)
97
+ when 'print'
98
+ rep += reply(:window_show, :print_choice) +
99
+ reply_visible(ActivityPayments.active_for(person).size > 0, :print_library) +
100
+ reply_visible(person.is_responsible?, :print_responsible)
101
+ end
102
+ end
103
+
104
+ rep + rpc_update(session)
105
+ end
106
+
107
+ def rpc_find(session, field, data)
108
+ rep = Persons.find(field, data)
109
+ if not rep
110
+ rep = {"#{field}" => data}
111
+ end
112
+ update_layout(session) +
113
+ reply(:update, rep) + rpc_update(session)
114
+ end
115
+
116
+ def rpc_list_choice(session, name, data)
117
+ if name == 'persons'
118
+ dputs(3) { "Got data: #{data.inspect}" }
119
+ if data['persons'][0] and
120
+ p = Persons.match_by_login_name(data._persons.flatten[0])
121
+ can_change = p.show_password?(session.owner) ||
122
+ session.owner.has_permission?(:director)
123
+ change_pwd =
124
+ reply_one_two(can_change,
125
+ %i(new_password password_plain change_password), :not_allowed) +
126
+ reply_visible(p.show_password?(session.owner), :password_plain) +
127
+ reply(:update, :not_allowed => "<b>Vous n'avez pas le droit<br>" +
128
+ 'de changer ce mot de passe</b>')
129
+ dputs(4) { "change_pwd is #{change_pwd.inspect}" }
130
+ reply(:empty_nonlists) + reply(:update, p) +
131
+ reply(:update, update(session)) +
132
+ reply(:focus, :credit_add) + reply_print(session) + change_pwd
133
+ end
134
+ end
135
+ end
136
+
137
+ def update(session)
138
+ if person = session.owner
139
+ if ConfigBase.has_function? :accounting
140
+ {:your_account_total_due => person.account_total_due}
141
+ end
142
+ end
143
+ end
144
+
145
+ def rpc_update(session)
146
+ super(session) +
147
+ reply(:parent, reply(:focus, :search)) +
148
+ reply_print(session) +
149
+ (session.owner.permissions.index('center') ?
150
+ reply(:hide, :print_student) : [])
151
+ end
152
+
153
+ end