def test_layout_format(session, principal): request = DummyRequest(session, principal) layout = Layout(None, request) # Date assert layout.principal.time_zone == 'Europe/Zurich' assert layout.format_date(date(2019, 1, 2), 'date') == '02.01.2019' assert layout.format_date(datetime(2019, 1, 2, 12), 'date') == '02.01.2019' assert layout.format_date(datetime(2019, 1, 2, 12), 'date_long') == \ '2. Januar 2019' assert layout.format_date(datetime(2019, 1, 2, 12), 'datetime') == \ '02.01.2019 12:00' assert layout.format_date( standardize_date(datetime(2019, 1, 2, 12, 0), 'UTC'), 'date') == '02.01.2019' assert layout.format_date( standardize_date(datetime(2019, 1, 2, 12, 0), 'UTC'), 'datetime') == '02.01.2019 13:00' # Issue with raises(AssertionError): layout.format_issue(None) with raises(AssertionError): layout.format_issue('') assert layout.format_issue(Issue()) == 'No. , ' assert layout.format_issue(Issue(number=1, date=date(2017, 1, 2))) == 'No. 1, 02.01.2017' assert layout.format_issue( Issue(number=1, date=date(2017, 1, 2)), date_format='date_with_weekday') == 'No. 1, Montag 02.01.2017' assert layout.format_issue(Issue(name='2017-1', number=1, date=date(2017, 1, 2)), notice=GazetteNotice()) == 'No. 1, 02.01.2017' assert layout.format_issue( Issue(name='2017-1', number=1, date=date(2017, 1, 2)), notice=GazetteNotice(issues=['2017-1'])) == 'No. 1, 02.01.2017' assert layout.format_issue( Issue(name='2017-1', number=1, date=date(2017, 1, 2)), notice=GazetteNotice( _issues={'2017-1': 10})) == 'No. 1, 02.01.2017 / 10' # Text assert layout.format_text(None) == '' assert layout.format_text('abc') == 'abc' assert layout.format_text('a\nb\r\nc') == 'a<br>b<br>c'
def on_request(self): session = self.request.session # populate organization (active root elements with no children or # active children (but not their parents)) self.organization.choices = [] self.organization.choices.append( ('', self.request.translate(_("Select one")))) query = session.query(Organization) query = query.filter(Organization.active.is_(True)) query = query.filter(Organization.parent_id.is_(None)) query = query.order_by(Organization.order) for root in query: if root.children: for child in root.children: if child.active: self.organization.choices.append( (child.name, child.title)) else: self.organization.choices.append((root.name, root.title)) # populate categories query = session.query(Category.name, Category.title) query = query.filter(Category.active.is_(True)) query = query.order_by(Category.order) self.category.choices = query.all() # populate issues now = utcnow() layout = Layout(None, self.request) self.issues.choices = [] query = session.query(Issue) query = query.order_by(Issue.date) if self.request.is_private(self.model): query = query.filter(date.today() < Issue.date) # publisher else: query = query.filter(now < Issue.deadline) # editor for issue in query: self.issues.choices.append( (issue.name, layout.format_issue(issue, date_format='date_with_weekday'))) if now >= issue.deadline: self.issues.render_kw['data-hot-issue'] = issue.name # Remove the print only option if not publisher if not self.request.is_private(self.model): self.delete_field('print_only')
def on_request(self): session = self.request.session layout = Layout(None, self.request) def title(item): return item.title if item.active else '({})'.format(item.title) # populate organization (root elements with no children or children # (but not their parents)) self.organization.choices = [] self.organization.choices.append( ('', self.request.translate(_("Select one")))) query = session.query(Organization) query = query.filter(Organization.parent_id.is_(None)) query = query.order_by(Organization.order) for root in query: if root.children: for child in root.children: self.organization.choices.append( (child.name, title(child))) else: self.organization.choices.append((root.name, title(root))) # populate categories self.category.choices = [] query = session.query(Category) query = query.order_by(Category.order) for category in query: self.category.choices.append((category.name, title(category))) # populate issues del self.issues.render_kw['data-limit'] self.issues.choices = [] query = session.query(Issue) query = query.order_by(Issue.date) for issue in query: self.issues.choices.append( (issue.name, layout.format_issue(issue, date_format='date_with_weekday')))
def from_issue(cls, issue, request, first_publication_number, links=None): """ Generate a PDF for one issue. Uses `first_publication_number` as a starting point for assigning publication numbers. Uses the existing numbers of the notices if None. """ # Collect the data data = [] session = request.session used_categories = cls.query_used_categories(session, issue) used_organizations = cls.query_used_organizations(session, issue) excluded_notices = cls.query_excluded_notices_count(session, issue) if used_categories and used_organizations: categories = session.query(Category) categories = categories.filter(Category.name.in_(used_categories)) categories = categories.order_by(Category.order).all() roots = session.query(Organization).filter_by(parent_id=None) roots = roots.order_by(Organization.order) for root in roots: root_data = [] if not root.children: for category in categories: notices = cls.query_notices(session, issue.name, root.name, category.name) if notices: root_data.append({ 'title': category.title, 'notices': notices }) else: for child in root.children: if child.name not in used_organizations: continue child_data = [] for category in categories: notices = cls.query_notices( session, issue.name, child.name, category.name) if notices: child_data.append({ 'title': category.title, 'notices': notices }) if child_data: root_data.append({ 'title': child.title, 'children': child_data, 'break_after': True if child_data else False }) if root_data: data.append({'title': root.title, 'children': root_data}) # Generate the PDF layout = Layout(None, request) title = '{} {}'.format(request.translate(_("Gazette")), layout.format_issue(issue, date_format='date')) file = BytesIO() pdf = cls(file, title=title, author=request.app.principal.name, logo=request.app.logo_for_pdf) pdf.init_a4_portrait(page_fn=page_fn_header_logo_and_footer, page_fn_later=page_fn_header_and_footer) pdf.h(title) pdf.excluded_notices_note(excluded_notices, request) pdf.unfold_data(session, layout, issue.name, data, first_publication_number) # add a final page with links if links: if not isinstance(pdf.story[-1], PageBreak): pdf.pagebreak() pdf.h2(request.translate(_("Additional Links"))) def paragraphs(): for url, title in links.items(): yield f'<b>{title}</b><br><a href="{url}">{url}</a>' html = "\n".join(f'<p>{p}</p>' for p in paragraphs()) pdf.mini_html(html) pdf.generate() file.seek(0) return file