def __init__(self, resolver, form, transaction, parameters): name = form.name() condition = form.condition() sorting = form.sorting() if condition is None: condition = parameters.get(name + '/' + pytis.output.P_CONDITION) if sorting is None: sorting = parameters.get(name + '/' + pytis.output.P_SORTING) super(_FormDataIterator, self).__init__(resolver, name, condition=condition, sorting=sorting, transaction=transaction)
def _make_agg_value(self, op, column): form = self._form if form is None: return lcg.Content() colid = column.id() if not pytis.form.has_access(form.name(), perm=pytis.data.Permission.VIEW, column=colid): return column.type().secret_export() data = form.data() condition = form.condition() return data.select_aggregate((op, colid,), condition=condition, transaction=self._transaction).value()
def _initial_dictionary(self, form, form_bindings, codebooks, current_row, parameters): dictionary = _ProxyDict() if form is not None: import pytis.form # must be placed before first `pytis' use here if current_row is None: dictionary['data'] = _FormDataIterator(self._resolver, form, transaction=self._transaction, parameters=parameters) else: # Using `data' iteration in row templates is most likely an error. # And since it may cause various performance or system problems we forbid it. dictionary['data'] = _FakeDataIterator() if current_row is None: current_row = form.current_row() if current_row is None: current_row_dictionary = LCGFormatter._DummyDict() else: current_row_dictionary = dict([(k, current_row.format(k, secure=True),) for k in current_row.keys() if not isinstance(current_row[k].type(), pytis.data.Binary)]) dictionary['current_row'] = current_row_dictionary dictionary['table'] = self._make_table dictionary['agg'] = agg = _ProxyDict() for name, op in(('min', pytis.data.Data.AGG_MIN,), ('max', pytis.data.Data.AGG_MAX,), ('count', pytis.data.Data.AGG_COUNT,), ('sum', pytis.data.Data.AGG_SUM,), ('avg', pytis.data.Data.AGG_AVG,),): def value(op=op): return self._make_agg(op) agg[name] = value if form_bindings: dictionary['Binding'] = binding_dictionary = _ProxyDict() for binding in form_bindings: form_name = binding.name() if form_name is None: continue if ((pytis.form.has_access(form_name) and pytis.form.has_access(form_name, perm=pytis.data.Permission.PRINT))): # I tried to use closure here, but it produced unexpected results class MakeBinding(object): def __init__(self, binding, processor, current_row): self._binding = binding self._current_row = current_row self._processor = processor def __call__(self): return self._processor(self._binding, self._current_row) binding_id = re.sub('[^A-Za-z0-9_]', '_', binding.id()) binding_dictionary[binding_id] = MakeBinding(binding, self._make_binding, current_row) if codebooks: dictionary['codebook'] = codebook_dictionary = {} form_name = form.name() for field_id, cb_fields, cb in codebooks: permitted = current_row.permitted(field_id, pytis.data.Permission.VIEW) codebook_dictionary[field_id] = field_dictionary = _ProxyDict() for cb_id, _cb_label in cb_fields: if (permitted and pytis.form.has_access(cb, perm=pytis.data.Permission.VIEW, column=cb_id)): def cb_value(current_row=current_row, field_id=field_id, cb_id=cb_id): return current_row.cb_value(field_id, cb_id).export() else: def cb_value(current_row=current_row, field_id=field_id, cb_id=cb_id): return current_row.cb_value(field_id, cb_id).secret_export() field_dictionary[cb_id] = cb_value return dictionary