gestion 1.9.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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