Beispiel #1
0
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'
Beispiel #2
0
    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')
Beispiel #3
0
    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')))
Beispiel #4
0
    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