def _add_secondary_scale(self): """ add the secondary scale to the table (text + styles) """ Y_pos = 1 X_pos = 1 #write the label ps = ParagraphStyle('secondary_scale_label') ps.alignment = TA_RIGHT ps.fontName = self.DEFAULT_FONT ps.fontSize = self.DEFAULT_FONT_SIZE title = Paragraph(self.data.scale.secondary_label, ps) self.table[Y_pos][0] = title ps = ParagraphStyle('secondary_scale') ps.alignment = TA_CENTER ps.fontName = self.DEFAULT_FONT ps.fontSize = self.DEFAULT_FONT_SIZE #the secondary scale is not define the same way as the primary scale. #it's defined by groups of same label. (start_pos, start_end, item) # see ScaleData._group_scale() for details for group in self.data.scale.secondary_scale_groups: pos_start, pos_end, item = group p = Paragraph(item, ps) #draw the label in the middle of the similar cells self.table[Y_pos][int((pos_start+pos_end)/2)+1] = p #draw light border arrounds items self.styles.append(('BOX', (pos_start+X_pos,Y_pos), (pos_end+X_pos,Y_pos), 0.2, "#bbbbbb"))
def get_content(self, column_data, row_values, col_values): """return the content formated as defined in the constructor or in the column """ if self.value == None or self.value == False: return "" format = self.DEFAULT_FORMAT if self.format != None: format = self.format elif type(column_data) == DateColData and column_data.format != None: format = column_data.format value = super(DateCellData,self).get_content(column_data, row_values, col_values) if format != None: value = time.strftime(format, value) else: value = time.strftime(self.format, value) ps = ParagraphStyle('date_cell') ps.fontName = self.get_font(column_data) ps.fontSize = self.get_font_size(column_data) ps.alignment = self.get_align_code(column_data) res = Paragraph(c2c_helper.encode_entities(value), ps) return res
def get_content(self, column_data, row_values, col_values): """ return the content formated as defined in the constructor or in the column object """ value = self.value if value == None or value == False: return "" #should we trunc the text if self.truncate_length != None: value = c2c_helper.ellipsis(value, self.truncate_length, ellipsis="[...]") ps = ParagraphStyle('standard_text') ps.fontName = self.get_font(column_data) ps.fontSize = self.get_font_size(column_data) ps.alignment = self.get_align_code(column_data) #should we indent the content if self.indent != None: ps.leftIndent = self.indent * 2 * mm elif type(column_data) == TextColData and column_data.indent != None: ps.leftIndent = column_data.indent * 2 * mm p = Paragraph(c2c_helper.encode_entities(value), ps) return p
def _add_items(self): """ add labels and color to the table """ #X starting position X_pos = 0 if self.title != None: X_pos = 1 Y_pos = 0 cpt = 0 for i in self.items_order: #add the label txt = c2c_helper.encode_entities(self.items[i].label) ps = ParagraphStyle('color_legend') ps.alignment = TA_CENTER ps.fontName = self.DEFAULT_FONT ps.fontSize = self.DEFAULT_FONT_SIZE p = Paragraph(txt, ps) self.table[0][cpt+X_pos] = p #add the color self.styles.append(('BACKGROUND', (cpt+X_pos,0), (cpt+X_pos,0), self.items[i].color)) cpt+=1
def _build_table(self): """ return the list of list that represent the table structure """ line = [] if self.title != None: txt = c2c_helper.encode_entities(self.title) ps = ParagraphStyle('color_legend') ps.alignment = TA_CENTER ps.fontName = self.DEFAULT_FONT ps.fontSize = self.DEFAULT_FONT_SIZE p = Paragraph(txt, ps) line.append([p]) for i in self.items_order: line.append('') self.table.append(line) #global font for the whole graphic self.styles.append(('FONT', (0,0), (-1,-1),self.DEFAULT_FONT, self.DEFAULT_FONT_SIZE)) # main frame arround the whole table self.styles.append(('BOX', (0,0), (-1,-1), 1, "#000000")) #in cells, text start in the top left corner self.styles.append(('VALIGN', (0,0), (-1,-1), 'TOP')) if self.title != None: #background of the legend title self.styles.append(('BACKGROUND', (0,0), (0,0), "#cccccc"))
def _add_Y_items(self): """ add Y items labels to the chart (Text and styles). Add also light grid for their lines """ X_pos = 0 Y_pos = 3 #draw the items titles with the right indentation for i in self.data.items_order: item = self.data.items[i] ps = ParagraphStyle('indent') ps.fontName = self.DEFAULT_FONT ps.fontSize = self.DEFAULT_FONT_SIZE ps.leftIndent = item.indent * self.INDENT_SPACE p = Paragraph(self._encode_entities(item.label), ps) self.table[Y_pos + item.Y_pos][X_pos] = p #draw the inner grid for this lines start_X = X_pos end_X = -1 start_Y = Y_pos + item.Y_pos end_Y = Y_pos + item.Y_pos + item.line_number self.styles.append(('LINEABOVE', (start_X, end_Y), (end_X, end_Y), 0.2, "#bbbbbb")) self.styles.append(('LINEAFTER', (start_X, start_Y), (end_X, end_Y), 0.2, "#bbbbbb")) #line that separate the Y items and the datas self.styles.append(('LINEAFTER', (X_pos, Y_pos-2), (X_pos, -1), 1, colors.black))
def _add_main_scale(self): """ add the main scale to the table (text + style) """ Y_pos = 2 X_pos = 1 #write the label ps = ParagraphStyle('scale_label') ps.alignment = TA_RIGHT ps.fontName = self.DEFAULT_FONT ps.fontSize = self.DEFAULT_FONT_SIZE title = Paragraph(self.data.scale.main_label, ps) self.table[Y_pos][0] = title ps = ParagraphStyle('scale') ps.alignment = TA_CENTER ps.fontName = self.DEFAULT_FONT ps.fontSize = self.DEFAULT_FONT_SIZE #reduce the size of the font for large scales if len(self.data.scale.scale_items) > 80: ps.fontSize = 6 #add labels for each scale item #also add weekend grayed column cpt = X_pos for item in self.data.scale.scale_items: p = Paragraph(item, ps) self.table[Y_pos][cpt] = p #handle weekemd if self.data.scale.weekend[cpt-X_pos]: #light grey columns self.styles.append(('BACKGROUND', (cpt,Y_pos), (cpt,-1), "#dddddd")) cpt+= 1 #light grid beetween self.styles.append(('INNERGRID', (X_pos,Y_pos), (-1,Y_pos), 0.2, "#bbbbbb")) #line that separate the dates and the datas self.styles.append(('LINEBELOW', (0, Y_pos), (-1,Y_pos), 1, colors.black))
def get_title(self): """return the title of the col""" ps = ParagraphStyle('header') ps.fontName = self.header_font ps.fontSize = self.header_font_size ps.alignment = self.get_align_code() return Paragraph(self._title, ps)
def get_content(self, column_data, row_values, col_values): """ return the content of the cell, formated as define in the constructor or in the column object """ res = self.get_raw_content(column_data, row_values, col_values) ps = ParagraphStyle('num_cell') ps.fontName = self.get_font(column_data) ps.fontSize = self.get_font_size(column_data) ps.alignment = self.get_align_code(column_data) res = Paragraph(res, ps) return res
def get_content(self, column_data, row_values, col_values): """ return the content formated as defined in the constructor or in the column """ res = self.get_raw_content(column_data, row_values, col_values) if res == None or res == False or res == "": return "" res += " "+self.get_currency(column_data) ps = ParagraphStyle('money_cell') ps.fontName = self.get_font(column_data) ps.fontSize = self.get_font_size(column_data) ps.alignment = self.get_align_code(column_data) res = Paragraph(c2c_helper.encode_entities(res), ps) return res
def get_content(self, column_data, row_values, col_values): """ return the content formated as defined in the constructor or in the column """ res = self.get_raw_content(column_data, row_values, col_values) if res == None: return "" res += " "+self.get_currency(column_data) ps = ParagraphStyle('tot_money_cell') ps.fontName = self.get_font(column_data) ps.fontSize = self.get_font_size(column_data) #handle the alignment (if defined and different from the column alignement) ps.alignment = self.get_align_code(column_data) res = Paragraph(res, ps) return res