Пример #1
0
    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,
Пример #2
0
    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")
Пример #3
0
    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(
                        _('Подсистема временно недоступна.'
                          ))
Пример #4
0
 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)
Пример #5
0
 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):]
Пример #6
0
    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'])
Пример #7
0
    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)
Пример #8
0
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)
Пример #9
0
    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'])