1 | # -*- coding: utf-8 -*- |
---|
2 | ################################################################################# |
---|
3 | # @file setup.py |
---|
4 | # @brief Controller for properties setup |
---|
5 | # @warning None |
---|
6 | # @note Use: None |
---|
7 | # @license GNU GPLv3+ |
---|
8 | # @author David Fuertes, EUPT, University of Zaragoza. |
---|
9 | # @version 1.1.0 - First version |
---|
10 | # @date 2019-15-11 |
---|
11 | ################################################################################# |
---|
12 | from threading import current_thread |
---|
13 | import json |
---|
14 | |
---|
15 | import gluon |
---|
16 | |
---|
17 | from ados import adoDB_users, adoDB_services, adoDB_openRlabs_setup, adoDB_timetable, adoDB_prereserves |
---|
18 | from ognsys import Ognsys |
---|
19 | from lab import Lab |
---|
20 | |
---|
21 | from prereserves import PreReserve |
---|
22 | |
---|
23 | |
---|
24 | |
---|
25 | @auth.requires_membership('admin') |
---|
26 | def index(): |
---|
27 | if request.vars.error: |
---|
28 | return {'error': 'Error de comunicación con el servidor de opengnsys. Por favor, compruebe la configuración.'} |
---|
29 | else: |
---|
30 | return {'error': 'null'} |
---|
31 | |
---|
32 | @auth.requires_membership('admin') |
---|
33 | def openrlabs(): |
---|
34 | setups = adoDB_openRlabs_setup.getSetup_OpenRLabs(db) |
---|
35 | if setups: |
---|
36 | form = SQLFORM(adoDB_openRlabs_setup.getSetup_OpenRLabs_table(db), setups) |
---|
37 | else: |
---|
38 | form = SQLFORM(adoDB_openRlabs_setup.getSetup_OpenRLabs_table(db)) |
---|
39 | |
---|
40 | if form.process().accepted: |
---|
41 | response.flash = 'form accepted' |
---|
42 | redirect(URL('setup','index')) |
---|
43 | elif form.errors: |
---|
44 | response.flash = 'form has errors' |
---|
45 | |
---|
46 | return dict(form=form) |
---|
47 | |
---|
48 | @auth.requires_membership('admin') |
---|
49 | def auth_setup(): |
---|
50 | setups = adoDB_openRlabs_setup.getSetup_OpenRLabs(db) |
---|
51 | |
---|
52 | if setups: |
---|
53 | table_auth_values = adoDB_openRlabs_setup.get_auth_method_values(setups['auth_mode'], db) |
---|
54 | |
---|
55 | if setups['auth_mode'] == 'pop3_servers': |
---|
56 | form = SQLFORM.grid(db.pop3_servers, |
---|
57 | csv=False, maxtextlength=500, |
---|
58 | details=False, deletable=False, paginate = 10) |
---|
59 | |
---|
60 | else: |
---|
61 | if table_auth_values: |
---|
62 | form = SQLFORM(db[setups['auth_mode']], table_auth_values) |
---|
63 | else: |
---|
64 | form = SQLFORM(db[setups['auth_mode']],) |
---|
65 | |
---|
66 | |
---|
67 | if isinstance(form, gluon.sqlhtml.SQLFORM): |
---|
68 | if form.process().accepted: |
---|
69 | response.flash = 'form accepted' |
---|
70 | redirect(URL('setup','index')) |
---|
71 | elif form.errors: |
---|
72 | response.flash = 'form has errors' |
---|
73 | |
---|
74 | return dict(form=form) |
---|
75 | |
---|
76 | ####### |
---|
77 | ## Ajax |
---|
78 | ####### |
---|
79 | @auth.requires_membership('admin') |
---|
80 | def get_images_lab(): |
---|
81 | if request.vars['lab_id'] != '': |
---|
82 | current_lab = Lab(request.vars['ou_id'],request.vars['lab_id']) |
---|
83 | clients = current_lab.get_remote_clients() |
---|
84 | if 'error' in clients: |
---|
85 | return json.dumps({'error': 'Error conexión al obtener imagenes del laboratorio. Reintentelo de nuevo.'}) |
---|
86 | else: |
---|
87 | return json.dumps(clients['images_info']) |
---|
88 | |
---|
89 | def __delete_prereserve(table, id): |
---|
90 | prereserve_db = adoDB_prereserves.get_prereserve_by_id(db, id) |
---|
91 | if prereserve_db: |
---|
92 | prereserve = PreReserve(db, prereserve_db) |
---|
93 | prereserve.remove() |
---|
94 | |
---|
95 | |
---|
96 | @auth.requires_membership('admin') |
---|
97 | def prereserves(): |
---|
98 | |
---|
99 | opengnsys = Ognsys(db) |
---|
100 | |
---|
101 | labs = opengnsys.get_labs() |
---|
102 | labs_set = {} |
---|
103 | max_hosts_lab = {} |
---|
104 | lab_ous = {} |
---|
105 | for ou_name, labs_ou in labs.items(): |
---|
106 | for lab in labs_ou: |
---|
107 | if 'id' in lab: |
---|
108 | current_lab = Lab(lab['ou']['id'],lab['id']) |
---|
109 | total_clients = current_lab.get_total_clients() |
---|
110 | labs_set.update({lab['id'] : lab['name'] + ' (' + ou_name + ')'}) |
---|
111 | max_hosts_lab.update({lab['id'] : total_clients }) |
---|
112 | lab_ous.update({lab['id'] : lab['ou']['id'] }) |
---|
113 | |
---|
114 | adoDB_prereserves.set_readable_id(db, False) |
---|
115 | |
---|
116 | if request.args: |
---|
117 | if request.args[0] == 'new': |
---|
118 | adoDB_prereserves.set_requires_lab_id(db, labs_set) |
---|
119 | adoDB_prereserves.set_requires_image_name(db) |
---|
120 | |
---|
121 | |
---|
122 | grid = SQLFORM.grid(adoDB_prereserves.get_query_reserves(db), |
---|
123 | csv=False, maxtextlength=500, ondelete=__delete_prereserve, |
---|
124 | details=False, deletable=True, paginate = 10) |
---|
125 | |
---|
126 | if request.args: |
---|
127 | |
---|
128 | if request.args[0] == 'new' or request.args[0] == 'edit': |
---|
129 | |
---|
130 | lab_name_input = grid.element('#pre_reserves_lab_name') |
---|
131 | |
---|
132 | grid.element('#pre_reserves_num_reserves')['_type'] = "number" |
---|
133 | grid.element('#pre_reserves_num_reserves')['_min'] = "1" |
---|
134 | |
---|
135 | |
---|
136 | grid.element('#pre_reserves_init_time')['_required'] = "required" |
---|
137 | #grid.element('#pre_reserves_init_time')['_type'] = "datetime-local" |
---|
138 | grid.element('#pre_reserves_finish_time')['_required'] = "required" |
---|
139 | #grid.element('#pre_reserves_finish_time')['_type'] = "datetime-local" |
---|
140 | grid.element('#pre_reserves_finish_time')['_onchange'] = "check_min_finish_time(event)" |
---|
141 | |
---|
142 | grid.element('#pre_reserves_lab_name')['_readonly'] = 'readonly' |
---|
143 | grid.element('#pre_reserves_lab_id')['_onchange'] = 'set_lab_name(event)' |
---|
144 | |
---|
145 | grid.element('#pre_reserves_ou_id__row')['_style'] = "display: none;" |
---|
146 | |
---|
147 | grid.element('#pre_reserves_image_name')['_onchange'] = 'set_image_id(event)' |
---|
148 | grid.element('#pre_reserves_image_id__row')['_style'] = "display: none;" |
---|
149 | |
---|
150 | |
---|
151 | |
---|
152 | if request.args[0] == 'edit': |
---|
153 | grid.element('#pre_reserves_lab_id__row')['_style'] = "display: none;" |
---|
154 | grid.element('#delete_record__row')['_style'] = "display: none;" |
---|
155 | |
---|
156 | |
---|
157 | return dict(grid=grid, max_hosts_lab=max_hosts_lab, |
---|
158 | lab_ous=lab_ous) |
---|
159 | |
---|
160 | @auth.requires_membership('admin') |
---|
161 | def ous(): |
---|
162 | opengnsys = Ognsys(db) |
---|
163 | opengnsys.synchronize_table_ous(db) |
---|
164 | |
---|
165 | grid = SQLFORM.grid(opengnsys.get_query_ous(db),fields=[db.ous_setup.ou_name, db.ous_setup.ou_user], |
---|
166 | csv=False, maxtextlength=500, |
---|
167 | details=False, deletable=False, paginate = 10) |
---|
168 | |
---|
169 | return dict(grid=grid) |
---|
170 | |
---|
171 | @auth.requires_membership('admin') |
---|
172 | def fileimport(): |
---|
173 | if request.vars.fichero != None: |
---|
174 | # Check vars.fichero is FieldStorage |
---|
175 | if isinstance(request.vars.fichero, bytes) == False: |
---|
176 | resultado = import_users.insert(request.vars.fichero.value, db) |
---|
177 | response.flash = resultado |
---|
178 | |
---|
179 | return {} |
---|
180 | |
---|
181 | @auth.requires_membership('admin') |
---|
182 | def manage(): |
---|
183 | if request.args and request.args[0] == 'edit': |
---|
184 | if adoDB_users.is_admin(db, request.args[2]): |
---|
185 | adoDB_users.enable_passwd_readable(db) |
---|
186 | else: |
---|
187 | adoDB_users.disable_passwd_readable(db) |
---|
188 | |
---|
189 | |
---|
190 | |
---|
191 | export_classes = dict(json=False, html=False, |
---|
192 | tsv=False, xml=False, csv_with_hidden_cols=False, |
---|
193 | tsv_with_hidden_cols=False) |
---|
194 | |
---|
195 | selectable = lambda ids : redirect(URL('setup', 'remove_selected_users', vars=dict(ids=ids))) |
---|
196 | |
---|
197 | grid = SQLFORM.grid(adoDB_users.get_users(db), exportclasses=export_classes, |
---|
198 | fields=[db.auth_user.first_name, db.auth_user.last_name, db.auth_user.email], |
---|
199 | selectable=selectable, |
---|
200 | details=False, paginate = 10) |
---|
201 | |
---|
202 | |
---|
203 | heading=grid.elements('th') |
---|
204 | |
---|
205 | if heading: |
---|
206 | heading[0].append(INPUT(_type='checkbox', |
---|
207 | _onclick="jQuery('input[type=checkbox]').each(function(k){jQuery(this).prop('checked', \ |
---|
208 | !jQuery(this).prop('checked'));});")) |
---|
209 | heading[0].append(LABEL('Select', |
---|
210 | _style="margin-bottom: 0; margin-left: 2px; \ |
---|
211 | font-size: 0.8em; font-weight: normal; \ |
---|
212 | vertical-align: top;")) |
---|
213 | |
---|
214 | |
---|
215 | form = grid.element('.web2py_form') |
---|
216 | if form: |
---|
217 | password_input = form.element('input',_id='auth_user_password') |
---|
218 | if password_input: |
---|
219 | password_input['_type'] = 'text' |
---|
220 | |
---|
221 | |
---|
222 | return dict(grid=grid) |
---|
223 | |
---|
224 | @auth.requires_membership('admin') |
---|
225 | def remove_selected_users(): |
---|
226 | user_ids = [] |
---|
227 | if isinstance(request.vars.ids, list): |
---|
228 | user_ids = request.vars.ids |
---|
229 | else: |
---|
230 | user_ids.append(request.vars.ids) |
---|
231 | |
---|
232 | adoDB_users.remove_users(db, user_ids) |
---|
233 | redirect(URL('setup', 'manage', vars=dict())) |
---|
234 | |
---|
235 | @auth.requires_membership('admin') |
---|
236 | def enable(): |
---|
237 | grid = SQLFORM.grid(adoDB_users.get_users_menbership(db), csv=False, |
---|
238 | details=False, paginate = 10) |
---|
239 | |
---|
240 | return dict(grid=grid) |
---|
241 | |
---|
242 | @auth.requires_membership('admin') |
---|
243 | def services(): |
---|
244 | grid = SQLFORM.grid(adoDB_services.get_services_query(db), csv=False, |
---|
245 | details=False, paginate = 10) |
---|
246 | |
---|
247 | return dict(grid=grid) |
---|
248 | |
---|
249 | @auth.requires_membership('admin') |
---|
250 | def timetable(): |
---|
251 | opengnsys = Ognsys(db) |
---|
252 | |
---|
253 | labs = opengnsys.get_labs() |
---|
254 | labs_set = {} |
---|
255 | for ou_name, labs_ou in labs.items(): |
---|
256 | for lab in labs_ou: |
---|
257 | if 'id' in lab: |
---|
258 | labs_set.update({lab['id'] : lab['name'] + ' (' + ou_name + ')'}) |
---|
259 | |
---|
260 | adoDB_timetable.set_requires(db, labs_set) |
---|
261 | |
---|
262 | grid = SQLFORM.grid(adoDB_timetable.get_timetable_query(db), maxtextlength=500, |
---|
263 | fields = [db.labs_timetable.lab_name, |
---|
264 | db.labs_timetable.Init_Day, db.labs_timetable.End_Day, |
---|
265 | db.labs_timetable.Init_time,db.labs_timetable.End_time, db.labs_timetable.cod_asign], |
---|
266 | orderby=db.labs_timetable.lab_name,csv=False, details=False, paginate = 10) |
---|
267 | |
---|
268 | |
---|
269 | if request.args: |
---|
270 | if request.args[0] == 'new' or request.args[0] == 'edit': |
---|
271 | lab_name_input = grid.element('#labs_timetable_lab_name') |
---|
272 | |
---|
273 | grid.element('#labs_timetable_lab_name')['_readonly'] = 'readonly' |
---|
274 | grid.element('#labs_timetable_lab_id')['_onchange'] = 'set_lab_name(event)' |
---|
275 | |
---|
276 | |
---|
277 | |
---|
278 | return dict(grid=grid) |
---|
279 | |
---|