Coverage for /var/srv/projects/api.amasfac.comuna18.com/tmp/venv/lib/python3.9/site-packages/tablib/formats/_ods.py: 26%

55 statements  

« prev     ^ index     » next       coverage.py v6.4.4, created at 2023-07-17 14:22 -0600

1""" Tablib - ODF Support. 

2""" 

3 

4import numbers 

5from io import BytesIO 

6 

7from odf import opendocument, style, table, text 

8 

9bold = style.Style(name="bold", family="paragraph") 

10bold.addElement(style.TextProperties(fontweight="bold", fontweightasian="bold", fontweightcomplex="bold")) 

11 

12 

13class ODSFormat: 

14 title = 'ods' 

15 extensions = ('ods',) 

16 

17 @classmethod 

18 def export_set(cls, dataset): 

19 """Returns ODF representation of Dataset.""" 

20 

21 wb = opendocument.OpenDocumentSpreadsheet() 

22 wb.automaticstyles.addElement(bold) 

23 

24 ws = table.Table(name=dataset.title if dataset.title else 'Tablib Dataset') 

25 wb.spreadsheet.addElement(ws) 

26 cls.dset_sheet(dataset, ws) 

27 

28 stream = BytesIO() 

29 wb.save(stream) 

30 return stream.getvalue() 

31 

32 @classmethod 

33 def export_book(cls, databook): 

34 """Returns ODF representation of DataBook.""" 

35 

36 wb = opendocument.OpenDocumentSpreadsheet() 

37 wb.automaticstyles.addElement(bold) 

38 

39 for i, dset in enumerate(databook._datasets): 

40 ws = table.Table(name=dset.title if dset.title else 'Sheet%s' % (i)) 

41 wb.spreadsheet.addElement(ws) 

42 cls.dset_sheet(dset, ws) 

43 

44 stream = BytesIO() 

45 wb.save(stream) 

46 return stream.getvalue() 

47 

48 @classmethod 

49 def dset_sheet(cls, dataset, ws): 

50 """Completes given worksheet from given Dataset.""" 

51 _package = dataset._package(dicts=False) 

52 

53 for i, sep in enumerate(dataset._separators): 

54 _offset = i 

55 _package.insert((sep[0] + _offset), (sep[1],)) 

56 

57 for row_number, row in enumerate(_package, start=1): 

58 is_header = row_number == 1 and dataset.headers 

59 style = bold if is_header else None 

60 odf_row = table.TableRow(stylename=style) 

61 ws.addElement(odf_row) 

62 for j, col in enumerate(row): 

63 if isinstance(col, numbers.Number): 

64 cell = table.TableCell(valuetype="float", value=col) 

65 else: 

66 cell = table.TableCell(valuetype="string") 

67 cell.addElement(text.P(text=str(col), stylename=style)) 

68 odf_row.addElement(cell) 

69 

70 @classmethod 

71 def detect(cls, stream): 

72 if isinstance(stream, bytes): 

73 # load expects a file-like object. 

74 stream = BytesIO(stream) 

75 try: 

76 opendocument.load(stream) 

77 return True 

78 except Exception: 

79 return False