Exemple #1
0
 def transfer_tasks(self, from_robot, to_robot, cnt, param=None):
     try:
         dbExecDirect(
             sql='execute procedure HEALTH_TRANSFER_TASKS(?,?,?,?)',
             params=(from_robot, to_robot, cnt, param),
             fetch='none',
             id_base=self.id_base_kurs)
     except Exception, exc:
         return self.pyDumps(ext_data={'res': '0', 'errMes': exc[1]})
Exemple #2
0
    def custom_changezone_get_html(self):

        # get xml rights CHANGEZONE system

        majorDb = db.getIdMajorDb()

        id_system_changezone = si.find_id_system_by_full_ref_name(
            '/KURS/CHANGEZONE')
        sysOptions = so.SysOptions(None,
                                   cfg.options_instances_subdir,
                                   id_system=id_system_changezone)

        if sysOptions.opt('grant', None, 'changezone', 'other'):
            resZone = db.dbExecDirect(
                sql=
                "select goi.* from K_CHANGEZONE_GET_ZONE(?) goi order by goi.name",
                params=[None],
                fetch='all',
                id_base=majorDb)
        else:
            category = sysOptions.opt('view', 'category', 'changezone',
                                      'other')
            if category:
                category = sysOptions.opt('view', 'category', 'changezone',
                                          'other')
                category = re.sub('[|_.+ ]', ',', category)
            else:
                category = ''
            resZone = db.dbExecDirect(
                sql="select goi.* from K_CHANGEZONE_GET_ZONE(?) goi \
                                           join RBS_CHANGEZONE_GET_OBJ(?) go on go.objid = goi.objid \
                                           order by goi.name",
                params=[category,
                        self.custom_get_employee_zone_object()],
                fetch='all',
                id_base=majorDb)

        resZone['zone_datalist'] = resZone['datalist']
        del resZone['datalist']

        # get user zone
        try:
            user_zone = db.dbExecDirect(sql='select * from K_GET_ADDINFO(?)',
                                        params=[self.getUserVar('uid')],
                                        fetch='one',
                                        id_base=majorDb)
        except:
            user_zone = {'ZONEID': '', 'ADDINFO': ''}
        return self.drawTemplate(templ=changezone,
                                 data=[
                                     resZone, {
                                         'user_zone_id': user_zone['ZONEID'],
                                         'user_zone_name': user_zone['ADDINFO']
                                     }
                                 ])
Exemple #3
0
 def deleteaorderstat(self):
     if self.opt('grant', None, 'delete_aorder_stat', 'other'):
         id_base = find_id_base_by_code('KURS')
         try:
             dbExecDirect(
                 sql='execute procedure HEALTH_R_QUEUE_STAT_DELETE',
                 params=(),
                 fetch='none',
                 id_base=id_base)
         except Exception, exc:
             return self.pyDumps(ext_data={'res': '0', 'errMes': exc[1]})
         return self.pyDumps(ext_data={'res': '1'})
Exemple #4
0
 def get_block_robots(self, rmode='dic', ismobile='0', param=None):
     dic = dbExecDirect(
         sql='select * from HEALTH_ROBOTS(?) order by health desc',
         params=[param],
         fetch='all',
         id_base=self.id_base_kurs)
     if rmode == 'dic': return dic
     return self.return_block(rmode, dic, 'ROBOTS', ismobile)
Exemple #5
0
    def get_devels(self, ip=None, dtBeg=None, dtEnd=None, idBase=None):
        #import time
        #time_beg=time.time()

        conEngine = db.getConEng()

        #GTT очищается при commit
        t = db.Trans(id_system=-1, conEngine=conEngine)
        try:
            devels = []
            if ip is not None:
                # по каждой записи в base.k_ip_access_log (ip, access_stamp) по ip и для заданного периода в фильтре и заданной базы
                for access_stamp_ds in db.dbExecDirect(sql = "select access_stamp" \
                                          " from K_IP_ACCESS_LOG where ip is not distinct from ?" \
                                          " and access_stamp between ? and ? ",
                                      params=(ip,
                                              dtBeg,
                                              dtEnd),
                                      fetch='all',
                                      id_base=idBase,
                                      conEngine=conEngine
                                 )['datalist']:
                    access_stamp = access_stamp_ds['ACCESS_STAMP']

                    # проинсертить
                    t.dbExec(
                        sql=
                        "insert into GTT_IP_ACCESS_LOG(ACCESS_STAMP) values(?)",
                        params=[access_stamp],
                        fetch='none')

                for devel in t.dbExec(sql = "select devel_id, devel_fio" \
                                      " from T_GET_DEVELS_BY_GTT(?,?)",
                                  params=(ip, idBase),
                                  fetch='all'
                             )['datalist']:
                    if devel['DEVEL_ID'] not in map(lambda d: d['DEVEL_ID'],
                                                    devels):
                        devels.append({
                            'DEVEL_ID': devel['DEVEL_ID'],
                            'DEVEL_FIO': devel['DEVEL_FIO']
                        })

            else:
                devels.append({
                    'DEVEL_ID': -1,
                    'DEVEL_FIO': 'Firebird Utilites'
                })
            t.commit()
        except:
            t.rollback()
            raise

        #print "get_devels Exec Time: ", time.time()-time_beg

        return devels
