def index(self, id_system=None): u"""Инициализируем параметры системы, в которую вошли. """ #запрет кэширования index cherrypy.response.headers["Expires"] = "Mon, 26 Jul 1997 05:00:00 GMT" #Date in the past cherrypy.response.headers["Last-Modified"] = "Mon, 26 Jul 1997 05:00:00 GMT" #always modified cherrypy.response.headers["Cache-Control"] = "no-cache, must-revalidate" # HTTP/1.1 cherrypy.response.headers["Pragma"] = "no-cache" # HTTP/1.0 if id_system is None: id_system = getattr(self, 'id_system', None) if id_system is None: id_system = si.get_id_system() if id_system is not None: #проверяем на отключенность систему dis=db.dbExec(sql="select DISABLED " "from ENGINE_SYSTEMS " "where id_system=? ", params=(id_system,), fetch='one', id_system=-1) #print "" #print "INDEX: dis=", dis #print "" #no that system if not dis: #print "" #print "INDEX: gotoIndex. dis=", dis #print "" #return cpu.goToIndex() return cpu.goToError('Подсистема не найдена либо отключена.') if dis['DISABLED']: #print "dis['DISABLED']=", dis['DISABLED'] return cpu.goToError('Подсистема временно недоступна.') #raise cherrypy.HTTPRedirect("/exception?exception="+ # "Система временно недоступна. Попробуйте зайти сюда позже. А пока можно вернуться <a href='javascript:history.back()'>Назад</a>") #self.setSesVar("id_system",id_system) self.setIfaceVar("id_system", id_system) #обновляем сессию, если только система - не список терминальных/мобильных интерфейсов if si.get_full_ref_name_by_id_system(id_system) not in (getattr(cfg, 'TERMINAL_link', None), getattr(cfg, 'MOBILE_link', None)): error_msg = sessions.session_update(uid=self.getUserVar('uid'), fio=self.getUserVar('userfio'), equip_kind=cpu.equipKind(), ip_addr=cpu.get_remote_ip(if_proxy='client'), user_agent=cpu.getUserAgent(), id_system=id_system) # ошибка обновления сессии if error_msg: cpu.cherrypylog(error_msg, context='APP.SESSIONS') #return self.drawTemplate(templ=login_index, data=[{'mes': error_msg}, {'langs': cpu.getConfigLangs()}], draw_wo_login=True) if not cpu.isPC(): return cpu.goToError(error_msg) so.create_sys_options(self.__module__, cfg.options_instances_subdir) """d=db.dbExec(sql="select SHOW_NAME,
def index(self, filepath): "корневой метод для маппинга дерева подсистем (нельзя вызывать явно)" path, fname = os.path.split(filepath) # fname= fname.encode('windows-1251') # path= path.encode('windows-1251') # блок безопасности # проверим, что скачивание привязано к сессии (т.е. юзер хотя бы залогинен) uid = getUserVar('uid') if not uid: return goToError(error_code[0] % fname) # теперь проверим, пренадлежит ли файл этой учетной записи # получим uid-префикс из имени файла fuid = self.split_path_to_uid(path) # если он не пустой, но не равен сессионному -валим эксепшн (если же пустой, значит загрузка общая и не привязана к сессии) if fuid and str(uid) != str(fuid): return goToError(error_code[1] % fname) # проверка на доступность файла для скачивания if not os.path.isfile(filepath): return goToError(error_code[2] % fname) return serve_file(filepath, "application/x-download", "attachment")
def sec(): pi = cherrypy.request.path_info if pi[-1] == '/': pi_n = pi[:-1] # w/o slash else: pi_n = pi rcr = cpu.get_class_ref() #pyDumps not works here! if pi_n not in grantAccessRefs and not is_static_resource(pi): if cpu.getUserVar('uid') is None: return cpu.goToIndex(mes=_('Сессия утеряна!')) #print "entered pi_n=", pi_n, cpu.getUserVar('granted_system_refs') if rcr not in cpu.getUserVar('granted_system_refs') \ and not (rcr.startswith('/ENGINE/METRICS') and '/ENGINE/METRICS' in cpu.getUserVar('granted_system_refs')) \ and not pi_n.endswith('/exception') and not cpu.getUserVar('is_superadmin'): #print "blocked pi_n=", pi_n return cpu.goToError( _('У Вас нет прав на доступ к ресурсу либо ресурс отсутствует' )) #print "passed pi_n=", pi_n #если отключаем систему, то при каждом запросе смотрим поле ENGINE_SYSTEMS.DISABLED #print "pi_n=", pi_n, "rcr=", rcr if hc.get_disabled() and not pi_n.endswith('/exception'): #если disabled непуст, то смотрим детально sysinfo = si.get_mapped_sysinfo(rcr) if len(sysinfo) and hc.get_disabled(sysinfo['id_system']): return cpu.goToError( _('Подсистема временно недоступна.' ))
def default(self, *args, **kwargs): logmes = "!!! RNF: " + cherrypy.request.path_info #reduce(lambda x, y: x+'/'+y, args, "") cpu.cherrypylog(logmes) if len(args) == 0: print "default: unknown resource not found, len(args)==0, path=%s" % cherrypy.request.path_info return cpu.goToError('Неизвестный ресурс %s не найден. Проверьте правильность ссылки.' % cherrypy.request.path_info, from_root=True) #return cpu.goToIndex() if not secure.is_static_resource(args[len(args)-1]): print "default: not static resource not found %s:" % cherrypy.request.path_info return cpu.goToError('Ресурс %s не найден. Проверьте правильность ссылки.' % cherrypy.request.path_info, from_root=True)
def repository(self, dirname): if hasattr(cfg, 'upd_conf_location'): upd_conf = pu.importer(cfg.upd_conf_location) if hasattr(upd_conf, 'unzip_path'): cat = os.path.join(upd_conf.unzip_path, "modules") else: return cpu.goToError( 'В конфигурационном файле ' + cfg.upd_conf_location + ' отстутсвует параметр unzip_path') else: return cpu.goToError( 'Отстутсвует параметр конфигурации upd_conf_location' ) return dirname[len(cat):]
def login(self, username='', password='', mes='', first_time=0, pwd_is_hash='0'): u"""Аутентификация. Возвращает html-код с ошибкой, списком систем или редиректит в зависимости от результата вызова self.draw_system_list. Если задан параметр mes, выводится сообщение об ошибке в форме логина. Также проверяется на заполненность параметр username, чтобы уменьшить обращения к БД. """ if mes != '': return self.drawTemplate(templ=login_index,data=[{'mes':mes, 'username': username}, {'langs': cpu.getConfigLangs()}], draw_wo_login=True) if username == '': return self.drawTemplate(templ=login_index,data=[{'mes': _('Введите логин')}, {'langs': cpu.getConfigLangs()}], draw_wo_login=True) #При 1-м входе пароль не нужен #if password == '': # return self.drawTemplate(templ=login_index,data=[{'mes':'Введите пароль', 'username': username}], draw_wo_login=True) # if password == '': # return self.drawTemplate(templ=login_index,data=[{'mes':'Введите пароль'}], draw_wo_login=True) result = self.draw_system_list(username=username, password=password, first_time=first_time, pwd_is_hash=pwd_is_hash) if result['REDIRECT_CODE'] == 0: return cpu.HTTPRedirect(result['REDIRECT_DATA']) if result['REDIRECT_CODE'] == 1: return result['REDIRECT_DATA'] if result['REDIRECT_CODE'] == 2: return cpu.goToError(result['REDIRECT_DATA'])
def analyseUpdateFile(self, file7z_location, id_update): if hasattr(cfg, 'upd_conf_location'): upd_conf = pu.importer(cfg.upd_conf_location) if hasattr(upd_conf, 'unzip_path'): cat = upd_conf.unzip_path else: return cpu.goToError( 'В конфигурационном файле ' + cfg.upd_conf_location + ' отстутсвует параметр unzip_path') else: return cpu.goToError( 'Отстутсвует параметр конфигурации upd_conf_location' ) #cat='c:/tmp' pu.mk_dir(cat) path_to = cat #ensure(mk_dir(path_to)) analyseable = False #shutil.rmtree(path_to,False) self.clear_dir(path_to) err = zipErrors[os.system( ('7z x -y %s -o%s ') % (file7z_location, path_to))] if (len(err) == 0): analyseable = True else: analyseable = False if (analyseable == True): modules_success = [] modules_error = [] module_exten = (".css", ".js", ".py", ".tmpl") for dirs, subdirs, files in os.walk( os.path.join(path_to, "modules")): for file in files: if str(file).endswith(".css") or str(file).endswith(".js") or str(file).endswith(".py") or \ str(file).endswith(".tmpl"): dbRes = db.dbExec(sql="select * from UPD_MODULESINSERT(?,?,?)", params=[id_update,\ file, self.repository(dirs)], fetch="one", id_system=-1)['RES'] if (dbRes == '0'): modules_error.append(file) else: modules_success.append(file) sql_success = [] sql_error = [] for dirs, subdirs, files in os.walk(os.path.join(path_to, "sql")): for file in files: dbRes = db.dbExec(sql="select * from UPD_SQLFILEINSERT(?,?)", params=[id_update,str(file)],\ fetch="one", id_system=-1) if (dbRes['RES'] == "1"): sql_success.append(str(file)) f = open(os.path.join(dirs, file)) filetext = f.read() #meta_proc = self.analyseSql(f.read(),"procedure") self.insertToSqlMeta( self.analyseSql(filetext, "procedure"), "procedure", dbRes['ID_SQLFILE']) self.insertToSqlMeta( self.analyseSql(filetext, "table"), "table", dbRes['ID_SQLFILE']) self.insertToSqlMeta( self.analyseSql(filetext, "trigger"), "trigger", dbRes['ID_SQLFILE']) f.close() else: sql_error.append(str(file)) #shutil.rmtree(path_to,False) self.clear_dir(path_to)
class Updater(BasePage): #, TCommon): def index(self, id_system=None): BasePage.index(self, id_system) #raise cherrypy.HTTPRedirect('users') #return self.users() - если так, то при F5 чистится сессия, т.к. вызывается self.index bases = db.dbExec( sql= 'select B.ID_BASE, B.DBALIAS, B.SHOW_NAME, S.IP from UPD_BASES B ' ' left join SERVERS S on S.ID_SERVER=B.ID_SERVER ' 'order by B.ORDERBY ', params=(), fetch='all', id_system=-1) bases['datalist_bases'] = bases['datalist'] del bases['datalist'] modules = db.dbExec( sql= 'select M.ID_MODULES, M.MALIAS, M.SHOW_NAME, S.IP from UPD_MODULES M ' ' left join SERVERS S on S.ID_SERVER=M.ID_SERVER ' 'order by M.ORDERBY ', params=(), fetch='all', id_system=-1) modules['datalist_modules'] = modules['datalist'] del modules['datalist'] bond = db.dbExec( sql='select BO.ID_BASE, BO.ID_MODULES from UPD_BOND BO ', params=(), fetch='all', id_system=-1) bond['datalist_bond'] = bond['datalist'] del bond['datalist'] userfio = self.getUserVar('userfio') userid = self.getUserVar('uid') curtime = str(time.time()) return self.drawTemplate(templ=updater_tmpl, data=[ bases, modules, bond, userfio, { "userid": userid }, { "curtime": curtime } ]) index.exposed = True def dump(self, data, ext_data=None, formats={}): #print "========dump===============" return self.pyDumps(data=data, ext_data=ext_data, formats=formats) #return json.dumps(data, encoding='cp1251') def upload_stats(self): try: #print "INVOKING upload_stats" import threading #print threading.currentThread() if not hasattr(cherrypy, 'file_transfers'): #print "======" #print "not hasattr(cherrypy, 'file_transfers')" #print "======" return self.pyDumps(data={'status': 'starting'}) #print "*****" #print "HASATTR!!!" #print "*****" #global file_transfers #print "======" #print file_transfers #print "======" if not cherrypy.file_transfers.has_key(cherrypy.request.remote.ip): #print "no key ", cherrypy.request.remote.ip return self.pyDumps(data={'status': 'starting'}) stat = cherrypy.file_transfers[cherrypy.request.remote.ip] #print "======" #print stat #print "======" # Convert everything to KBs and return for key, val in stat.iteritems(): speed = '%9.2f' % (val.speed / 1024.0) total = '%9.2f' % (val.pre_sized / 1024.0) transfered = '%9.2f' % (val.transfered / 1024.0) eta = str(int(val.eta)) done = val.transfered / val.pre_sized done = str(300 * done) #Logger.info("Upload Stats: fn: %s speed: %s total: %s transferred: %s" % (key, speed, total, transfered)) #print "transfered = ", transfered return self.pyDumps( data={ 'status': 'uploading', 'filename': key, 'speed': speed, 'total': total, 'transfered': transfered, 'eta': eta, 'done': done }) except KeyError: #Logger.info("Upload Stats: returning done") # If there are no entries by our IP, then we have nothing. #raise #del_file_transfers() #raise #print "status=done" return self.pyDumps(data={'status': 'done'}) upload_stats.exposed = True @cherrypy.tools.noBodyProcess() def upload(self): #print "upload: ", self.getIfaceVar("id_system") """upload action We use our variation of FieldStorage to parse the MIME encoded HTML form data containing the file.""" #print "x"*5252 #print "UPLOAD STARTS" #print "x"*5252 #ignore no authorized scripts LOGIN = self.getUserVar('login') if not LOGIN: return 'Нельзя заливать скрипты с утерянной авторизацией!' #print "LOGIN="******"0" whatsnew = [] formFields = FieldStorage(fp=cherrypy.request.rfile, headers=lcHDRS, environ={'REQUEST_METHOD': 'POST'}, keep_blank_values=True) whatsnew = pu.format( json.loads((formFields['whatsnewdic'].value ).decode("windows-1251").encode("utf-8"))) try: t = self.trans() except Exception, exc: return str(exc) try: #print "BEFORE CREATING FieldStorage" # formFields = FieldStorage(fp=cherrypy.request.rfile, # headers=lcHDRS, # environ={'REQUEST_METHOD':'POST'}, # keep_blank_values=True) dicparams['ID_BASE'] = formFields['upd_base_cmb'].value dicparams['ID_MODULES'] = formFields['upd_module_cmb'].value dicparams['FILENAME'] = "" #print "AFTER CREATING FieldStorage" theFile = formFields['upd_file'] #print "AFTER 2 CREATING theFile" # theFile has 2 attributes: # - filename contains the name of the uploaded file # - file is an input stream opened for reading #print formFields base = formFields['upd_base_cmb'].value module = formFields['upd_module_cmb'].value #print "=====" #Получаем имя каталога if hasattr(cfg, 'upd_conf_location'): upd_conf = pu.importer(cfg.upd_conf_location) if hasattr(upd_conf, 'upload_path'): cat = upd_conf.upload_path else: return cpu.goToError( 'В конфигурационном файле ' + cfg.upd_conf_location + ' отстутсвует параметр upload_path') else: return cpu.goToError( 'Отстутсвует параметр конфигурации upd_conf_location' ) #cat='c:/tmp' pu.mk_dir(cat) ld = os.listdir(cat) #print "ld: ", ld ld_7z = filter( lambda fn: os.path.splitext(fn)[1] == '.7z' and len( fn.split('=')) > 1 and fn.split('=')[1].isdigit(), ld) ld_7z.sort() #ld_7z.reverse() #print "ld_7z: ", ld_7z #last_7z=os.path.join(cat, ld[0]) if ld_7z == []: NN = '01' #print "if ld_7z==[]: NN='01'" else: last_7z = ld_7z[len(ld_7z) - 1] #print "last_7z=", last_7z last_NN = last_7z.split('=')[1] #print "civil last_NN:", last_NN NN = "%02d" % (int(last_NN) + 1) tt = time.localtime(time.time()) YYYY = time.strftime('%Y', tt) MM = time.strftime('%m', tt) DD = time.strftime('%d', tt) #import pPrinter #print "*"*52 #import pprint #pPrinter = pprint.PrettyPrinter(indent=8) #pPrinter.pprint(formFields) #print "===\n",kwargs #print "===\n", base, module #print "*"*52 MALIAS = self.dbExec( sql="select MALIAS from UPD_MODULES where ID_MODULES=?", fetch="one", params=(module, ))['MALIAS'] DBALIAS = self.dbExec( sql="select DBALIAS from UPD_BASES where ID_BASE=?", fetch="one", params=(base, ))['DBALIAS'] FILENAME = theFile.filename FILENAME = os.path.basename(FILENAME) FILENAME = FILENAME[FILENAME.rfind('\\') + 1:] #IE fix full file names shortname = "%(YYYY)s-%(MM)s-%(DD)s=%(NN)s=%(MALIAS)s=%(DBALIAS)s=%(LOGIN)s=%(FILENAME)s" % vars( ) fullname = os.path.join(cat, shortname) #print fullname #print NN #print "=====" #for item in ld: # fn = pathesJoin([cat,item]) # if os.path.isfile(fn) and os.path.splitext(fn)[1]=='.sql': # Read the tempfile and store it in the final file f = open(fullname, 'wb') while 1: data = theFile.file.read(1024 * 8) # Read blocks of 8KB at a time if not data: break f.write(data) f.close() #print "=====================" #print "src = theFile.file.name=",theFile.file.name #print "dst = '/tmp/'+theFile.filename",'/tmp/'+theFile.filename #print "=====================" #os.link(theFile.file.name, '/tmp/'+theFile.filename) dicparams['FILENAME'] = fullname dicparams['STATUS'] = '1' dbRes = t.dbExec(sql='select * from UPD_INSERTUPDATE(?,?,?,?,?)', params=[dicparams['DEVEL_ID'],\ dicparams['ID_BASE'], dicparams['ID_MODULES'], dicparams['FILENAME'],\ dicparams['STATUS']], fetch='one', id_system=-1) for item in whatsnew: wnRes = t.dbExec(sql='select * from UPD_WHATSNEWINSERT(?,?,?,?,?)', params=[dbRes['IDUPDATE'],\ str(item['id_system']), str(item['id_type']), str(item['redmine']),\ str(item['description'])],\ fetch="one", id_system=-1) self.analyseUpdateFile(fullname, dbRes['IDUPDATE']) t.commit() return #return ("ok, получили файл '%s'. Файл был сохранён как "+fullname) % theFile.filename except Exception, exc1: import traceback as tb tb_str = tb.format_exc() cpu.cherrypylog('upload: branch 1\n%s' % tb_str, context='UPDATER') e_str1 = str(exc1) e_str2 = '' e_str3 = '' t.rollback() dicparams['FILENAME'] = None dicparams['STATUS'] = '0' t = self.trans() try: dbRes = t.dbExec(sql='select * from UPD_INSERTUPDATE(?,?,?,?,?)', params=[dicparams['DEVEL_ID'],\ dicparams['ID_BASE'], dicparams['ID_MODULES'], dicparams['FILENAME'],\ dicparams['STATUS']], fetch='one', id_system=-1) for item in whatsnew: wnRes = t.dbExec(sql='select * from UPD_WHATSNEWINSERT(?,?,?,?,?)', params=[dbRes['IDUPDATE'],\ str(item['id_system']), str(item['id_type']), str(item['redmine']),\ str(item['description'])],\ fetch="one", id_system=-1) t.commit() except Exception, exc2: tb_str2 = tb.format_exc() cpu.cherrypylog('upload: branch 2\n%s' % tb_str2, context='UPDATER') e_str2 = str(exc2) t.rollback() try: del_file_transfers() except Exception, exc3: tb_str3 = tb.format_exc() cpu.cherrypylog('upload: branch 3\n%s' % tb_str3, context='UPDATER') e_str3 = str(exc3)
def draw_system_list_term(self, code, termnum): # код завершения смены if code == cfg.TERMINAL_LOGOFF_BARCODE: # запрос на закрытие сессии в RBS mes = sessions.rbs_close_check(self.getSesVar('termiduser')) # не разрешено закрывать сессию if mes: return self.drawTemplate(templ=pu.iif(cpu.isMobile(), login_index_mob, login_index_term), data=[{'termname': self.getSesVar('termname'), 'termusername': self.getSesVar('termusername'), 'mes': mes}], draw_wo_login=True) # получено разрешение из RBS на закрытие сессии # попытка закрыть сессию error_msg, web_session_id = sessions.session_close(uid=self.getSesVar('termiduser'), fio=self.getSesVar('termusername'), equip_kind=pu.iif(cpu.isMobile(), 'M', 'T'), reason=sessions.SES_CLOSE_REASON_EXIT, closed_by=None) # ошибка закрытия сессии if error_msg: cpu.cherrypylog(error_msg, context='APP.SESSIONS') return self.drawTemplate(templ=pu.iif(cpu.isMobile(), login_index_mob, login_index_term), data=[{'termname': self.getSesVar('termname'), 'termusername': self.getSesVar('termusername'), 'mes': error_msg}], draw_wo_login=True) # сессия закрыта успешно termusername = self.getSesVar('termusername') self.exit(redirect=False) return self.drawTemplate(templ=pu.iif(cpu.isMobile(), login_index_mob, login_index_term), data=[{'termname': self.getSesVar('termname'), 'termusername': '', 'mes': 'Сессия пользователя '+termusername+' закрыта'}], draw_wo_login=True) # валидация длины введённого ШК и его целостности if not term_verify_barcode(code): return self.drawTemplate(templ=pu.iif(cpu.isMobile(), login_index_mob, login_index_term), data=[{'termname': self.getSesVar('termname'), 'termusername': self.getSesVar('termusername'), 'mes': 'Отсканирован не ШК пользователя'}], draw_wo_login=True) # структура ШК верна - верифицируем его и определяем пользователя usr = db.dbExec(sql='select * from ENGINE_USER_VERIFY_TERM(?)', params=[code], fetch='one', id_system=-1) if usr['ERROR_CODE']!=0: if usr['ERROR_CODE']==5: # пользователь найден, а ШК - нет # сверяем дату генерации ШК в БД и отсканированного ШК msg_check_barcode_date = check_barcode_date(code, usr['BARCODE_OUT']) if msg_check_barcode_date: return self.drawTemplate(templ=pu.iif(cpu.isMobile(), login_index_mob, login_index_term), data=[{'termusername': usr['FIO'], #'termusername': self.getSesVar('termusername'), 'termname': self.getSesVar('termname'), 'mes': msg_check_barcode_date }], draw_wo_login=True) # валидация длины ШК в БД и его целостности if not term_verify_barcode(usr['BARCODE_OUT']): return self.drawTemplate(templ=pu.iif(cpu.isMobile(), login_index_mob, login_index_term), data=[{'termusername':usr['FIO'], #'termusername': self.getSesVar('termusername'), 'termname': self.getSesVar('termname'), 'mes': 'Испорчен ШК в базе данных. Обратитесь в службу поддержки!'}], draw_wo_login=True) # неизвестная ошибка в ШК return self.drawTemplate(templ=pu.iif(cpu.isMobile(), login_index_mob, login_index_term), data=[{'termusername':usr['FIO'], #'termusername': self.getSesVar('termusername'), 'termname': self.getSesVar('termname'), 'mes': 'Неизвестная ошибка в ШК. Обратитесь в службу поддержки!'}], draw_wo_login=True) else: #2 - 'Пользователь не заведён в системе!' или другая будущая ошибка return self.drawTemplate(templ=pu.iif(cpu.isMobile(), login_index_mob, login_index_term), data=[{'termname': self.getSesVar('termname'), 'termusername': self.getSesVar('termusername'), 'mes': usr['ERROR_MSG']}], draw_wo_login=True) if getattr(cfg, 'SKUD_INTEGRATION', False) and \ (getattr(cfg, 'SKUD_CHECK_MOBILE', False) and cpu.isMobile() or getattr(cfg, 'SKUD_CHECK_TSD', False) and cpu.isTSD()): allow = db.dbExecDirect(sql='select ALLOW from %s(?)' % cfg.SKUD_MAJOR_DB_ACCESS_PROC, params=[usr['ID_USER']], fetch='one', id_base=db.getIdMajorDb())['ALLOW'] if not allow: if cpu.isTSD(): return cpu.goToError(_('Доступ запрещён по данным СКУД!')) else: return self.exception_inner(tmpl_name='exception_skud_access_mob', data={'userfio': usr['FIO']}) # заказан ли проброс для этого вида оборудования в конфиге probros = pu.iif(cpu.isMobile(), getattr(cfg, 'sessions_forward_to_last_iface_mob', None), getattr(cfg, 'sessions_forward_to_last_iface_term', None)) if probros: # читаем данные последней сессии error_msg, go_url, ses_info = sessions.session_last_session_info(uid=usr['ID_USER'], fio=usr['FIO'], equip_kind=pu.iif(cpu.isMobile(), 'M', 'T') ) # ошибка получения информации о последней сессии if error_msg: cpu.cherrypylog(error_msg, context='APP.SESSIONS') probros = False # открываем сессию old_web_session_id, error_msg = sessions.session_open(uid=usr['ID_USER'], fio=usr['FIO'], equip_kind=pu.iif(cpu.isMobile(), 'M', 'T'), termnum=termnum) # ошибка открытия сессии if error_msg: cpu.cherrypylog(error_msg, context='APP.SESSIONS') return self.drawTemplate(templ=pu.iif(cpu.isMobile(), login_index_mob, login_index_term), data=[{'termname': self.getSesVar('termname'), 'termusername': usr['FIO'], 'mes': error_msg}], draw_wo_login=True) # удаляем старую web-сессию, если она есть if old_web_session_id: sessions.session_delete_old_web_session(old_web_session_id) # залогинились #print "draw_system_list_term: id_user=%s, fio=%s, barcode=%s" %( usr['ID_USER'], self.df(usr['FIO']), usr['BARCODE_OUT']) # заполняем переменные сессии юзера create_user_session_class(login=usr['LOGIN'], uid=usr['ID_USER'], userfio=usr['FIO'], email=usr['EMAIL'], phonenumber=usr['PHONENUMBER'], layer_id=usr['LAYER_ID'], locale=usr['LANG_CODE'] or self.getSesVar('locale'), is_superadmin=usr['IS_SUPERADMIN']) self.setSesVar('termiduser', usr['ID_USER']) self.setSesVar('termusername', usr['FIO']) # далее реализуем проброс # проброс в зависимости от настроек конфиругации и наличия последней сохранённой сессии if probros and go_url: # если error_msg пусто, то go_url заполнено - переходим в него raise cherrypy.HTTPRedirect(go_url) else: # иначе - анализируем # получаем доступные системы нулевого уровня, сортируя по cfg.systems_order systems = get_user_systems(uid=self.getUserVar("uid"), higher=None, recurse=0, use_layers=None) # если юзер не имеет прав ни на одну из систем нулевого уровня if len(systems['datalist'])==0: return self.drawTemplate(templ=pu.iif(cpu.isMobile(), login_index_mob, login_index_term),data=[{'mes':'Пользователь не имеет прав ни на одну систему'}], draw_wo_login=True) # если у юзера есть право на KURSTERM или WMSMOBILE и список систем в нём непуст, то перебрасываем в KURSTERM или WMSMOBILE if cpu.isMobile(): # если у юзера есть право на WMSMOBILE if getattr(cfg, 'MOBILE_link', None) in self.getUserVar('granted_system_refs'): # получить id_system для системы WMSMOBILE MOBILE_id_system = si.find_id_system_by_full_ref_name(cfg.MOBILE_link) #TERMINAL_id_system=db.dbExec(sql='select ID_SYSTEM from ENGINE_FIND_SYSTEM_BY_FULL_REF(?)', # params=[cfg.TERMINAL_link], fetch='one', id_system=-1)['ID_SYSTEM'] # получить список доступных юзеру подсистем в системе WMSMOBILE mobile_subsystems = get_user_systems(uid=self.getUserVar("uid"), higher=MOBILE_id_system, recurse=0, use_layers=None) # если список доступных юзеру подсистем в системе WMSMOBILE содержит одну запись(возможно, OLDTERM), то перебрасываем в неё if len(mobile_subsystems['datalist']) == 1: #raise cherrypy.HTTPRedirect(terminal_subsystems['datalist'][0]['FULL_REF_NAME']+'/?id_system='+ str(terminal_subsystems['datalist'][0]['ID_SYSTEM'])) raise cherrypy.HTTPRedirect(mobile_subsystems['datalist'][0]['FULL_REF_NAME']) # иначе перебрасываем в WMSMOBILE else: #raise cherrypy.HTTPRedirect(cfg.TERMINAL_link+'/?id_system='+ str(TERMINAL_id_system)) raise cherrypy.HTTPRedirect(cfg.MOBILE_link) else: # если у юзера есть право на KURSTERM if getattr(cfg, 'TERMINAL_link', None) in self.getUserVar('granted_system_refs'): # получить id_system для системы KURSTERM TERMINAL_id_system = si.find_id_system_by_full_ref_name(cfg.TERMINAL_link) #TERMINAL_id_system=db.dbExec(sql='select ID_SYSTEM from ENGINE_FIND_SYSTEM_BY_FULL_REF(?)', # params=[cfg.TERMINAL_link], fetch='one', id_system=-1)['ID_SYSTEM'] # получить список доступных юзеру подсистем в системе KURSTERM terminal_subsystems = get_user_systems(uid=self.getUserVar("uid"), higher=TERMINAL_id_system, recurse=0, use_layers=None) # если список доступных юзеру подсистем в системе KURSTERM содержит одну запись(возможно, OLDTERM), то перебрасываем в неё if len(terminal_subsystems['datalist']) == 1: #raise cherrypy.HTTPRedirect(terminal_subsystems['datalist'][0]['FULL_REF_NAME']+'/?id_system='+ str(terminal_subsystems['datalist'][0]['ID_SYSTEM'])) raise cherrypy.HTTPRedirect(terminal_subsystems['datalist'][0]['FULL_REF_NAME']) # иначе перебрасываем в KURSTERM else: #raise cherrypy.HTTPRedirect(cfg.TERMINAL_link+'/?id_system='+ str(TERMINAL_id_system)) raise cherrypy.HTTPRedirect(cfg.TERMINAL_link) # если у юзера есть права более, чем на 1 систему - рисуем список систем на выбор if len(systems['datalist'])>1: #return self.drawTemplate(templ=choose_your_destiny,data=[systems]) return self.drawTemplate(templ=pu.iif(cpu.isMobile(), subsystem_list_mob, subsystem_list_term), data=[systems, {'system_name': _('Выберите систему')}]) # если у юзера есть право только на одну систему, то перебрасываем в неё if len(systems['datalist'])==1: #self.setSesVar("id_system",systems['datalist'][0]['ID_SYSTEM']) #raise cherrypy.HTTPRedirect(systems['datalist'][0]['FULL_REF_NAME']+'/?id_system='+ str(self.getSesVar("id_system"))) #print "if len(systems['datalist'])==1:" #raise cherrypy.HTTPRedirect(systems['datalist'][0]['FULL_REF_NAME']+'/?id_system='+ str(systems['datalist'][0]['ID_SYSTEM'])) raise cherrypy.HTTPRedirect(systems['datalist'][0]['FULL_REF_NAME'])