Example #1
0
    def _getfrow(self, props, view):
        frow = []

        def kd(keydata):
            return map(lambda s: s[0], keydata)

        #log('::::::::VIEW = %s' % view.id)
        for (key, groups) in props.iteritems():
            log
            found = False
            keydata = []
            for (gid, idl) in groups:
                if gid in view.groups:
                    found = True
                    k = (view.groups.index(gid) + 1)
                    field = 'id_prop%d' % k
                    #log((k, view.id_cat, idl))
                    row = sql.fin(field, idl)
                    row = (field, idl)
                    keydata.append(row)
            if not found:
                return None
            newkd = True
            #list1 = kd(keydata)
            #for keydata0 in frow:
            #    if list_compare(list1, kd(keydata0)):
            #        newkd = False
            #        for i in xrange(len(keydata)):
            #            pass
                        #list_update(keydata[i][1], keydata0[i][1])
            #        break

            if newkd:
                frow.append(keydata)
            #log('----------- KEYDATA FOR %s -------------' % key)
            #log(keydata)
            #log('----------- END KEYDATA ----------------------')
        f = map(lambda x: sql.f_or(map(lambda y: sql.fin(y[0], y[1]), x)), frow)
        f.append('pview = "%s"' % view.pview)
        f.append('id_prop1 = %d' % view.id_cat)
        return f
Example #2
0
    def parsefilter(self, ftext):
        """Метод, преобразовывающий метаописание в набор SQL-фильтров

	Функция преобразует созданный по определенным правилам текстовый шаблон
	в фильтр SQL-запроса (where), который обнулит наличие некоторых товаров
	на складе. Используется для удобного описания правил в заголовках Excel
	и Google Doc таблиц, по которым обновляется наличие товаров
	"""

        # список строк SQL-фильтра для отбора товаров
        # K - компоненты (свойства), характеризующие товар. 
        # Таких свойств может быть до 7 на каждое представление (View) товара.
        # Например, товар относится к категории "звезды" (k1=zvezdi),
        # и характеризуется некоторыми свойствами k2-k7 - цвет, размер и т.п.
        # Один товар может иметь несколько представлений, т.е. обладать разным
        # набором свойств K
        kfilter = []

        # список строк SQL-фильтра для отбора складов товаров
        sfilter = []

        cat = False
        ftext = real_translit(ftext.lower())

        # Объект <группа складов> - получается из базы вызовом
        # функции Get Property Group By Translit - 
        # получить группу свойств по коду свойства
        whgroup = db.fetchval('SELECT getpgbytr("stores")')

        for val in re.split(r'\,\s*', ftext):
            # Если в метаописании найдена инструкция по компонентному фильтру,
            # накладываемому для ограничения выборки товаров - расшифровать эту
            # инструкцию, и привести ее к виду строк SQL-фильтра
            if re.match(r'k\d=', val):
                propindex = toint(val[1:2])
                if propindex == 1:
                    cat = True
                propname = val[3:]
                propt    = real_translit(propname)
                prop = db.fetchobject('prop', propt, 'translit')
                if prop:
                    log("FILTER [K%d], ID %d = %s" % 
                        (propindex, prop.id, translit(propname)))
                else:
                    raise Exception("Property %s not found" % translit(propname))
                kfilter.append('ps.id_prop%d = %s' % (propindex, prop.id))

            # Если в метаописании найдена инструкция по очистке единиц хранения
            # товара перед загрузкой новых товаров - добавить ее в фильтр,
            # ограничивающий выбор товаров
            elif re.match(r'clear=', val):
                slist = []
                for store in re.split(r';\s*', val[6:]):
                    slist.append('translit RLIKE "%s"' % store)
                f = [sql.f_or(slist), 'id_group = %s' % whgroup]
                q = sql.get_f('id', 'prop', f)
                sfilter = db.fetchvals(q)

            # Если в метаописании найдена инструкция склада по умолчанию,
            # то установить склад по умолчанию
            elif re.match(r'default=', val):
                t = real_translit(val[8:])
                self.whdef = db.fetchobject('prop', t, 'translit')

        # Ограничить список товаров их главным представлением
        kfilter.append('ps.pview = "%s"' % gvar.view.pview)
        if not cat:
            kfilter.append('ps.id_prop1 = %s' % gvar.cat.id)

        # Список строк итогового SQL-фильтра
        f = []

        # Если есть ограничение по складам товаров - добавить его
        if sfilter:
            f.append(sql.fin('s.id_store', sfilter))

        # Если есть ограничение по компонентному фильтру - добавить его
        if kfilter:
            q = sql.get_f('ps.id', 'prop_set ps', 
                kfilter + ['ps.id_product = s.id_product'])
            f.append(sql.exists(q))
            self.kfilter = kfilter

        return f