Exemple #6
0
    def custom_get_sessionid(self):
        majorDb = db.getIdMajorDb()

        employeeID = db.dbExecDirect(
            sql='select id_man from k_users k where k.id_user = ?',
            params=[self.getUserVar('uid')],
            fetch='one',
            id_base=majorDb)
        if employeeID:
            sessionid = db.dbExecDirect(
                sql=
                'select first(1) w.sessionid from wm_session w where w.objid=? order by w.connecttime desc',
                params=[employeeID['ID_MAN']],
                fetch='one',
                id_base=majorDb)['SESSIONID']
        else:
            sessionid = None

        return sessionid
Exemple #7
0
    def custom_changezone_set_zone(self, zoneid):
        majorDb = db.getIdMajorDb()

        return self.pyDumps(
            db.dbExecDirect(sql='select * from UR_GET_ZONE_BY_BARCODE(?,?,?)',
                            params=[
                                self.custom_get_sessionid(),
                                self.getUserVar('uid'), zoneid
                            ],
                            fetch='one',
                            id_base=majorDb))
Exemple #8
0
    def custom_get_employee_zone_object(self):
        majorDb = db.getIdMajorDb()

        employeeID = db.dbExecDirect(
            sql='select id_man from k_users k where k.id_user = ?',
            params=[self.getUserVar('uid')],
            fetch='one',
            id_base=majorDb)
        if employeeID:
            zone = db.dbExecDirect(sql='select z.objid from employee e \
                                        left join sitezone z on z.zoneid = e.currentzone \
                                        where e.employeeid = ?',
                                   params=[employeeID['ID_MAN']],
                                   fetch='one',
                                   id_base=majorDb)
            if zone:
                return zone['OBJID']
            else:
                return None
        else:
            return None
Exemple #9
0
    def ajaxTicketDelAll(self, perm):
        "Удалять можно только временные или только постоянные тикеты: если perm истинен, то постоянные, иначе - временные"
        tickets = []
        """for dic in self.dbExec(sql="select TICKET_ID, DEVEL_ID, DEVEL_FIO, REASON, GRANT_STAMP, TICKET, DELETED_TIME, ADMIN_FIO, DB_IP, DB_NAME" \
                              " from T_GET(?,?,?,?,?,?,?,?) WHERE DELETED_TIME IS NULL",
                          params=(None,
                                  None,
                                  None,
                                  mxToday(),
                                  LastTodayTime(),
                                  None,
                                  None,
                                  None),
                          fetch='all')['datalist']:"""

        for dic in self.tickets_get(ticketId=None, develId=None, reason=None, dtBeg=mxToday(), dtEnd=LastTodayTime(), ticket=None, adminId=None, idBase=None, perm=self.cStrE(perm), only_no_deleted=True, ip=None)['datalist']:
            tickets.append(dic)

        dic = self.dbExec(sql="select DELETED_TIME from T_MARK_DEL_ALL(?)",  params=[self.cStrE(perm)], fetch='one')
        if dic is not None:
            deleted_time = formatMxDateTime(dic['DELETED_TIME'], format='%H:%M', sformatFrom='%H:%M:%S')
        else:
            deleted_time = ''

        #для каждой зарегистрированной БД вызываем очистку каталогов тикетов на серверах (за сегодня)
        #for dic in self.dbExec(sql="select TICKETS_PATH_HOME, SERVER_IP, SERVER_USER from ENGINE_GET_BASES_INFO(NULL)", fetch='all')['datalist']:
        for base in db.get_bases_info()['dbs']:
            db.dbExecDirect(sql="delete from K_IP_CHECK where PERM is not null and PERM " + pu.iif(perm!='0', '<>0', '=0'),
                              params=[],
                              fetch='none',
                              id_base=base['ID_BASE']
                           )
            dublin.dropTodayLinks(links_path=pu.iif(perm!='0', base['TICKETS_PERM_PATH_HOME'], base['TICKETS_PATH_HOME']), user=base['SERVER_USER'], ip=base['SERVER_IP'])

        #по всем тикетам, попавшим в фильтр
        for dic in tickets:
            pu.send_devel_mail(subject='Тикет удалён', body='Тикет: %s\nIP/port: %s\nБД: %s\nID тикета: %s\nПерманент: %s\nВремя удаления: %s%s' \
                % (dic['TICKET'], dic['DB_IP'], dic['DB_NAME'], dic['TICKET_ID'], pu.iif(dic['PERM'], 'Да', 'Нет'), deleted_time, signature), id_devel=dic['DEVEL_ID'])
        return self.pyDumps(ext_data={'DELETED_TIME': deleted_time})
