def executeMacro(self, row, field): try: for match in j.codetools.regex.getRegexMatches("\$\d*", field).matches: nr = int(match.founditem.replace("$", "")) field = field.replace(match.founditem, row[nr]) except: raise RuntimeError("Cannot process macro string for row, row was %s, field was %s" % (row, field)) field = field % row field = Confluence2HTML.findLinks(field) if field.find("{{") != -1: field = j.core.portal.active.macroexecutorPage.processMacrosInWikiContent(field) return field
def executeMacro(self, row, field): try: for match in j.tools.code.regex.getRegexMatches("\$\d*", field).matches: nr = int(match.founditem.replace("$", "")) field = field.replace(match.founditem, row[nr]) except: raise RuntimeError("Cannot process macro string for row, row was %s, field was %s" % (row, field)) field = field % row field = Confluence2HTML.findLinks(field) if field.find("{{") != -1: field = j.portal.server.active.macroexecutorPage.processMacrosInWikiContent(field) return field
def getData(self, namespace, category, key, **kwargs): datainfo = self.getFromCache(key) fieldids = datainfo['fieldids'] fieldvalues = datainfo['fieldvalues'] or fieldids filters = datainfo["filters"] or dict() nativequery = datainfo.get('nativequery') or dict() nativequery = copy.deepcopy(nativequery) filters = filters.copy() client = self.getClient(namespace, category) #pagin start = kwargs['iDisplayStart'] size = kwargs['iDisplayLength'] #sort sort = dict() if kwargs['iSortCol_0']: for i in xrange(int(kwargs['iSortingCols'])): colidx = kwargs['iSortCol_%s' % i] key = 'bSortable_%s' % colidx if kwargs[key] == 'true': colname = fieldids[int(colidx)] sort[colname] = 'asc' if kwargs['sSortDir_%s' % i] == 'asc' else 'desc' #filters partials = dict() for x in xrange(len(fieldids)): svalue = kwargs.get('sSearch_%s' % x) if kwargs['bSearchable_%s' % x] == 'true' and svalue: fieldname = fieldids[x] if svalue.isdigit(): if fieldname not in filters: filters[fieldname] = int(svalue) else: partials[fieldname] = '*%s*' % svalue.lower() #top search field if 'sSearch' in kwargs and kwargs['sSearch']: dummyobj = client.new() nativequery.setdefault('query', {}).setdefault('bool', {}).setdefault('must', []) nativequery.setdefault('query', {}).setdefault('bool', {}).setdefault('should', []) for idname in fieldids: if isinstance(getattr(dummyobj, idname, None), basestring): nativequery['query']['bool']['should'].append({'wildcard': {idname: '*%s*' % kwargs['sSearch'].lower()}}) nativequery total, inn = client.simpleSearch(filters, size=size, start=start, withtotal=True, sort=sort, partials=partials, withguid=True, nativequery=nativequery) result = {} result["sEcho"] = int(kwargs.get('sEcho', 1)) result["iTotalRecords"] = total result["iTotalDisplayRecords"] = total result["aaData"] = [] for row in inn: r = [] for field, fieldid in zip(fieldvalues, fieldids): if field in row: r.append(row[field]) elif j.basetype.integer.check(field): r.append(row[field]) elif j.basetype.string.check(field): r.append(self.executeMacro(row, field)) else: # is function field = field(row, fieldid) field = field or ' ' field = Confluence2HTML.findLinks(field) r.append(field) result["aaData"].append(r) return result
def getData(self, namespace, category, key, **kwargs): datainfo = self.getFromCache(key) fieldids = datainfo['fieldids'] fieldvalues = datainfo['fieldvalues'] or fieldids filters = datainfo["filters"] or dict() nativequery = datainfo.get('nativequery') or dict() nativequery = copy.deepcopy(nativequery) filters = filters.copy() nativequery.update(filters) client = self.getClient(namespace, category) # pagin start = int(kwargs['iDisplayStart']) if "iDisplayStart" in kwargs else 0 size = int(kwargs['iDisplayLength']) if "isDisplayLength" in kwargs else 200 qs = client.find(nativequery) qs = qs.limit(size) # filters partials = dict() for x in range(len(fieldids)): svalue = kwargs.get('sSearch_%s' % x) if kwargs['bSearchable_%s' % x] == 'true' and svalue: partials['%s__contains' % fieldids[x]] = int(svalue) if svalue.isdigit() else svalue if partials: query = Q() query.query = partials qs = qs.filter(query) # sort sort = [] if kwargs['iSortCol_0']: for i in range(int(kwargs['iSortingCols'])): colidx = kwargs['iSortCol_%s' % i] key = 'bSortable_%s' % colidx if kwargs[key] == 'true': colname = fieldids[int(colidx)] sort.append('%s%s' % ("+" if kwargs['sSortDir_%s' % i] == 'asc' else "-", colname)) if sort: qs = qs.order_by(*sort) def _getRegexQuery(fieldname, value, client): if not value.isdigit() and isinstance(getattr(client, fieldname), mongoengine.fields.IntField): return query = Q() query.query['%s__contains' % fieldname] = int(value) if value.isdigit() else value return query # top search field orquery = [] if 'sSearch' in kwargs and kwargs['sSearch']: orquery = list() for idname in fieldids: orquery.append(_getRegexQuery(idname, kwargs['sSearch'], client)) orquery = [orq for orq in orquery if orq] filters = list() filters = orquery[0] for query in orquery[1:]: if query: filters = filters | query qs = qs.filter(filters) if start: qs = qs.skip(start) total = qs.count() inn = qs.all() result = {} result["sEcho"] = int(kwargs.get('sEcho', 1)) result["iTotalRecords"] = total result["iTotalDisplayRecords"] = total result["aaData"] = [] for row in inn: r = [] for field, fieldid in zip(fieldvalues, fieldids): if str(field) in row: r.append(row[field]) elif j.data.types.string.check(field): r.append(self.executeMacro(row, field)) else: # is function field = field(row, fieldid) field = field or ' ' field = Confluence2HTML.findLinks(field) r.append(field) result["aaData"].append(r) return result
def getData(self, namespace, category, key, **kwargs): try: datainfo = self.getFromCache(key) except: raise exceptions.Gone('Table is not available anymore. Please refresh') fields = datainfo['fields'] filters = datainfo.get("filters") or dict() nativequery = datainfo.get('nativequery') or dict() nativequery = copy.deepcopy(nativequery) filters = filters.copy() nativequery.update(filters) fullquery = {'$query': nativequery} client = self.getClient(namespace, category) # pagin start = int(kwargs['iDisplayStart']) size = int(kwargs['iDisplayLength']) # sort sort = [] if kwargs['iSortCol_0']: for i in range(int(kwargs['iSortingCols'])): colidx = kwargs['iSortCol_%s' % i] key = 'bSortable_%s' % colidx if kwargs[key] == 'true': colname = fields[int(colidx)]['id'] sort.append((colname, 1 if kwargs['sSortDir_%s' % i] == 'asc' else -1)) if sort: fullquery['$orderby'] = sort def getRegexQuery(value): regextmpl = '%s' if value.startswith('!'): value = value[1:] if value: regextmpl = '^(?!.*%s).*$' query = {'$regex': regextmpl % value, '$options': 'i'} return query # filters for x in range(len(fields)): svalue = kwargs.get('sSearch_%s' % x) if kwargs.get('bSearchable_%s' % x) == 'true' and svalue: x += 1 fieldname = fields[x]['id'] fieldtype = fields[x].get('type', 'auto') if svalue.isdigit() and fieldtype != 'text': if fieldname not in filters: nativequery[fieldname] = int(svalue) else: try: q = json.loads(svalue) if isinstance(q, dict): nativequery[fieldname] = q else: nativequery[fieldname] = getRegexQuery(svalue) except: nativequery[fieldname] = getRegexQuery(svalue) # top search field if 'sSearch' in kwargs and kwargs['sSearch']: orquery = [] nativequery['$or'] = orquery for field in fields: orquery.append({field['id']: getRegexQuery(kwargs['sSearch'])}) queryresult = client.search(fullquery, size=size, start=start) total = queryresult[0] inn = queryresult[1:] result = {} result["sEcho"] = int(kwargs.get('sEcho', 1)) result["iTotalRecords"] = total result["iTotalDisplayRecords"] = total result["data"] = [] for row in inn: r = [] for fieldobj in fields: field = fieldobj['value'] fieldid = fieldobj['id'] if field in row or j.basetype.integer.check(field): value = row[field] if isinstance(value, basestring): value = cgi.escape(value) r.append(value) elif j.basetype.string.check(field): r.append(self.executeMacro(row, field)) else: # is function field = field(row, fieldid) field = field or ' ' field = Confluence2HTML.findLinks(field) r.append(field) result["data"].append(r) return result
def getData(self, namespace, category, key, **kwargs): try: datainfo = self.getFromCache(key) except: raise exceptions.Gone( 'Table is not available anymore. Please refresh') fieldids = datainfo['fieldids'] fieldvalues = datainfo['fieldvalues'] or fieldids filters = datainfo["filters"] or dict() nativequery = datainfo.get('nativequery') or dict() nativequery = copy.deepcopy(nativequery) filters = filters.copy() nativequery.update(filters) fullquery = {'$query': nativequery} client = self.getClient(namespace, category) #pagin start = kwargs['iDisplayStart'] size = kwargs['iDisplayLength'] #sort sort = [] if kwargs['iSortCol_0']: for i in range(int(kwargs['iSortingCols'])): colidx = kwargs['iSortCol_%s' % i] key = 'bSortable_%s' % colidx if kwargs[key] == 'true': colname = fieldids[int(colidx)] sort.append( (colname, 1 if kwargs['sSortDir_%s' % i] == 'asc' else -1)) if sort: fullquery['$orderby'] = sort def getRegexQuery(value): regextmpl = '%s' if value.startswith('!'): value = value[1:] if value: regextmpl = '^(?!.*%s).*$' query = {'$regex': regextmpl % value, '$options': 'i'} return query #filters partials = dict() for x in range(len(fieldids)): svalue = kwargs.get('sSearch_%s' % x) if kwargs.get('bSearchable_%s' % x) == 'true' and svalue: fieldname = fieldids[x] if svalue.isdigit(): if fieldname not in filters: nativequery[fieldname] = int(svalue) else: nativequery[fieldname] = getRegexQuery(svalue) #top search field if 'sSearch' in kwargs and kwargs['sSearch']: orquery = [] nativequery['$or'] = orquery for idname in fieldids: orquery.append({idname: getRegexQuery(kwargs['sSearch'])}) queryresult = client.search(fullquery, size=size, start=start) total = queryresult[0] inn = queryresult[1:] result = {} result["sEcho"] = int(kwargs.get('sEcho', 1)) result["iTotalRecords"] = total result["iTotalDisplayRecords"] = total result["data"] = [] for row in inn: r = [row.get('id', 'NA')] for field, fieldid in zip(fieldvalues, fieldids): if field in row: r.append(row[field]) elif j.basetype.integer.check(field): r.append(row[field]) elif j.basetype.string.check(field): r.append(self.executeMacro(row, field)) else: # is function field = field(row, fieldid) field = field or ' ' field = Confluence2HTML.findLinks(field) r.append(field) result["data"].append(r) return result