Item tables
This commit is contained in:
parent
529dcb86d3
commit
f1729225f3
4 changed files with 49 additions and 10 deletions
|
@ -1,5 +1,3 @@
|
||||||
from reportlab.graphics.charts.textlabels import Label
|
|
||||||
from reportlab.graphics.shapes import Drawing
|
|
||||||
from reportlab.lib.units import inch
|
from reportlab.lib.units import inch
|
||||||
from reportlab.platypus import Paragraph, Table, TableStyle
|
from reportlab.platypus import Paragraph, Table, TableStyle
|
||||||
from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet
|
from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet
|
||||||
|
@ -19,15 +17,24 @@ class CodeSnippet(Paragraph):
|
||||||
|
|
||||||
|
|
||||||
class SimpleTable(Table):
|
class SimpleTable(Table):
|
||||||
style = TableStyle([
|
|
||||||
('INNERGRID', (0, 0), (-1, -1), .25, colors.black),
|
|
||||||
('BOX', (0, 0), (-1, -1), .25, colors.black),
|
|
||||||
])
|
|
||||||
|
|
||||||
def __init__(self, data, horizontal_align=None):
|
def __init__(self, data, horizontal_align=None):
|
||||||
Table.__init__(self, data, hAlign=horizontal_align)
|
Table.__init__(self, data, hAlign=horizontal_align)
|
||||||
|
|
||||||
|
|
||||||
|
class TableWithHeader(Table):
|
||||||
|
def __init__(self, data, horizontal_align=None):
|
||||||
|
Table.__init__(self, data, hAlign=horizontal_align)
|
||||||
|
|
||||||
|
style = TableStyle([
|
||||||
|
('INNERGRID', (0, 0), (-1, -1), .25, colors.black),
|
||||||
|
('BOX', (0, 0), (-1, -1), .25, colors.black),
|
||||||
|
('BACKGROUND', (0, 0), (-1, -len(data)), colors.lightgrey),
|
||||||
|
('ALIGN', (0, 0), (-1, -1), 'CENTER'),
|
||||||
|
('VALIGN', (0, 0), (-1, -1), 'MIDDLE')
|
||||||
|
])
|
||||||
|
self.setStyle(style)
|
||||||
|
|
||||||
|
|
||||||
class PaidStamp(object):
|
class PaidStamp(object):
|
||||||
def __init__(self, x, y):
|
def __init__(self, x, y):
|
||||||
self.x = x
|
self.x = x
|
||||||
|
|
|
@ -60,12 +60,17 @@ class Item(object):
|
||||||
:param unit_price: Unit price
|
:param unit_price: Unit price
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
|
# TODO: add vat/tax, subtotal
|
||||||
self.item_id = item_id
|
self.item_id = item_id
|
||||||
self.name = name
|
self.name = name
|
||||||
self.description = description
|
self.description = description
|
||||||
self.units = units
|
self.units = units
|
||||||
self.unit_price = unit_price
|
self.unit_price = unit_price
|
||||||
|
|
||||||
|
@property
|
||||||
|
def subtotal(self):
|
||||||
|
return int(self.units) * self.unit_price
|
||||||
|
|
||||||
|
|
||||||
class Transaction(object):
|
class Transaction(object):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
from datetime import datetime, date
|
from datetime import datetime, date
|
||||||
|
from reportlab.lib.enums import TA_CENTER
|
||||||
from reportlab.lib.pagesizes import letter
|
from reportlab.lib.pagesizes import letter
|
||||||
|
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
|
||||||
from reportlab.lib.units import inch
|
from reportlab.lib.units import inch
|
||||||
from reportlab.platypus import SimpleDocTemplate
|
from reportlab.platypus import SimpleDocTemplate, Paragraph
|
||||||
from pyinvoice.components import SimpleTable
|
from pyinvoice.components import SimpleTable, TableWithHeader
|
||||||
from pyinvoice.models import PDFInfo, Item, Transaction, InvoiceInfo, ServiceProviderInfo, ClientInfo
|
from pyinvoice.models import PDFInfo, Item, Transaction, InvoiceInfo, ServiceProviderInfo, ClientInfo
|
||||||
|
|
||||||
|
|
||||||
|
@ -87,4 +89,22 @@ class SimpleInvoice(SimpleDocTemplate):
|
||||||
('country', 'Country'), ('post_code', 'Post code'), ('email', 'Email'), ('client_id', 'Client id')]
|
('country', 'Country'), ('post_code', 'Post code'), ('email', 'Email'), ('client_id', 'Client id')]
|
||||||
story.append(SimpleTable(self.__attribute_to_table_data(self.client_info, props), horizontal_align='LEFT'))
|
story.append(SimpleTable(self.__attribute_to_table_data(self.client_info, props), horizontal_align='LEFT'))
|
||||||
|
|
||||||
|
item_table_paragraph_style = ParagraphStyle(
|
||||||
|
'ItemTableParagraph',
|
||||||
|
parent=getSampleStyleSheet()['Normal'],
|
||||||
|
alignment=TA_CENTER
|
||||||
|
)
|
||||||
|
|
||||||
|
item_data = [(
|
||||||
|
item.item_id,
|
||||||
|
item.name,
|
||||||
|
Paragraph(item.description, item_table_paragraph_style),
|
||||||
|
item.units,
|
||||||
|
item.unit_price,
|
||||||
|
item.subtotal
|
||||||
|
) for item in self._items if isinstance(item, Item)]
|
||||||
|
if item_data:
|
||||||
|
item_data.insert(0, ('Item id', 'Name', 'Description', 'Units', 'Unit Price', 'Subtotal'))
|
||||||
|
story.append(TableWithHeader(item_data, horizontal_align='LEFT'))
|
||||||
|
|
||||||
self.build(story)
|
self.build(story)
|
9
test.py
9
test.py
|
@ -1,9 +1,12 @@
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from pyinvoice.models import InvoiceInfo, ServiceProviderInfo, ClientInfo
|
from decimal import Decimal
|
||||||
|
from pyinvoice.models import InvoiceInfo, ServiceProviderInfo, ClientInfo, Item
|
||||||
from pyinvoice.templates import SimpleInvoice
|
from pyinvoice.templates import SimpleInvoice
|
||||||
|
|
||||||
doc = SimpleInvoice('test.pdf')
|
doc = SimpleInvoice('test.pdf')
|
||||||
|
|
||||||
doc.invoice_info = InvoiceInfo('1024', datetime.now(), datetime.now())
|
doc.invoice_info = InvoiceInfo('1024', datetime.now(), datetime.now())
|
||||||
|
|
||||||
doc.service_provider_info = ServiceProviderInfo(
|
doc.service_provider_info = ServiceProviderInfo(
|
||||||
name='PyInvoice',
|
name='PyInvoice',
|
||||||
street='My Street',
|
street='My Street',
|
||||||
|
@ -24,5 +27,9 @@ doc.client_info = ClientInfo(
|
||||||
post_code='Client Post code'
|
post_code='Client Post code'
|
||||||
)
|
)
|
||||||
|
|
||||||
|
doc.add_item(Item('0000', 'Item 0000', 'Item Description 1 Long--------------------------------Item Description 1 Long', 1, Decimal('1.1')))
|
||||||
|
doc.add_item(Item('1111', 'Item 1111', 'Item Description 2', 2, Decimal('2.2')))
|
||||||
|
doc.add_item(Item('2222', 'Item 2222', 'Item Description 3', 3, Decimal('3.3')))
|
||||||
|
|
||||||
# doc.build(story, onFirstPage=PaidStamp(7*inch, 5.8*inch))
|
# doc.build(story, onFirstPage=PaidStamp(7*inch, 5.8*inch))
|
||||||
doc.finish()
|
doc.finish()
|
Loading…
Reference in a new issue