Exemple #10
0
 def get_block(self, rmode='dic', refresh_block=None, ismobile='0'):
     if refresh_block.upper() == 'PYTHON':
         return self.get_block_python(rmode, ismobile)
     if refresh_block.upper() == 'ROBOTS':
         return self.get_block_robots(rmode, ismobile)
     dic = {}
     dic.update(
         dbExecDirect(sql='select * from HEALTH_' + refresh_block.upper(),
                      params=(),
                      fetch='one',
                      id_base=self.id_base_kurs))
     if rmode == 'dic': return dic
     return self.return_block(rmode, dic, refresh_block, ismobile)
Exemple #11
0
def rbs_close_check(term_id_user):
    """Запрос на закрытие терминальной сессии в RBS.
    Возвращает сообщение об ошибке или пустую строку в случае удачи.

    """

    # получить id_base RBS
    rbs_id_base = db.getIdMajorDb()

    # запрос на закрытие сессии в RBS
    close_check = db.dbExecDirect(sql="select * from %s(?)" % cfg.MAJOR_DB_USER_SESSION_CLOSE_CHECK,
                    params=[term_id_user], fetch='one', id_base=rbs_id_base)

    if close_check['MES'] is None:
        return ''
    else:
        return close_check['MES']
Exemple #12
0
    def get_block_order(self, rmode='dic', refresh_block=None):
        dic = {}
        if self.opt('grant', None, 'delete_aorder_stat', 'other'):
            dic['can_delete_aorderstat'] = '1'
        else:
            dic['can_delete_aorderstat'] = '0'
        dic.update(
            dbExecDirect(sql='select * from HEALTH_AORDER',
                         params=(),
                         fetch='one',
                         id_base=self.id_base_kurs))

        if rmode == 'dic': return dic
        if refresh_block is None:
            return self.return_block(rmode, dic, refresh_block, ismobile)
        dic_refresh = {}
        for key in dic.keys():
            if (key.find(refresh_block) != -1):
                dic_refresh[key] = dic[key]
        return self.return_block(rmode, dic_refresh, refresh_block, ismobile)
Exemple #13
0
    def conlog_details(self, dtBeg=None, dtEnd=None, idBase=None, ip=None):
        """ip - один из ip-адресов разработчика, на которые выдан тикет
        """
        # 0. Обработка входных параметров

        dtBeg = self.cDateTime(dtBeg)
        if dtBeg is None:
            dtBeg = '01.01.2000'

        dtEnd = self.cStrE(dtEnd)
        if dtEnd is None:
            dtEnd = '01.01.2100'
        else:
            dtEnd = dtEnd + ' 23:59:59'
        dtEnd = self.cDateTime(dtEnd)

        idBase = self.cInt(idBase)
        ip = self.cStrE(ip)
        if ip is None:
            ip = ''

        # 1. Получить таблицу A без поля WHOS

        detail_lst = db.dbExecDirect(sql = "select access_stamp" \
                                      " from K_IP_ACCESS_LOG where " + pu.iif(ip, "IP='"+ip+"'", 'IP IS NULL') +
                                      " and access_stamp between ? and ? " \
                                      " order by 1 desc",
                                  params=(dtBeg,
                                          dtEnd),
                                  fetch='all',
                                  id_base=idBase
                             )['datalist']

        return self.drawTemplate(templ=conlog_detail,
                                 data=[{
                                     'detail': detail_lst
                                 }])
