def test_02(self): """ Ok scenario. """ sheet = Sheet() self.assertEqual(sheet.captions, []) self.assertEqual(len(sheet), 0) self.assertEqual(sheet.rows, []) sheet.add_column(u'a') self.assertEqual(sheet.captions, [u'a']) self.assertEqual(sheet.captions_index, {u'a': 0}) sheet.add_columns([u'b', u'c']) self.assertEqual(sheet.captions, [u'a', u'b', u'c']) self.assertEqual(sheet.captions_index, {u'a': 0, u'b': 1, u'c': 2}) sheet.append_dict({u'a': 0, u'b': 1, u'c': 2}) self.assertEqual(sheet.rows[0].fields, [0, 1, 2]) sheet.append_iterable([2, 1, 3]) self.assertEqual(sheet.rows[1].fields, [2, 1, 3]) sheet.append(range(3)) sheet.append({u'a': 'ddd', u'b': 'lll', u'c': (1, 2, 3)})
def join(self, caption): """ Joins all sheets into one. Sheets names are stored in column with given ``caption``. .. warning:: An assumption is made, that all sheets have the same columns. """ if not self.names: # No sheets in spreadsheet, return empty sheet. return Sheet(captions=[caption]) assigned_sheet = self.sheets[self.names[0]] sheet = Sheet(captions=assigned_sheet.captions + [caption]) for assigned_sheet in self.sheets.values(): for row in assigned_sheet.row_dicts: row[caption] = assigned_sheet.name sheet.append_dict(row) return sheet
def dump_query_to_sheet(self, queryset, sheet_mapping, sheet=None): """ Dumps query to sheet. """ mapping = [] captions = [] related = set() for caption, parts in sheet_mapping: captions.append(caption) mapping.append((caption, parts)) if len(parts) > 1: related.add(u'__'.join(parts[:-1])) if sheet is None: sheet = Sheet() sheet.add_columns(captions) for obj in queryset.select_related(*related): info = {} for caption, field in mapping: info[caption] = unicode(get_field_value(obj, field)) sheet.append_dict(info) return sheet
def dump_query_to_sheet( queryset, sheet=None, fields=None, exclude=None, join_rules=None, merge_rules=None): """ Dumps query to sheet. If ``sheet`` is None, then creates one. :param fields: what fields from object to include, if None then all. :param exclude: what fields from object to exclude, if None then none. :param join_rules: what relationships to join_rules by field. :param merge_rules: what relationships to merge_rules into sheet. (``get`` method must return an item or raise DoesNotExist error). :returns: sheet object. """ if sheet is None: sheet = Sheet() if len(queryset) < 1: return sheet obj = queryset[0] if fields is None: fields = collect_fields(obj, exclude) def modifier(sheet, row): """ Changes fields to Unicode strings. """ new_row = collections.defaultdict(unicode) for field_name, (obj, field) in row.items(): if obj is not None: display_attr = 'get_{0}_display'.format(field.name) if hasattr(obj, display_attr): new_row[field_name] = getattr(obj, display_attr)() else: value = getattr(obj, field.name) if value is None: new_row[field_name] = u'' else: new_row[field_name] = value else: new_row[field_name] = field return new_row sheet.add_insert_validator(modifier) sheet.add_columns([field.verbose_name for field in fields]) mergable = {} joinable = {} merge_rules = merge_rules or () join_rules = join_rules or () for related_obj in obj._meta.get_all_related_objects(): if related_obj.name in merge_rules: model = related_obj.model merge_fields = collect_fields(model, ('id',)) mergable[related_obj.name] = merge_fields, model sheet.add_columns([ field.verbose_name for field in merge_fields ]) for field_name, model_name, kwargs in join_rules: if model_name == related_obj.name: model = related_obj.model field = model._meta.get_field(field_name) joinable[related_obj.name.split(':')[1]] = field, kwargs sheet.add_column(field.verbose_name) break for obj in queryset: row = dict([(field.verbose_name, (obj, field)) for field in fields]) for full_name, (merge_fields, model) in mergable.items(): name = full_name.split(':')[1] try: related_obj = getattr(obj, name) for field in merge_fields: row[field.verbose_name] = related_obj, field except model.DoesNotExist: pass for name, (field, (filter_kwargs, exclude_kwargs)) in ( joinable.items()): query = getattr(obj, '{0}_set'.format(name)).all() row[field.verbose_name] = None, join( query.filter(**filter_kwargs).exclude(**exclude_kwargs), field.name) sheet.append_dict(row) return sheet