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
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