Exemple #14
0
    def ajaxTicketAdd(self, develId, idBase, reason, perm, ips):
        #db_info = self.dbExec(sql="select DB_IP, DB_NAME, DB_LOCATION, SERVER_IP, SERVER_USER, TICKETS_PATH_HOME from ENGINE_GET_BASES_INFO(?)", params=[self.cInt(idBase)], fetch='one')
        #if db_info is None:
        #    raise TicketsException('Base with ID=%s not found!' % idBase)
        #dbs = db.get_bases_info(idBase)['dbs']
        #if len(dbs) == 0:
        #    raise TicketsException('Base with ID=%s not found!' % idBase)
        #db_info = dbs[0]
        #Переводим из строки в объект
        ips = json.loads(ips)
        db_info = db.get_bases_info(self.cInt(idBase))

        db_location = db_info['DB_LOCATION']
        server_user = db_info['SERVER_USER']
        server_ip = db_info['SERVER_IP']
        db_ip = db.db_ip_to_private(db_info['DB_IP'])
        db_name = db_info['DB_NAME']
        tickets_path_home = db_info['TICKETS_PATH_HOME']
        tickets_perm_path_home = db_info['TICKETS_PERM_PATH_HOME']

        devel = self.dbExec(sql="select DEVEL_LOGIN, DEVEL_FIO FROM T_DEVEL WHERE DEVEL_ID=?", params=[self.cInt(develId)], fetch='one')
        if devel is None:
            raise TicketsException('Developer with ID=%s not exists' % develId)

        reason = pu.convToWin(reason)
        devel_login = devel['DEVEL_LOGIN']
        devel_fio = devel['DEVEL_FIO']

        ticket = dublin.createLink(db_location=db_location, links_path=pu.iif(perm!='0', tickets_perm_path_home, tickets_path_home), login=devel_login, user=server_user, ip=server_ip)

        #print "55555555555555"
        #print perm, self.cStrE(perm)
        #print "55555555555555"
        conEngine = db.getConEng()
        group = dbEngine.ConnectionGroup()
        try:
            conDb = db.getConDb(self.cInt(idBase))
            group.add(conDb)
            #conEngine.commit()
            group.add(conEngine)
            group.begin()

            try:
                dic = db.dbExec(sql="select TICKET_ID, GRANT_STAMP from T_ADD(?,?,?,?,?,?)",
                    params=(self.cInt(develId),
                            reason,
                            ticket,
                            self.getUserVar('uid'),
                            self.cInt(idBase),
                            self.cStrE(perm)
                           ),
                    fetch='one',
                    id_system=-1,
                    con=conEngine,
                    conEngine=conEngine
                )
                grant_stamp = formatMxDateTime(dic['GRANT_STAMP'], '%d.%m.%Y %H:%M')

                for ip in ips:
                    """ip = db.dbExec(sql="select IP from T_DEVEL_IP where ID_DEVEL_IP=?",
                        params=[str(id_ip)],
                        fetch='one',
                        id_system=-1,
                        con=conEngine,
                        conEngine=conEngine
                        )['IP']
                    """
                    dic_ip = db.dbExec(sql="select ID_TICKETS_IP from T_ADD_IP(?,?)",
                        params=(dic['TICKET_ID'],
                                str(ip)
                               ),
                        fetch='one',
                        id_system=-1,
                        con=conEngine,
                        conEngine=conEngine
                        )
                    dic_base_ip = db.dbExecDirect(sql="INSERT INTO K_IP_CHECK (IP, DEVEL_FIO, TICKET_ID, PERM) VALUES(?,?,?,?)",
                        params=(str(ip),
                                devel_fio,
                                dic['TICKET_ID'],
                                self.cStrE(perm)
                               ),
                        fetch='none',
                        id_base=self.cInt(idBase),
                        con=conDb,
                        conEngine=conEngine
                        )
                #conEngine.savepoint('A')

            except:
                if group.count(): group.rollback()
                raise
            else:
                group.commit()

        finally:
            group.disband() #disband the group so that member connections can operate independently again.

        if dic is not None:
            pu.send_devel_mail(subject='Тикет выдан', body='Тикет: %s\nIP/port: %s\nБД: %s\nID тикета: %s\nПерманент: %s\nВремя выдачи: %s\nПричина: %s\nРазработчик: %s\nВыдал: %s%s' \
                % (ticket, db_ip, db_name, dic['TICKET_ID'], pu.iif(perm!='0', 'Да', 'Нет'), grant_stamp, reason, devel_fio, self.getUserVar('userfio'), signature), id_devel=develId)
            return self.pyDumps(ext_data={'TICKET_ID': dic['TICKET_ID'],
                                          'GRANT_STAMP': grant_stamp,
                                          #'REASON': dic['REASON'],
                                          'DEVEL_FIO': devel_fio,
                                          'TICKET': ticket,
                                          'ADMIN_FIO': self.getUserVar('userfio'),
                                          'DB_IP': db_ip,
                                          'DB_NAME': db_name
                                })
        else:
            return self.pyDumps(ext_data={'TICKET': 'no'})
