def default(self, obj): if isinstance(obj, datetime): r = obj.isoformat(' ') if obj.microsecond: r = r[:23] + r[26:] if r.endswith('+00:00'): r = r[:-6] + 'Z' return r elif isinstance(obj, timedelta): return format_dttd(obj, "%H:%M") elif obj is None: return "None" else: return super(DjangoJSONEncoder, self).default(obj)
def default(self, obj): if isinstance(obj, datetime): r = obj.isoformat(" ") if obj.microsecond: r = r[:23] + r[26:] if r.endswith("+00:00"): r = r[:-6] + "Z" return r elif isinstance(obj, timedelta): return format_dttd(obj, "%H:%M") elif obj is None: return "None" else: return super(DjangoJSONEncoder, self).default(obj)
def print_shifts(self): # Grab current month date-object and prepare the PDF title date = self.context['month'] pdfTitle = 'Arbeitsstunden ' + date.strftime('%B %Y') buffer = self.buffer doc = SimpleDocTemplate(buffer, pagesize=self.pagesize, title=pdfTitle) # Our container for 'Flowable' objects elements = [] # Define styles we'll use in this main thing styles = getSampleStyleSheet() styles.add(ParagraphStyle(name='centered', alignment=TA_CENTER)) styles.add(ParagraphStyle(name='NormalText', fontName='OpenSans-Regular', fontSize=10)) styles.add(ParagraphStyle(name='NormalCenteredText', alignment=TA_CENTER, fontName='OpenSans-Regular', fontSize=10)) styles.add(ParagraphStyle(name='BoldText', alignment=TA_CENTER, fontName='OpenSans-Bold', fontSize=10)) styles.add(ParagraphStyle(name='TitleBoldCentered', alignment=TA_CENTER, fontName='OpenSans-Bold', fontSize=12)) styles.add(ParagraphStyle(name='TitleCentered', alignment=TA_CENTER, fontName='OpenSans-Regular', fontSize=10)) # Add text on top of the first page elements.append(Paragraph(u'Vorlage zur Dokumentation der täglichen Arbeitszeit nach § 17 MiLoG<br /><br />' u'Wichtig:', styles['TitleBoldCentered'])) elements.append(Spacer(1, 4)) elements.append(Paragraph(u'Die Aufzeichnungen sind mindestens wöchentlich zu führen, denn es besteht ' u'die Verpflichtung </para><para fontName="OpenSans-Italic">"Beginn, Ende und Dauer ' u'der täglichen Arbeitszeit spätestens bis zum Ablauf des siebten auf den Tag der ' u'Arbeitsleistung folgenden Kalendertages aufzuzeichnen und diese Aufzeichnungen ' u'mindestens zwei Jahre beginnend ab dem für die Aufzeichnung maßgelblichen ' u'Zeitpunkt aufzubewahren.“', styles['TitleCentered'])) elements.append(Spacer(1, 6)) # Add boxes above the table boxes = [BoxyLine(width=doc.width, height=20, text_label="FB / Institut / Abteilung", text_box=self.context['department']), Spacer(1, 4), BoxyLine(width=doc.width, height=20, text_label="Name des Mitarbeiters", text_box=self.context['fullname']), Spacer(1, 4), BoxyLine(width=100 + 155, height=20, text_label="Pers. Nr. (falls vorhanden)", text_box=""), BoxyLine(x=196, y=+5, width=100 + 155, height=20, text_label="Monat / Jahr", text_box=date.strftime("%m") + " / " + date.strftime("%Y"))] for box in boxes: elements.append(box) elements.append(Spacer(1, 18)) # Prepare header line and append it to the table list h1_date = Paragraph('''Datum''', styles["BoldText"]) h2_start = Paragraph('''Beginn<br />(Uhrzeit)''', styles["BoldText"]) h3_pause = Paragraph('''Pause<br />(von - bis)''', styles["BoldText"]) h4_end = Paragraph('''Ende<br />(Uhrzeit)''', styles["BoldText"]) h5_total = Paragraph('''Dauer<br />(Summe ohne Pausen)''', styles["BoldText"]) h6_cmnt = Paragraph('''*''', styles["BoldText"]) table_data = [[h1_date, h2_start, h3_pause, h4_end, h5_total, h6_cmnt]] shifts = self.context['shift_list'] # Go through all shifts and format them accordingly i = 0 for i, shift in enumerate(shifts): # Not sure why, but timezone.localtime() is not working here. # Instead timezone.template_localtime() is, so we're using it.. dum-dee-doo.. b1_date = timezone.template_localtime(shift.shift_started).strftime('%d.%m.%Y') # e.g. 24.12.2016 b2_start = timezone.template_localtime(shift.shift_started).strftime("%H:%M") # e.g. 08:15 b3_pause = shift.pause_start_end # e.g. 08:15 - 15:55 b4_end = timezone.template_localtime(shift.shift_finished).strftime("%H:%M") # e.g. 15:55 b5_total = format_dttd(shift.shift_duration, "%H:%M") # e.g. 07:40 b6_cmnt = shift.key # e.g. "K" or "U" # We want every cell content to be an own paragraph, so we can give it a certain style. # As always there is probably some other smart solution, but this works. body_row = [] body_cells = [b1_date, b2_start, b3_pause, b4_end, b5_total, b6_cmnt] for cell in body_cells: body_row.append(Paragraph(cell, styles['NormalCenteredText'])) table_data.append(body_row) # Append new empty lines while we haven't reached the full page capacity! if i < 18: f = i while f < 19: table_data.append(['', '', '', '', '', '']) f += 1 total_shift_duration = '' if self.context['total_shift_duration'] > timedelta(seconds=0): total_shift_duration = format_dttd(self.context['total_shift_duration'], "%H:%M") table_data.append(['', '', '', 'Summe:', total_shift_duration, '']) # Create the table. Column width are set to fit the current data correctly. shift_table = Table(table_data, colWidths=(22.5*mm, 22.5*mm, 27.5*mm, 22.5*mm, 45*mm, 12.5*mm)) shift_table.setStyle(TableStyle([ ('INNERGRID', (0, 0), (-1, -2), 0.25, colors.black), ('BOX', (0, 0), (-1, -2), 0.25, colors.black), ('INNERGRID', (3, -1), (4, -1), 0.25, colors.black), # Custom grid for last row ('BOX', (3, -1), (4, -1), 0.25, colors.black), # Custom border for last row ('BACKGROUND', (0, 0), (-1, 0), colors.lightgrey), ('ALIGN', (0, 0), (-1, -1), 'CENTER'), ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), ])) elements.append(shift_table) doc.build(elements, onFirstPage=self._header_footer, onLaterPages=self._header_footer,) # canvasmaker=NumberedCanvas) # Get the value of the BytesIO buffer and write it to the response. pdf = buffer.getvalue() buffer.close() return pdf
def print_shifts(self): # Grab current month date-object and prepare the PDF title date = self.context['month'] pdfTitle = 'Arbeitsstunden ' + date.strftime('%B %Y') buffer = self.buffer doc = SimpleDocTemplate(buffer, pagesize=self.pagesize, title=pdfTitle) # Our container for 'Flowable' objects elements = [] # Define styles we'll use in this main thing styles = getSampleStyleSheet() styles.add(ParagraphStyle(name='centered', alignment=TA_CENTER)) styles.add( ParagraphStyle(name='NormalText', fontName='OpenSans-Regular', fontSize=10)) styles.add( ParagraphStyle(name='NormalCenteredText', alignment=TA_CENTER, fontName='OpenSans-Regular', fontSize=10)) styles.add( ParagraphStyle(name='BoldText', alignment=TA_CENTER, fontName='OpenSans-Bold', fontSize=10)) styles.add( ParagraphStyle(name='TitleBoldCentered', alignment=TA_CENTER, fontName='OpenSans-Bold', fontSize=12)) styles.add( ParagraphStyle(name='TitleCentered', alignment=TA_CENTER, fontName='OpenSans-Regular', fontSize=10)) # Add text on top of the first page elements.append( Paragraph( 'Vorlage zur Dokumentation der täglichen Arbeitszeit nach ' '§ 17 MiLoG<br /><br /> Wichtig:', styles['TitleBoldCentered'])) elements.append(Spacer(1, 4)) elements.append( Paragraph( 'Die Aufzeichnungen sind mindestens wöchentlich zu führen,' 'denn es besteht die Verpflichtung </para>' '<para fontName="OpenSans-Italic">"Beginn, Ende und Dauer ' 'der täglichen Arbeitszeit spätestens bis zum Ablauf des ' 'siebten auf den Tag der Arbeitsleistung folgenden ' 'Kalendertages aufzuzeichnen und diese Aufzeichnungen ' 'mindestens zwei Jahre beginnend ab dem für die Aufzeichnung ' 'maßgelblichen Zeitpunkt aufzubewahren.“', styles['TitleCentered'])) elements.append(Spacer(1, 6)) # Add boxes above the table boxes = [ BoxyLine(width=doc.width, height=20, text_label="FB / Institut / Abteilung", text_box=self.context['department']), Spacer(1, 4), BoxyLine(width=doc.width, height=20, text_label="Name des Mitarbeiters", text_box=self.context['fullname']), Spacer(1, 4), BoxyLine(width=100 + 155, height=20, text_label="Pers. Nr. (falls vorhanden)", text_box=""), BoxyLine(x=196, y=+5, width=100 + 155, height=20, text_label="Monat / Jahr", text_box=date.strftime("%m") + " / " + date.strftime("%Y")) ] for box in boxes: elements.append(box) elements.append(Spacer(1, 18)) # Prepare header line and append it to the table list h1_date = Paragraph('''Datum''', styles["BoldText"]) h2_start = Paragraph('''Beginn<br />(Uhrzeit)''', styles["BoldText"]) h3_pause = Paragraph('''Pause<br />(von - bis)''', styles["BoldText"]) h4_end = Paragraph('''Ende<br />(Uhrzeit)''', styles["BoldText"]) h5_total = Paragraph('''Dauer<br />(Summe ohne Pausen)''', styles["BoldText"]) h6_cmnt = Paragraph('''*''', styles["BoldText"]) table_data = [[h1_date, h2_start, h3_pause, h4_end, h5_total, h6_cmnt]] shifts = self.context['shift_list'] # Go through all shifts and format them accordingly i = 0 for i, shift in enumerate(shifts): # Not sure why, but timezone.localtime() is not working here. # Instead timezone.template_localtime() is, so we're using it b1_date = timezone.template_localtime( shift.shift_started).strftime('%d.%m.%Y') # e.g. 24.12.2016 b2_start = timezone.template_localtime( shift.shift_started).strftime("%H:%M") # e.g. 08:15 b3_pause = shift.pause_start_end # e.g. 08:15 - 15:55 b4_end = timezone.template_localtime( shift.shift_finished).strftime("%H:%M") # e.g. 15:55 b5_total = format_dttd(shift.shift_duration, "%H:%M") # e.g. 07:40 b6_cmnt = shift.key # e.g. "K" or "U" # We want every cell content to be an own paragraph, so we can give # it a certain style. As always there is probably some other smart # solution, but this works. body_row = [] body_cells = [ b1_date, b2_start, b3_pause, b4_end, b5_total, b6_cmnt ] for cell in body_cells: body_row.append(Paragraph(cell, styles['NormalCenteredText'])) table_data.append(body_row) # Append new empty lines while we haven't reached the full page # capacity! if i < 18: f = i while f < 19: table_data.append(['', '', '', '', '', '']) f += 1 total_shift_duration = '' if self.context['total_shift_duration'] > timedelta(seconds=0): total_shift_duration = format_dttd( self.context['total_shift_duration'], "%H:%M") table_data.append(['', '', '', 'Summe:', total_shift_duration, '']) # Create the table. Column width are set to fit the current data # correctly. shift_table = Table(table_data, colWidths=(22.5 * mm, 22.5 * mm, 27.5 * mm, 22.5 * mm, 45 * mm, 12.5 * mm)) shift_table.setStyle( TableStyle([ ('INNERGRID', (0, 0), (-1, -2), 0.25, colors.black), ('BOX', (0, 0), (-1, -2), 0.25, colors.black), ('INNERGRID', (3, -1), (4, -1), 0.25, colors.black), # Custom grid for last row ('BOX', (3, -1), (4, -1), 0.25, colors.black), # Custom border for last row ('BACKGROUND', (0, 0), (-1, 0), colors.lightgrey), ('ALIGN', (0, 0), (-1, -1), 'CENTER'), ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'), ])) elements.append(shift_table) doc.build( elements, onFirstPage=self._header_footer, onLaterPages=self._header_footer, ) # canvasmaker=NumberedCanvas) # Get the value of the BytesIO buffer and write it to the response. pdf = buffer.getvalue() buffer.close() return pdf