Exemple #1
0
    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)})
Exemple #2
0
    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
Exemple #3
0
    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
Exemple #4
0
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