def show_story(self, ar, story, stripped=True, **kwargs): """Render the given story as reStructuredText to stdout.""" from lino.core.actors import Actor from lino.core.tables import TableRequest from lino.core.requests import ActionRequest try: for item in forcetext(story): if iselement(item): print(to_rst(item, stripped)) elif isinstance(item, type) and issubclass(item, Actor): ar = item.default_action.request(parent=ar) self.show_table(ar, stripped=stripped, **kwargs) elif isinstance(item, DashboardItem): self.show_story( ar, item.render(ar), stripped, **kwargs) elif isinstance(item, TableRequest): self.show_table(item, stripped=stripped, **kwargs) # print(item.table2rst(*args, **kwargs)) elif isinstance(item, ActionRequest): # example : courses.StatusReport in dashboard assert item.renderer is not None self.show_story(ar, item.actor.get_story(None, ar), **kwargs) elif isiterable(item): self.show_story(ar, item, stripped, **kwargs) # for i in self.show_story(ar, item, *args, **kwargs): # print(i) else: raise Exception("Cannot handle %r" % item) except Warning as e: print(e)
def insert_html(self, html, **kw): if html is None or html == '': # Testing for `if not html:` caused a FutureWarning: The # behavior of this method will change in future versions. # Use specific 'len(elem)' or 'elem is not None' test # instead. return '' if iselement(html): html = tostring(html) try: html = html2xhtml(html) except Exception as e: raise Exception( "20150923 html2xhtml(%r) failed: %s" % (html, e)) # dd.logger.info("20180831 insert_html() got:<<<\n%s\n>>>", html) # print(__file__, ">>>") # print(html) # print("<<<", __file__) try: return self.renderXhtml(html, **kw) except Exception as e: if not isinstance(html, six.string_types): raise # some sax parsers refuse unicode strings. # appy.pod always expects utf-8 encoding. # See /blog/2011/0622. html = html.encode('utf-8') # logger.info("20120726 renderXhtml(%r) failed : %s", html, e) return self.renderXhtml(html, **kw)
def show_story(self, ar, story, stripped=True, **kwargs): """ Render the given story and return it as a raw HTML string. Ignore `stripped` because it makes no sense in HTML. """ from lino.core.actors import Actor from lino.core.tables import TableRequest from lino.core.requests import ActionRequest elems = [] try: for item in forcetext(story): # print("20180907 {}".format(item)) if isinstance(item, str): elems.append(item) elif iselement(item): # 20200501 elems.append(item) elems.append(tostring(item)) elif isinstance(item, type) and issubclass(item, Actor): ar = item.default_action.request(parent=ar) # 20200501 elems.extend(self.table2story(ar, **kwargs)) elems += [tostring(e) for e in self.table2story(ar, **kwargs)] elif isinstance(item, TableRequest): assert item.renderer is not None # 20200501 elems.extend(self.table2story(item, **kwargs)) elems += [tostring(e) for e in self.table2story(item, **kwargs)] elif isinstance(item, ActionRequest): # example : courses.StatusReport in dashboard assert item.renderer is not None # 20200501 elems.append(self.show_story(ar, item.actor.get_story(None, ar), **kwargs)) elems += [tostring(e) for e in self.show_story(ar, item.actor.get_story(None, ar), **kwargs)] elif isinstance(item, DashboardItem): elems.extend(item.render(ar, **kwargs)) # html = self.show_story(ar, item.render(ar), **kwargs) # elems.append(html) # # 20200501 if len(html): # # elems.append(E.div( # # html, # # CLASS="dashboard-item " + item.actor.actor_id.replace(".","-") if getattr(item, "actor", False) else "" # if html: # should always be a string, never a list # if hasattr(item, "actor"): # css_class = "dashboard-item " + item.actor.actor_id.replace(".","-") # else: # css_class = '' # elems.append('<div class="{}">{}</div>'.format(css_class, html)) elif isiterable(item): elems.append(self.show_story(ar, item, **kwargs)) # for i in self.show_story(item, *args, **kwargs): # yield i else: raise Exception("Cannot handle story item %r" % item) except Warning as e: elems.append(str(e)) # print("20180907 show_story in {} : {}".format(ar.renderer, elems)) # return E.div(*elems) if len(elems) else "" if len(elems): return "<div>{}</div>".format(''.join(elems)) return ""
def show_story(self, ar, story, stripped=True, **kwargs): """Render the given story as an HTML element. Ignore `stripped` because it makes no sense in HTML. """ from lino.core.actors import Actor from lino.core.tables import TableRequest elems = [] try: for item in forcetext(story): if iselement(item): elems.append(item) elif isinstance(item, type) and issubclass(item, Actor): ar = item.default_action.request(parent=ar) elems.append(self.table2story(ar, **kwargs)) elif isinstance(item, TableRequest): assert item.renderer is not None elems.append(self.table2story(item, **kwargs)) elif isiterable(item): elems.append(self.show_story(ar, item, **kwargs)) # for i in self.show_story(item, *args, **kwargs): # yield i else: raise Exception("Cannot handle %r" % item) except Warning as e: elems.append(str(e)) return E.div(*elems)
def insert_html(self, html, **kw): if not HAS_TIDYLIB: raise Exception("You must install tidylib on your system") if html is None or html == '': # Testing for `if not html:` caused a FutureWarning: The # behavior of this method will change in future versions. # Use specific 'len(elem)' or 'elem is not None' test # instead. return '' if iselement(html): html = tostring(html) try: html = html2xhtml(html) except Exception as e: raise Exception( "20150923 html2xhtml(%r) failed: %s" % (html, e)) # dd.logger.info("20180831 insert_html() got:<<<\n%s\n>>>", html) # print(__file__, ">>>") # print(html) # print("<<<", __file__) try: return self.renderXhtml(html, **kw) except Exception as e: if not isinstance(html, six.string_types): raise # some sax parsers refuse unicode strings. # appy.pod always expects utf-8 encoding. # See /blog/2011/0622. html = html.encode('utf-8') # logger.info("20120726 renderXhtml(%r) failed : %s", html, e) return self.renderXhtml(html, **kw)
def ar2workbook(ar, column_names=None): from openpyxl import Workbook from openpyxl.styles import Font # local import to avoid the following traceback: # Error in sys.exitfunc: # Traceback (most recent call last): # File "/usr/lib/python2.7/atexit.py", line 24, in _run_exitfuncs # func(*targs, **kargs) # File "/openpyxl/writer/write_only.py", line 38, in _openpyxl_shutdown # for path in ALL_TEMP_FILES: # TypeError: 'NoneType' object is not iterable # workbook = Workbook(guess_types=True) # removed `guess_types=True` because it caused trouble in openpyxl # 3.4.0 and because I don't know whether it is needed. workbook = Workbook() sheet = workbook.active sheet.title = sheet_name(ar.get_title()) bold_font = Font( name='Calibri', size=11, bold=True, ) fields, headers, widths = ar.get_field_info(column_names) for c, column in enumerate(fields): sheet.cell(row=1, column=c + 1).value = str(headers[c]) sheet.cell(row=1, column=c + 1).font = bold_font # sheet.col(c).width = min(256 * widths[c] / 7, 65535) # 256 == 1 character width, max width=65535 for c, column in enumerate(fields): for r, row in enumerate(ar.data_iterator, start=1): sf = column.field._lino_atomizer value = sf.full_value_from_object(row, ar) if type(value) == bool: value = value and 1 or 0 elif isinstance(value, (Duration, Choice)): value = str(value) elif iselement(value): value = to_rst(value) # dd.logger.info("20160716 %s", value) elif isinstance(value, Promise): value = str(value) elif isinstance(value, IncompleteDate): if value.is_complete(): value = value.as_date() else: value = str(value) elif isinstance(value, Model): value = str(value) sheet.cell(row=r + 1, column=c + 1).value = value return workbook
def obj2html(self, ar, obj, text=None, **kwargs): """Return a html representation of a pointer to the given database object. Examples see :ref:`obj2href`. """ if text is None: # text = (force_text(obj),) text = (str(obj),) elif isinstance(text, six.string_types) or iselement(text): text = (text,) url = self.obj2url(ar, obj) if url is None: return E.em(*text) return self.href_button(url, text, **kwargs)
def obj2html(self, ar, obj, text=None, **kwargs): """Return a html representation of a pointer to the given database object. Examples see :ref:`obj2href`. """ if text is None: # text = (force_text(obj),) text = (str(obj),) elif isinstance(text, str) or iselement(text): text = (text,) url = self.obj2url(ar, obj) if url is None: return E.em(*text) return self.href_button(url, text, **kwargs)
def show_story(self, ar, story, stripped=True, **kwargs): """ Render the given story and return it as an HTML tree DIV element. Ignore `stripped` because it makes no sense in HTML. """ from lino.core.actors import Actor from lino.core.tables import TableRequest from lino.core.requests import ActionRequest elems = [] try: for item in forcetext(story): # print("20180907 {}".format(item)) if iselement(item): elems.append(item) elif isinstance(item, type) and issubclass(item, Actor): ar = item.default_action.request(parent=ar) elems.extend(self.table2story(ar, **kwargs)) elif isinstance(item, TableRequest): assert item.renderer is not None elems.extend(self.table2story(item, **kwargs)) elif isinstance(item, ActionRequest): # example : courses.StatusReport in dashboard assert item.renderer is not None elems.append( self.show_story(ar, item.actor.get_story(None, ar), **kwargs)) elif isinstance(item, DashboardItem): html = self.show_story(ar, item.render(ar), **kwargs) if html: elems.append( E.div(html, CLASS="dashboard-item " + item.actor.actor_id.replace(".", "-") if getattr(item, "actor", False) else "")) elif isiterable(item): elems.append(self.show_story(ar, item, **kwargs)) # for i in self.show_story(item, *args, **kwargs): # yield i else: raise Exception("Cannot handle %r" % item) except Warning as e: elems.append(str(e)) # print("20180907 show_story in {} : {}".format(ar.renderer, elems)) return E.div(*elems) if elems else ""
def story2odt(self, story, *args, **kw): from lino.core.actors import Actor from lino.core.tables import TableRequest for item in story: if iselement(item): yield toxml(html2odf(item)) elif isinstance(item, type) and issubclass(item, Actor): sar = self.ar.spawn(item, *args, **kw) yield self.insert_table(sar) elif isinstance(item, TableRequest): # logger.info("20141211 story2odt %s", item) yield self.insert_table(item) elif isiterable(item): for i in self.story2odt(item, *args, **kw): yield i else: raise Exception("Cannot handle %r" % item)
def show_story(self, ar, story, stripped=True, **kwargs): """ Render the given story as an HTML element. Ignore `stripped` because it makes no sense in HTML. A story is an iterable of things that can be rendered. """ from lino.core.actors import Actor from lino.core.tables import TableRequest from lino.core.requests import ActionRequest elems = [] try: for item in forcetext(story): # print("20180907 {}".format(item)) if iselement(item): elems.append(item) elif isinstance(item, type) and issubclass(item, Actor): ar = item.default_action.request(parent=ar) elems.extend(self.table2story(ar, **kwargs)) elif isinstance(item, TableRequest): assert item.renderer is not None elems.extend(self.table2story(item, **kwargs)) elif isinstance(item, ActionRequest): # example : courses.StatusReport in dashboard assert item.renderer is not None elems.append(self.show_story(ar, item.actor.get_story(None, ar), **kwargs)) elif isinstance(item, DashboardItem): elems.append(E.div( self.show_story(ar, item.render(ar), **kwargs), CLASS="dashboard-item " + item.actor.actor_id.replace(".","-") if getattr(item, "actor", False) else "" )) elif isiterable(item): elems.append(self.show_story(ar, item, **kwargs)) # for i in self.show_story(item, *args, **kwargs): # yield i else: raise Exception("Cannot handle %r" % item) except Warning as e: elems.append(str(e)) # print("20180907 show_story in {} : {}".format(ar.renderer, elems)) return E.div(*elems) if elems else ""
def ar2workbook(ar, column_names=None): from openpyxl import Workbook from openpyxl.styles import Font from openpyxl.styles import NamedStyle # local import to avoid the following traceback: # Error in sys.exitfunc: # Traceback (most recent call last): # File "/usr/lib/python2.7/atexit.py", line 24, in _run_exitfuncs # func(*targs, **kargs) # File "/openpyxl/writer/write_only.py", line 38, in _openpyxl_shutdown # for path in ALL_TEMP_FILES: # TypeError: 'NoneType' object is not iterable # workbook = Workbook(guess_types=True) # removed `guess_types=True` because it caused trouble in openpyxl # 3.4.0 and because I don't know whether it is needed. workbook = Workbook() sheet = workbook.active sheet.title = sheet_name(ar.get_title()) duration_style = NamedStyle(name='duration', number_format="[hh]:mm;@") bold_font = Font( name='Calibri', size=11, bold=True, ) fields, headers, widths = ar.get_field_info(column_names) for c, column in enumerate(fields): sheet.cell(row=1, column=c + 1).value = str(headers[c]) sheet.cell(row=1, column=c + 1).font = bold_font # sheet.col(c).width = min(256 * widths[c] / 7, 65535) # 256 == 1 character width, max width=65535 for c, column in enumerate(fields): for r, row in enumerate(ar.data_iterator, start=1): sf = column.field._lino_atomizer value = sf.full_value_from_object(row, ar) style = None if type(value) == bool: value = value and 1 or 0 elif isinstance(value, Choice): value = str(value) elif isinstance(value, Duration): style = duration_style negative = False time = str(value) if time.startswith("-"): time = time.strip("-") negative = True time = time.split(":") value = datetime.timedelta(hours=int(time[0]), minutes=int(time[1])) if negative: # Make negative. value = value - value - value elif iselement(value): value = to_rst(value) # dd.logger.info("20160716 %s", value) elif isinstance(value, Promise): value = str(value) elif isinstance(value, IncompleteDate): if value.is_complete(): value = value.as_date() else: value = str(value) elif isinstance(value, Model): value = str(value) elif isinstance(value, str): # if it is a future.newstr, change it to a real string to avoid # ValueError: Cannot convert 'Hans Altenberg' to Excel value = str(value) try: cell = sheet.cell(row=r + 1, column=c + 1) if style is not None: cell.style = style cell.value = value except ValueError as e: raise Exception("20190222 {} {}".format( value.__class__, value)) return workbook