INLINE SUBREPORTS
=================

Inline SubReports can be used to show little boxes in a master/detail report.
There are other needs it can be useful.

This is just the same SubReport test, but with subreport detail band changed to
be inline.

    >>> import os
    >>> cur_dir = os.path.dirname(os.path.abspath(__file__))

    >>> from django.contrib.auth.models import User, Permission

    >>> from reportlab.lib.pagesizes import A4
    >>> from reportlab.lib.units import cm
    >>> from reportlab.lib.enums import TA_CENTER, TA_RIGHT
    >>> from reportlab.lib.colors import navy, red
    
    >>> from geraldo import Report, ReportBand, Label, ObjectValue, SystemField,\
    ...     FIELD_ACTION_COUNT, FIELD_ACTION_SUM, BAND_WIDTH, Line, ReportGroup,\
    ...     SubReport

Report class

    >>> class MasterReport(Report):
    ...     title = 'Subreports demonstration'
    ... 
    ...     class band_summary(ReportBand):
    ...         height = 0.8*cm
    ...         elements = [
    ...             Label(text="Users count:", top=0.1*cm, left=0),
    ...             ObjectValue(attribute_name='id', top=0.1*cm, left=4*cm,\
    ...                 action=FIELD_ACTION_COUNT, display_format='%s users found'),
    ...         ]
    ...         borders = {'top': Line(stroke_color=red, stroke_width=3)}
    ... 
    ...     class band_page_header(ReportBand):
    ...         height = 0.8*cm
    ...         elements = [
    ...             SystemField(expression='%(report_title)s', top=0.1*cm, left=0, width=BAND_WIDTH,
    ...                 style={'fontName': 'Helvetica-Bold', 'fontSize': 14, 'alignment': TA_CENTER}),
    ...             SystemField(expression='Page # %(page_number)d of %(page_count)d', top=0.1*cm,
    ...                 width=BAND_WIDTH, style={'alignment': TA_RIGHT}),
    ...         ]
    ...         borders = {'bottom': Line(stroke_color=red, stroke_width=3)}
    ... 
    ...     class band_page_footer(ReportBand):
    ...         height = 0.5*cm
    ...         elements = [
    ...             Label(text='Created with Geraldo Reports', top=0.1*cm),
    ...             SystemField(expression='Printed in %(now:%Y, %b %d)s at %(now:%H:%M)s', top=0.1*cm,
    ...                 width=BAND_WIDTH, style={'alignment': TA_RIGHT}),
    ...         ]
    ...         borders = {'top': Line(stroke_color=navy)}
    ... 
    ...     class band_detail(ReportBand):
    ...         height = 2*cm
    ...         elements = [
    ...             Label(text="Username", top=0, left=0, style={'fontName': 'Helvetica-Bold', 'fontSize': 14}),
    ...             Label(text="Full name", top=1*cm, left=0.2*cm, style={'fontName': 'Helvetica-Bold'}),
    ...             Label(text="Superuser", top=1.5*cm, left=0.2*cm, style={'fontName': 'Helvetica-Bold'}),
    ...             ObjectValue(attribute_name='username', top=0, left=4*cm, style={'fontName': 'Helvetica', 'fontSize': 14}),
    ...             ObjectValue(attribute_name='get_full_name', top=1*cm, left=4*cm, style={'fontName': 'Helvetica'}),
    ...             ObjectValue(attribute_name='is_superuser', top=1.5*cm, left=4*cm, style={'fontName': 'Helvetica'}),
    ...         ]
    ...         borders = {'bottom': Line(stroke_color=navy)}
    ... 
    ...     subreports = [
    ...         SubReport(
    ...             queryset_string = '%(object)s.user_permissions.all()',
    ...             band_header = ReportBand(
    ...                     height=0.9*cm,
    ...                     elements=[
    ...                         Label(text='ID', top=0.2*cm, left=0.2*cm, style={'fontName': 'Helvetica-Bold'}),
    ...                         Label(text='Name', top=0.2*cm, left=4*cm, style={'fontName': 'Helvetica-Bold'}),
    ...                     ],
    ...                 ),
    ...             band_detail = ReportBand(
    ...                     height=1.3*cm,
    ... 
    ...                     # This is a new attribute to force the band width
    ...                     width = 6*cm,
    ... 
    ...                     # This attribute forces a distance at right and bottom sides of the band
    ...                     margin_right = 0.2*cm,
    ...                     margin_bottom = 0.2*cm,
    ...         
    ...                     # With this attribute as True, the band will try to align in
    ...                     # the same line
    ...                     display_inline = True,
    ...     
    ...                     elements=[
    ...                         ObjectValue(attribute_name='id', top=0.1*cm, left=0.2*cm),
    ...                         ObjectValue(attribute_name='name', top=0.7*cm, left=0.2*cm),
    ...                     ],
    ...                     borders={'all': True},
    ...                 ),
    ...             band_footer = ReportBand(
    ...                     height=0.9*cm,
    ...                     elements=[
    ...                         ObjectValue(attribute_name='id', top=0.2*cm, left=4*cm,\
    ...                             action=FIELD_ACTION_COUNT, display_format='%s permissions found',
    ...                             style={'fontName': 'Helvetica-Bold'}),
    ...                     ],
    ...                 ),
    ...         ),
    ...     ]

Setting permissions

    >>> u1 = User.objects.get(id=1)
    >>> for perm in Permission.objects.all()[:25]:
    ...     u1.user_permissions.add(perm)

    >>> u5 = User.objects.get(id=5)
    >>> for perm in Permission.objects.all()[:5]:
    ...     u5.user_permissions.add(perm)

Initializing report

    >>> queryset = User.objects.order_by('username')

    >>> report = MasterReport(queryset=queryset)

PDF common generation with users

    >>> from geraldo.generators import PDFGenerator

    >>> report.generate_by(PDFGenerator, filename=os.path.join(cur_dir, 'output/inline-subreports-report.pdf'))

Page with half height

    >>> report.page_size = (A4[0], A4[1] / 2)
    >>> report.generate_by(PDFGenerator, filename=os.path.join(cur_dir, 'output/inline-subreports-report-half-height.pdf'))

Text generation

    >>> from geraldo.generators import TextGenerator

    >>> report.generate_by(TextGenerator, filename=os.path.join(cur_dir, 'output/inline-subreports-report.txt'), to_printer=False, encode_to='latin-1')