Exemple #15
0
    def draw_system_list(self, username, password, first_time=0, pwd_is_hash='0'):
        u"""Валидация логина и пароля и проброс вглубь дерева подсистем.
            Возвращает словарь {'ERROR_CODE': ERROR_CODE, 'ERROR_MSG': ERROR_MSG, 'REDIRECT_CODE': REDIRECT_CODE,
              'REDIRECT_DATA': REDIRECT_DATA}, где
            ERROR_CODE - ERROR_MSG:
            '0' - null (удачно)
            '1' - "Не указан логин"
            '2' - "Пользователь не заведён в системе!"
            '3' - "Администратор не установил Ваш пароль!"
            '4' - "Неверный пароль!"
            '5' - "Не указан пароль!"
            '6' - "Пароль не переустановлен пользователем!"
            '100' - "Организация временно отключена" (слой отключён)
            '110' - "Доступ запрещён по данным СКУД"
            '120' - "Ошибка открытия сессии..."
            REDIRECT_CODE: 0 - REDIRECT_DATA содержит url для проброса (перейти в него изнутри движка так: cp_utils.HTTPRedirect(REDIRECT_DATA))
                           1 - REDIRECT_DATA содержит отрисованную html-страницу авторизации со списком систем, если ERROR_CODE==0 или с ошибкой, если ERROR_CODE!=0
                           2 - REDIRECT_DATA содержит текст ошибки, для отображения на отдельной странице ошибки (перейти в него изнутри движка так: cp_utils.goToError(REDIRECT_DATA))

            Если ERROR_CODE==0, то REDIRECT_CODE in [0, 1].
            Если ERROR_CODE!=0, то REDIRECT_CODE in [1, 2].

        """

        # обрабатываем параметры
        if pwd_is_hash in ['0', '', None]:
            pwd_is_hash = False
        else:
            pwd_is_hash = True

        # инициализируем результат
        result = {'ERROR_CODE': 0, 'ERROR_MSG': None, 'REDIRECT_CODE': 0, 'REDIRECT_DATA': ''}

        #снова выставляем переменные, если пользователь попал на login минуя index
        #например, нажал в браузере "Обновить" на форме списка систем
        self.setSesVar('termiduser', None)
        self.setSesVar('termusername', None)
        self.setSesVar('termnum', None)
        self.setSesVar('termname', None)

        usr = verify_user(username, password, pwd_is_hash=pwd_is_hash)
        if usr['ERROR_CODE']:
            result['ERROR_CODE'] = usr['ERROR_CODE']
            result['ERROR_MSG'] = usr['ERROR_MSG']
            result['REDIRECT_CODE'] = 1
            if usr['ERROR_CODE'] == 6:
                self.setSesVar('tmp_uid', usr['ID_USER'])
                self.setSesVar('tmp_login', username)
                result['REDIRECT_DATA'] = self.drawTemplate(templ=login_change_passwd,
                                                            data=[{'username': username, 'mes': '', 'uid': self.getSesVar('tmp_uid')},
                                                                  {'langs': cpu.getConfigLangs()}],
                                                            draw_wo_login=True)
            else:
                result['REDIRECT_DATA'] = self.drawTemplate(templ=login_index,
                                                            data=[{'username': username, 'mes': usr['ERROR_MSG']},
                                                                  {'langs': cpu.getConfigLangs()}],
                                                            draw_wo_login=True)
            return result

        #if password == '':
        #    return self.drawTemplate(templ=login_index,data=[{'username':username, 'mes':'Введите пароль пож-та'}], draw_wo_login=True)

        # залогинились
        # проверяем здесь, а не в cpu.sec для ускорения ответа сервера
        # и не чистим SesVar('ip_addr') при выходе из Курса (exit), чтоб запомнить и вычислить пересечения сессий
        # за всё время хранения сессий
        # если бы сессии хренились в файле, то можно было бы не перевходить и продолжалось бы пересечения
        # и пришлось бы обрабатывать в sec
        # но т.к. в RAM и часто перегружается
        # cherrypy.session.id - есть гарантировано здесь, проверено, даже когда чистят куки, id уже сформирован к этому времени
        #print self.getSesVar('ip_addr'), cpu.get_remote_ip(), sessions.session_id()
        #if self.getSesVar('ip_addr') is None:
        #    self.setSesVar('ip_addr', cpu.get_remote_ip())
        #elif self.getSesVar('ip_addr') != cpu.get_remote_ip():
        #    raise CrossSessionsException(
        #        'Пересечение сессий! Очистите куки браузера! Ваш ip=%s пересекается с ip=%s по session_id=%s'
        #        % (cpu.get_remote_ip(), self.getSesVar('ip_addr'), sessions.session_id()))

        """ Бывшая проверка пересечения сессий в УР
        session_ip = self.getSesVar('ip_addr')
        real_ip = cpu.get_remote_ip(if_proxy='client') # if_proxy='client' - чтоб если входим 2-й раз, не нажимая Выход, не выдавало пересечение сессий (если не рвался инет)
        if session_ip is None:
            self.setSesVar('ip_addr', real_ip)
        elif session_ip != real_ip and usr['ID_USER'] != self.getUserVar('uid') and self.getKursZoneId(usr['ID_USER']) != self.getKursZoneId(self.getUserVar('uid')):
            cpu.cherrypylog('---------------------CROSS SESSIONS---------------------')
            cpu.cherrypylog('Entering user: login=%s, uid=%d, userfio=%s' % (username, usr['ID_USER'], usr['FIO']))
            cpu.cherrypylog('Request headers:\n'+self.df(cherrypy.request.headers))
            cpu.cherrypylog('Existing session info:')
            raise CrossSessionsException(
                'Пересечение сессий! Возможно, у Вас изменился ip-адрес. Очистите куки браузера, нажмите на ссылку <a href="/exit">Выход</a> и перезайдите в КУРС! Ваш ip=%s пересекается с ip=%s по session_id=%s.'
                % (real_ip, session_ip, sessions.session_id()))
        """

        # активируем переменные сессии
        #self.setSesVar("login",username)
        #self.setSesVar("uid",usr['ID_USER'])
        #self.setSesVar("userfio",usr['FIO'])

        #print "draw_system_list: self.getUserVar('uid'): ", self.getUserVar("uid")

        #self.setSesVar("is_admin",usr['IS_ADMIN'])
        # рисуем админпанель
        #if usr['IS_ADMIN']:
        #  self.setSesVar("granted_system_refs", ['admin'])
        #  raise cherrypy.HTTPRedirect('/admin')

        if layers.layersIsUse() and not adm.userIsSuperAdmin(uid=usr['ID_USER']):
            li = layers.layerInfo(layer_id=usr['LAYER_ID'])
            layer_disabed = li['DISABLED']
            if layer_disabed is not None and layer_disabed != 0: #or layers.tar_layer_expired_days_remains(layer_id=usr['LAYER_ID']) <= 0:
                result['ERROR_CODE'] = 100
                result['ERROR_MSG'] = _('Ваша организация временно отключена. Обратитесь в службу поддержки, если считаете это необоснованным.')
                result['REDIRECT_CODE'] = 2
                result['REDIRECT_DATA'] = result['ERROR_MSG']
                return result

        if getattr(cfg, 'SKUD_INTEGRATION', False) and cpu.isPC() and getattr(cfg, 'SKUD_CHECK_PC', False):
            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:
                result['ERROR_CODE'] = 110
                result['ERROR_MSG'] = _('Доступ запрещён по данным СКУД!')
                result['REDIRECT_CODE'] = 2
                result['REDIRECT_DATA'] = result['ERROR_MSG']
                return result

        probros = False
        go_url = ''
        if not first_time:
            # заказан ли проброс для этого вида оборудования в конфиге
            probros = cfg.sessions_forward_to_last_iface_pc
            if probros:
                # читаем данные последней сессии
                error_msg, go_url, ses_info = sessions.session_last_session_info(uid=usr['ID_USER'], fio=usr['FIO'],
                                                                                 equip_kind='P')
                # ошибка получения информации о последней сессии
                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='P')

        # ошибка открытия сессии
        if error_msg:
            cpu.cherrypylog(error_msg, context='APP.SESSIONS')
            result['ERROR_CODE'] = 120
            result['ERROR_MSG'] = error_msg
            result['REDIRECT_CODE'] = 1
            result['REDIRECT_DATA'] = self.drawTemplate(templ=login_index,
                                                        data=[{'mes': error_msg}, {'langs': cpu.getConfigLangs()}],
                                                        draw_wo_login=True)
            return result

        # удаляем старую web-сессию
        if old_web_session_id:
            sessions.session_delete_old_web_session(old_web_session_id)

        # заполняем переменные сессии юзера
        create_user_session_class(login=username, 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'])

        # далее реализуем проброс

        # проброс в зависимости от настроек конфигурации и наличия последней сохранённой сессии
        # после регистрации (1-й вход) не делаем проброс в последнюю систему
        if not first_time and probros and go_url:
            # если error_msg пусто, то go_url заполнено - переходим в него
            cpu.cherrypylog(error_msg, context='APP.SESSIONS')
            result['ERROR_CODE'] = 0
            result['ERROR_MSG'] = None
            result['REDIRECT_CODE'] = 0
            result['REDIRECT_DATA'] = go_url
            return result
        else:
            # иначе - анализируем
            # получаем рекурсивно доступные системы, сортируя по cfg.systems_order
            systems = get_user_systems(uid=self.getUserVar("uid"), higher=None, recurse=1, use_layers=None)
            # если юзер не имеет прав ни на одну из систем
            if len(systems['datalist']) == 0:
                result['ERROR_CODE'] = 0
                result['ERROR_MSG'] = None
                result['REDIRECT_CODE'] = 1
                result['REDIRECT_DATA'] = self.drawTemplate(templ=login_index,
                                                            data=[{'mes': _('Пользователь не имеет прав ни на одну систему')},
                                                                  {'langs': cpu.getConfigLangs()}],
                                                            draw_wo_login=True)
                return result

            # если у юзера есть право на КУРС, то перебрасываем в него
            """KURS_link = '/KURS'
            KURS_found = False
            for dic in systems['datalist']:
                if KURS_link == dic['FULL_REF_NAME']:
                    KURS_found = True
                    KURS_id_system = dic['ID_SYSTEM']
                    break
            if KURS_found:
                raise cherrypy.HTTPRedirect(KURS_link+'/?id_system='+ str(KURS_id_system))
            """

            link_found = False
            FULL_REF_NAMES = map(lambda system: system['FULL_REF_NAME'], systems['datalist'])

            if first_time:
                # если у юзера есть право на одну из систем cfg.REDIRECT_LINKS_AFTER_REG, то пробрасываем в неё
                for link in cfg.REDIRECT_LINKS_AFTER_REG:
                    if link in FULL_REF_NAMES:
                        link_found = True
                        break
            else:
                # если у юзера есть право на одну из систем cfg.REDIRECT_LINKS, то пробрасываем в неё
                for link in cfg.REDIRECT_LINKS:
                    if link in FULL_REF_NAMES:
                        link_found = True
                        break

            if link_found:
                #raise cherrypy.HTTPRedirect(link+'/?id_system='+ str(link_id_system))
                result['ERROR_CODE'] = 0
                result['ERROR_MSG'] = None
                result['REDIRECT_CODE'] = 0
                result['REDIRECT_DATA'] = link
                return result

            # получаем доступные системы нулевого уровня, сортируя по cfg.systems_order
            systems0 = get_user_systems(uid=self.getUserVar("uid"), higher=None, recurse=0, use_layers=None)

            # если у юзера есть права более, чем на 1 систему - рисуем список систем на выбор
            if len(systems0['datalist']) > 1:
                #return self.drawTemplate(templ=choose_your_destiny,data=[systems0])
                result['ERROR_CODE'] = 0
                result['ERROR_MSG'] = None
                result['REDIRECT_CODE'] = 1
                result['REDIRECT_DATA'] = self.drawTemplate(templ=subsystem_list,
                                                            data=[systems0, {'system_name': _('Выберите систему'),
                                                                             'first_time': first_time}])
                return result

            # если у юзера есть право только на одну систему, то перебрасываем в неё
            if len(systems0['datalist']) == 1:
                #self.setSesVar("id_system",systems0['datalist'][0]['ID_SYSTEM'])
                #raise cherrypy.HTTPRedirect(systems0['datalist'][0]['FULL_REF_NAME']+'/?id_system='+ str(self.getSesVar("id_system")))
                #print "if len(systems0['datalist'])==1:"
                #raise cherrypy.HTTPRedirect(systems0['datalist'][0]['FULL_REF_NAME']+'/?id_system='+ str(systems0['datalist'][0]['ID_SYSTEM']))
                result['ERROR_CODE'] = 0
                result['ERROR_MSG'] = None
                result['REDIRECT_CODE'] = 0
                result['REDIRECT_DATA'] = systems0['datalist'][0]['FULL_REF_NAME']
                return result
Exemple #16
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'])
Exemple #17
0
    def conlog_conlog(self,
                      develId=None,
                      dtBeg=None,
                      dtEnd=None,
                      idBase=None,
                      ip=None):
        """ip - один из ip-адресов разработчика, на которые выдан тикет
        """
        #import time
        #time_beg=time.time()

        # 0. Обработка входных параметров

        develId = self.cInt(develId)

        dtBeg = self.cDateTime(dtBeg)
        if dtBeg is None:
            dtBeg = '01.01.2000'

        dtEnd = self.cStrE(dtEnd)
        if dtEnd is None:
            dtEnd = '01.01.2100'
        else:
            dtEnd = dtEnd + ' 23:59:59'
        dtEnd = self.cDateTime(dtEnd)

        idBase = self.cInt(idBase)
        ip = self.cStrE(ip)
        if ip is None:
            ip = ''

        # 1. Получить таблицу A без поля WHOS

        conlog_lst_ro = db.dbExecDirect(sql = "select ip, max(access_stamp) last_access, count(*) cnt" \
                                      " from K_IP_ACCESS_LOG where " + pu.iif(ip, "IP='"+ip+"'", '1=1') +
                                      " and access_stamp between ? and ? " \
                                      " group by ip " \
                                      " order by 3 desc ",
                                  params=(dtBeg,
                                          dtEnd),
                                  fetch='all',
                                  id_base=idBase
                             )['datalist']

        # не r/o-набор данных с заполненным полем WHOS
        conlog_lst = []

        # По каждой записи (cur_ip) таблицы A:
        # Получить список devels = [{'DEVEL_ID': 1585, 'DEVEL_FIO': 'Робот'}, {...}, ...] по тикетам, которые были активны в момент коннекта

        for dic_ro in conlog_lst_ro:
            devels = []

            cur_ip = dic_ro['IP']
            cnt = dic_ro['cnt']

            # Большие не запрашиваем

            if cnt > 400:
                #добавляем строку в conlog_lst и заполняем поле "кто" '???'
                #копируем текущую строку conlog_lst_ro в conlog_lst
                dic = {}
                #по столбцам
                for key, val in dic_ro.items():
                    dic[key] = val
                #WHOS
                dic['WHOS'] = "..."
                conlog_lst.append(dic)

            else:
                devels = self.get_devels(ip=cur_ip,
                                         dtBeg=dtBeg,
                                         dtEnd=dtEnd,
                                         idBase=idBase)

                # Если есть фильтр по "кто" и среди devels нет этого "кто", то исключаем строку из таблицы A
                if develId and develId not in map(lambda d: d['DEVEL_ID'],
                                                  devels):
                    # просто строку не включаем
                    pass

                # иначе добавляем строку в conlog_lst и заполняем поле "кто" списком всех DEVEL_FIO
                else:
                    #копируем текущую строку conlog_lst_ro в conlog_lst
                    dic = {}
                    #по столбцам
                    for key, val in dic_ro.items():
                        dic[key] = val
                    #WHOS
                    dic['WHOS'] = reduce(
                        lambda all_s, d: all_s + ', ' + d['DEVEL_FIO'], devels,
                        '')[2:]
                    conlog_lst.append(dic)

        conlog_lst = {'datalist': conlog_lst}

        #print "conlog_conlog Exec Time: ", time.time()-time_beg

        return self.drawTemplate(templ=conlog_master, data=[conlog_lst])
Exemple #18
0
    def ajaxTicketDel(self, ticketId):
        #Ищем idBase
        idBase = self.dbExec(sql="select ID_BASE from T_TICKETS where TICKET_ID=?",
                             params=[self.cInt(ticketId)],
                             fetch='one')['ID_BASE']

        #Мультибазная транзакция
        conEngine = db.getConEng()
        group = dbEngine.ConnectionGroup()
        try:
            conDb = db.getConDb(idBase)
            group.add(conDb)
            #conEngine.commit()
            group.add(conEngine)
            group.begin()

            try:
                dic = db.dbExec(sql="select TICKET, DELETED_TIME, DEVEL_ID, ID_BASE, PERM from T_MARK_DEL(?)",
                                  params=[self.cInt(ticketId)],
                                  fetch='one',
                                  id_system=-1,
                                  con=conEngine,
                                  conEngine=conEngine
                                  )
                db.dbExecDirect(sql="delete from K_IP_CHECK where TICKET_ID=?",
                                  params=[self.cInt(ticketId)],
                                  fetch='none',
                                  id_base=idBase,
                                  con=conDb,
                                  conEngine=conEngine
                                  )
            except:
                if group.count(): group.rollback()
                raise
            else:
                group.commit()

        finally:
            group.disband() #disband the group so that member connections can operate independently again.

        if dic is not None:
            deleted_time = formatMxDateTime(dic['DELETED_TIME'], format='%H:%M', sformatFrom='%H:%M:%S')
            ticket = dic['TICKET']
            idBase = dic['ID_BASE']
            perm = dic['PERM']
            #db_info = self.dbExec(sql="select DB_IP, DB_NAME, SERVER_IP, SERVER_USER from ENGINE_GET_BASES_INFO(?)", params=[self.cInt(idBase)], fetch='one')
            #if db_info is None:
            #    raise TicketsException('Base with ID=%s not found!' % idBase)
            #dbs = db.get_bases_info(idBase)['dbs']
            #if len(dbs) == 0:
            #    raise TicketsException('Base with ID=%s not found!' % idBase)
            #db_info = dbs[0]
            db_info = db.get_bases_info(idBase)

            server_user = db_info['SERVER_USER']
            server_ip = db_info['SERVER_IP']
            db_ip = db.db_ip_to_private(db_info['DB_IP'])
            db_name = db_info['DB_NAME']

            dublin.dropLink(link_location=ticket, user=server_user, ip=server_ip)
            pu.send_devel_mail(subject='Тикет удалён', body='Тикет: %s\nIP/port: %s\nБД: %s\nID тикета: %s\nПерманент: %s\nВремя удаления: %s%s' \
                % (ticket, db_ip, db_name, ticketId, pu.iif(perm, 'Да', 'Нет'), deleted_time, signature), id_devel=dic['DEVEL_ID'])
            return self.pyDumps(ext_data={'TICKET': ticket, 'DELETED_TIME': deleted_time})
        else:
            return self.pyDumps(ext_data={'TICKET': 'no', 'DELETED_TIME': 'no'})