Exemplo n.º 1
0
    def test_unlock_button_available_only_for_managers(self, browser):
        with freeze():
            self.login(self.regular_user, browser)
            with freeze(FREEZE_DATE):
                oc_url = self.fetch_document_checkout_oc_url(browser, self.document)

            expected_token = {
                u'action': u'checkout',
                u'documents': [u'createtreatydossiers000000000002'],
                u'exp': 4121033100,
                u'sub': u'kathi.barfuss',
                u'url': u'http://nohost/plone/oc_checkout',
                }
            raw_token = oc_url.split(':')[-1]
            token = jwt.decode(raw_token, JWT_SIGNING_SECRET_PLONE, algorithms=('HS256',))
            self.assertEqual(expected_token, token)

            self.lock_document(browser, raw_token, self.document)

            self.login(self.meeting_user, browser)
            browser.open(self.document)
            self.assertIn(self.locked_message, info_messages())
            self.assertNotIn(self.unlockable_message, info_messages())

            self.login(self.manager, browser)
            browser.open(self.document)
            self.assertNotIn(self.locked_message, info_messages())
            self.assertIn(self.unlockable_message, info_messages())
    def test_updating_agenda_item_will_update_modification_dates(
            self, browser):
        self.login(self.committee_responsible, browser)
        model = self.meeting.model

        creation_date = datetime(2017, 10, 16, 0, 0, tzinfo=pytz.utc)
        update_date = datetime(2018, 10, 16, 0, 0, tzinfo=pytz.utc)

        def generate_agendaitem_list(meeting):
            meeting_view = getMultiAdapter((self.meeting, self.request),
                                           name='view')
            browser.open(meeting_view.url_generate_agendaitem_list())

        # Generate first protocol
        with freeze(creation_date):
            generate_agendaitem_list(self.meeting)

        document = model.agendaitem_list_document.resolve_document()

        self.assertEqual(creation_date,
                         as_utc(document.modified().asdatetime()))
        self.assertEqual(creation_date, document.changed)

        # Update the protocol
        with freeze(update_date):
            generate_agendaitem_list(self.meeting)

        self.assertEqual(update_date, as_utc(document.modified().asdatetime()))
        self.assertEqual(update_date, document.changed)
Exemplo n.º 3
0
    def test_sets_journal_pdf_document_date_to_dossier_end_date(self, browser):
        """When the document date is not set to the dossiers end date the
        subdossier will be left in an inconsistent state. this will make
        resolving the main dossier impossible.
        """
        self.activate_feature('journal-pdf')
        self.login(self.secretariat_user, browser)

        subdossier = create(
            Builder('dossier').within(self.empty_dossier).having(
                start=date(2016, 1, 1), end=date(2016, 3, 15)).titled(u'Sub'))

        with self.observe_children(subdossier) as sub_children:
            with freeze(datetime(2016, 4, 25)):
                resolve_dossier(subdossier, browser)

        self.assertEquals(1, len(sub_children['added']))
        sub_journal_pdf, = sub_children['added']
        self.assertEqual(date(2016, 3, 15), sub_journal_pdf.document_date,
                         "End date should be set to dossier end date")

        with self.observe_children(self.empty_dossier) as main_children:
            with freeze(datetime(2016, 9, 1)):
                resolve_dossier(self.empty_dossier, browser)

        self.assertEquals(1, len(main_children['added']))
        main_journal_pdf, = main_children['added']
        self.assertEqual(date(2016, 3, 15),
                         IDossier(self.empty_dossier).end,
                         "End should be earliest possible date")
        self.assertEqual(date(2016, 3, 15), main_journal_pdf.document_date,
                         "Document date should be earliest possible date")
Exemplo n.º 4
0
    def test_updating_agenda_item_will_update_modification_dates(self, browser):
        self.login(self.committee_responsible, browser)
        model = self.meeting.model

        creation_date = datetime(2017, 10, 16, 0, 0, tzinfo=pytz.utc)
        update_date = datetime(2018, 10, 16, 0, 0, tzinfo=pytz.utc)

        def generate_agendaitem_list(meeting):
            meeting_view = getMultiAdapter(
                (self.meeting, self.request), name='view')
            browser.open(meeting_view.url_generate_agendaitem_list())

        # Generate first protocol
        with freeze(creation_date):
            generate_agendaitem_list(self.meeting)

        document = model.agendaitem_list_document.resolve_document()

        self.assertEqual(creation_date, as_utc(document.modified().asdatetime()))
        self.assertEqual(creation_date, document.changed)

        # Update the protocol
        with freeze(update_date):
            generate_agendaitem_list(self.meeting)

        self.assertEqual(update_date, as_utc(document.modified().asdatetime()))
        self.assertEqual(update_date, document.changed)
    def test_recently_touched_log_gets_rotated_on_write(self):
        self.login(self.regular_user)

        start = datetime(2018, 4, 30, 12, 45, tzinfo=get_localzone())
        # Touch a document to initialize the log
        with freeze(start):
            notify(ObjectTouchedEvent(self.document))

        recently_touched_log = self._get_log(self.regular_user)

        custom_limit = 5

        api.portal.set_registry_record(
            'limit', custom_limit, IRecentlyTouchedSettings)

        for i in range(custom_limit * 3):
            recently_touched_log.append(
                {'last_touched': start + timedelta(minutes=i), 'uid': str(i)})

        with freeze(FROZEN_NOW):
            notify(ObjectTouchedEvent(self.document))

        # Fetch the log again because it doesn't get rotated in place
        recently_touched_log = self._get_log(self.regular_user)

        self.assertEqual(custom_limit, len(recently_touched_log))

        expected = [
            {'last_touched': FROZEN_NOW, 'uid': 'createtreatydossiers000000000002'},  # noqa
            {'last_touched': datetime(2018, 4, 30, 12, 59, tzinfo=get_localzone()), 'uid': '14'},
            {'last_touched': datetime(2018, 4, 30, 12, 58, tzinfo=get_localzone()), 'uid': '13'},
            {'last_touched': datetime(2018, 4, 30, 12, 57, tzinfo=get_localzone()), 'uid': '12'},
            {'last_touched': datetime(2018, 4, 30, 12, 56, tzinfo=get_localzone()), 'uid': '11'},
        ]
        self.assertEqual(expected, recently_touched_log)
    def test_update_webaction(self):
        self.login(self.manager)

        storage = get_storage()
        with freeze(datetime(2019, 12, 31, 17, 45)):
            action = create(Builder('webaction').titled(u'Open in ExternalApp')
                            .having(
                                title=u'Open in ExternalApp',
                                target_url='http://example.org/endpoint',
            ))
        action_id = action['action_id']
        self.assertEqual(action, storage.get(action_id))

        with freeze(datetime(2020, 7, 31, 19, 15)):
            storage.update(action_id, {'title': u'My new title'})

        self.assertIsInstance(storage.get(action_id), dict)
        self.assertEqual({
            'action_id': 0,
            'title': u'My new title',
            'target_url': 'http://example.org/endpoint',
            'display': 'actions-menu',
            'mode': 'self',
            'order': 0,
            'scope': 'global',
            'created': datetime(2019, 12, 31, 17, 45),
            'modified': datetime(2020, 7, 31, 19, 15),
            'owner': 'admin',
        }, storage.get(action_id))
    def test_update_webaction(self):
        self.login(self.manager)

        storage = get_storage()
        with freeze(datetime(2019, 12, 31, 17, 45)):
            action = create(Builder('webaction').titled(u'Open in ExternalApp')
                            .having(
                                title=u'Open in ExternalApp',
                                target_url='http://example.org/endpoint',
            ))
        action_id = action['action_id']
        self.assertEqual(action, storage.get(action_id))

        with freeze(datetime(2020, 7, 31, 19, 15)):
            storage.update(action_id, {'title': u'My new title'})

        self.assertIsInstance(storage.get(action_id), dict)
        self.assertEqual({
            'action_id': 0,
            'title': u'My new title',
            'target_url': 'http://example.org/endpoint',
            'display': 'actions-menu',
            'mode': 'self',
            'order': 0,
            'scope': 'global',
            'created': datetime(2019, 12, 31, 17, 45),
            'modified': datetime(2020, 7, 31, 19, 15),
            'owner': 'admin',
        }, storage.get(action_id))
    def test_recently_touched_log_gets_rotated_on_write(self):
        self.login(self.regular_user)

        start = datetime(2018, 4, 30, 12, 45)
        # Touch a document to initialize the log
        with freeze(start):
            notify(ObjectTouchedEvent(self.document))

        recently_touched_log = self._get_log(self.regular_user)

        custom_limit = 5

        api.portal.set_registry_record(
            'limit', custom_limit, IRecentlyTouchedSettings)

        for i in range(custom_limit * 3):
            recently_touched_log.append(
                {'last_touched': start + timedelta(minutes=i), 'uid': str(i)})

        with freeze(FROZEN_NOW):
            notify(ObjectTouchedEvent(self.document))

        # Fetch the log again because it doesn't get rotated in place
        recently_touched_log = self._get_log(self.regular_user)

        self.assertEqual(custom_limit, len(recently_touched_log))

        expected = [
            {'last_touched': FROZEN_NOW, 'uid': 'createtreatydossiers000000000002'},  # noqa
            {'last_touched': datetime(2018, 4, 30, 12, 59), 'uid': '14'},
            {'last_touched': datetime(2018, 4, 30, 12, 58), 'uid': '13'},
            {'last_touched': datetime(2018, 4, 30, 12, 57), 'uid': '12'},
            {'last_touched': datetime(2018, 4, 30, 12, 56), 'uid': '11'},
        ]
        self.assertEqual(expected, recently_touched_log)
Exemplo n.º 9
0
    def test_01_export_news(self, browser):
        self.grant('Manager')
        news_folder = create(Builder('news folder').titled(u'News Folder'))

        with freeze(datetime(2010, 3, 14, 20, 18)):
            news1 = create(
                Builder('news')
                .titled(u'Usain Bolt at the \xd6lympics')
                .within(news_folder)
                .having(news_date=datetime(2010, 3, 15, 12, 00),
                        description=u'Usain Bolt wins the \xd6lympic gold in'
                        u' three events.\n\nThe third is for a 100-metre relay.',
                        subjects=('Homepage', 'Sports')))

            lorem = RichTextValue(self.asset('lorem1.html'))
            block = create(Builder('sl textblock').within(news1)
                           .with_dummy_image()
                           .having(text=lorem))
            utils.create_page_state(news1, block)
            IMopageModificationDate(news1).set_date(DateTime('2010/3/15'))

        with freeze(datetime(2010, 5, 17, 15, 34)):
            create(Builder('news')
                   .titled(u'Largest Aircraft in the World')
                   .within(news_folder)
                   .having(news_date=datetime(2010, 5, 18, 12, 00),
                           expires=datetime(2020, 1, 1)))

        with freeze(datetime(2011, 1, 2, 3, 4)):
            self.assert_mopage_export('01_export_news.xml', news_folder)
    def test_recently_touched_log_rotation_handles_checked_out_docs(self):
        self.login(self.regular_user)

        # Touch a document to initialize the log
        with freeze(FROZEN_NOW):
            notify(ObjectTouchedEvent(self.document))

        recently_touched_log = self._get_log(self.regular_user)

        limit = api.portal.get_registry_record(
            'limit', IRecentlyTouchedSettings)

        for i in range(limit * 3):
            recently_touched_log.append(
                {'last_touched': datetime.now(), 'uid': str(i)})

        self.checkout_document(self.subdocument)

        # Touch a document to trigger rotation
        with freeze(FROZEN_NOW):
            notify(ObjectTouchedEvent(self.document))

        # We should now end up with twice the display limit plus number of
        # checked out documents as the total number of items in the log

        # Fetch the log again because it doesn't get rotated in place
        recently_touched_log = self._get_log(self.regular_user)

        self.assertEqual(
            limit + 1,
            len(recently_touched_log))
    def test_only_expired_dossiers_can_be_added(self, browser):
        self.login(self.records_manager, browser)

        data = {
            'paths:list': obj2paths([self.expired_dossier]),
            '_authenticator': createToken()
        }

        self.assertEqual(date(2000, 12, 31),
                         IDossier(self.expired_dossier).end)

        with freeze(datetime(2001, 1, 1)):
            browser.open(self.repository_root,
                         view='++add++opengever.disposition.disposition',
                         data=data)

            browser.find('Save').click()

            self.assertEquals(['There were some errors.'], error_messages())
            self.assertEquals([
                'The retention period of the selected dossiers is not expired.'
            ],
                              browser.css('.fieldErrorBox .error').text)

        with freeze(datetime(2021, 1, 1)):
            browser.open(self.repository_root,
                         view='++add++opengever.disposition.disposition',
                         data=data)

            browser.find('Save').click()

            self.assertEquals([], error_messages())
            self.assertEquals(['Item created'], info_messages())
Exemplo n.º 12
0
    def setUp(self):
        super(TestMarkAsRead, self).setUp()
        with self.login(self.regular_user):
            self.center = NotificationCenter()
            self.watcher = create(
                Builder('watcher').having(actorid=self.regular_user.id))
            oguid = Oguid.for_object(self.task)
            self.resource = create(
                Builder('resource').oguid(oguid.id).watchers([self.watcher]))

            # XXX - something is wonky with the builder for activities
            with freeze(FREEZE_TIME_FIRST):
                self.activity_1 = create(
                    Builder('activity').having(resource=self.resource,
                                               created=FREEZE_TIME_FIRST))
                create(
                    Builder('notification').id(1).having(
                        activity=self.activity_1,
                        userid=self.regular_user.id,
                    ))

            # XXX - something is wonky with the builder for activities
            with freeze(FREEZE_TIME_SECOND):
                self.activity_2 = create(
                    Builder('activity').having(resource=self.resource,
                                               created=FREEZE_TIME_SECOND))
                create(
                    Builder('notification').id(2).having(
                        activity=self.activity_2,
                        userid=self.regular_user.id,
                    ))

            self.notifications = self.center.get_users_notifications(
                self.regular_user.id)
    def test_content_expired_class_for_expired_content(self, browser):
        before_expiration = datetime(2010, 1, 1)
        expiration_date = datetime(2010, 2, 2)
        after_expiration = datetime(2010, 3, 3)

        create(Builder('navigation portlet'))
        create(Builder('folder').titled('Top Sibling')
               .having(expirationDate=expiration_date))
        folder = create(Builder('folder').titled('The Folder')
                        .having(expirationDate=expiration_date))
        create(Builder('page').titled('The Page').within(folder)
               .having(expirationDate=expiration_date))
        create(Builder('folder').titled('Bottom Sibling')
               .having(expirationDate=expiration_date))

        with freeze(after_expiration):
            browser.login().visit(folder)
            self.assertIn('content-expired', portlet().css('.sibling')[0].classes)
            self.assertIn('content-expired', portlet().css('.current').first.classes)
            self.assertIn('content-expired', portlet().css('.child').first.classes)
            self.assertIn('content-expired', portlet().css('.sibling')[1].classes)

        with freeze(before_expiration):
            browser.login().visit(folder)
            self.assertNotIn('content-expired', portlet().css('.sibling')[0].classes)
            self.assertNotIn('content-expired',
                             portlet().css('.current').first.classes)
            self.assertNotIn('content-expired', portlet().css('.child').first.classes)
            self.assertNotIn('content-expired', portlet().css('.sibling')[1].classes)
    def test_recently_touched_log_gets_sorted_on_write(self):
        self.login(self.regular_user)

        with freeze(FROZEN_NOW):
            notify(ObjectTouchedEvent(self.document))

        recently_touched_log = self._get_log(self.regular_user)

        recently_touched_log.extend([
            {'last_touched': datetime(1995, 1, 1, tzinfo=get_localzone()), 'uid': '1'},
            {'last_touched': datetime(2010, 1, 1, tzinfo=get_localzone()), 'uid': '3'},
            {'last_touched': datetime(2000, 1, 1, tzinfo=get_localzone()), 'uid': '2'},
        ])

        with freeze(FROZEN_NOW + timedelta(hours=1)):
            notify(ObjectTouchedEvent(self.document))

        uid = IUUID(self.document)

        self.assertEqual([
            {'last_touched': FROZEN_NOW + timedelta(hours=1), 'uid': uid},
            {'last_touched': datetime(2010, 1, 1, 0, 0, tzinfo=get_localzone()), 'uid': '3'},
            {'last_touched': datetime(2000, 1, 1, 0, 0, tzinfo=get_localzone()), 'uid': '2'},
            {'last_touched': datetime(1995, 1, 1, 0, 0, tzinfo=get_localzone()), 'uid': '1'}],
            recently_touched_log)
Exemplo n.º 15
0
    def test_lists_issued_keys(self, browser):
        with freeze(datetime(2017, 1, 1, 15, 30)):
            create(Builder('service_key').having(title='Key 1'))

        with freeze(datetime(2018, 5, 5, 12, 45)):
            create(
                Builder('service_key').having(title='Key 2',
                                              ip_range='192.168.0.0/16'))
        transaction.commit()

        storage = CredentialStorage(self.plugin)
        keys = storage.list_service_keys(TEST_USER_ID)
        client_ids = [k['client_id'] for k in keys]

        browser.login().open(view='@@manage-service-keys')
        table = browser.css('#table-service-keys').first.lists()

        self.assertEquals(
            ['', 'Title', 'Client-ID', 'IP Range', 'Issued', 'Last Used', ''],
            table[0])
        self.assertEquals(
            [
                '', 'Key 1', client_ids[0], '', 'Jan 01, 2017 03:30 PM', '',
                'Edit'
            ],  # noqa
            table[1])
        self.assertEquals(
            [
                '', 'Key 2', client_ids[1], '192.168.0.0/16',
                'May 05, 2018 12:45 PM', '', 'Edit'
            ],  # noqa
            table[2])
Exemplo n.º 16
0
    def test_trashing_and_restoring_updates_modified_date(self):
        self.grant('Site Administrator')

        created = datetime(2011, 1, 1, 1, 1, 1)
        trashed = datetime(2022, 2, 2, 2, 2, 2)
        restored = datetime(2033, 3, 3, 3, 3, 3)

        with freeze(created):
            folder = create(Builder('folder'))
            subfolder = create(Builder('folder').within(folder))

        self.assert_modified_date(created, folder)
        self.assert_modified_date(created, subfolder)

        with freeze(trashed):
            Trasher(folder).trash()

        self.assert_modified_date(trashed, folder)
        self.assert_modified_date(trashed, subfolder)

        with freeze(restored):
            Trasher(folder).restore()

        self.assert_modified_date(restored, folder)
        self.assert_modified_date(restored, subfolder)
Exemplo n.º 17
0
    def test_can_update_webaction(self, browser):
        self.login(self.webaction_manager, browser=browser)

        with freeze(datetime(2019, 12, 31, 17, 45)):
            action = create(Builder('webaction')
                            .having(
                                title=u'Open in ExternalApp',
                                target_url='http://example.org/endpoint',
            ))
        url = '%s/@webactions/%s' % (self.portal.absolute_url(), action['action_id'])

        with freeze(datetime(2020, 7, 31, 19, 15)):
            browser.open(url, method='PATCH',
                         data=json.dumps({'title': u'My new title'}),
                         headers=self.HEADERS)

        self.assertEqual(204, browser.status_code)
        self.assertEqual('', browser.contents)

        storage = get_storage()
        self.assertEqual({
            'action_id': 0,
            'title': u'My new title',
            'target_url': 'http://example.org/endpoint',
            'display': 'actions-menu',
            'mode': 'self',
            'order': 0,
            'scope': 'global',
            'created': datetime(2019, 12, 31, 17, 45),
            'modified': datetime(2020, 7, 31, 19, 15),
            'owner': 'webaction.manager',
        }, storage.get(action['action_id']))
    def test_recently_touched_log_gets_sorted_on_write(self):
        self.login(self.regular_user)

        with freeze(FROZEN_NOW):
            notify(ObjectTouchedEvent(self.document))

        recently_touched_log = self._get_log(self.regular_user)

        recently_touched_log.extend([
            {'last_touched': datetime(1995, 1, 1), 'uid': '1'},
            {'last_touched': datetime(2010, 1, 1), 'uid': '3'},
            {'last_touched': datetime(2000, 1, 1), 'uid': '2'},
        ])

        with freeze(FROZEN_NOW + timedelta(hours=1)):
            notify(ObjectTouchedEvent(self.document))

        uid = IUUID(self.document)

        self.assertEqual([
            {'last_touched': FROZEN_NOW + timedelta(hours=1), 'uid': uid},
            {'last_touched': datetime(2010, 1, 1, 0, 0), 'uid': '3'},
            {'last_touched': datetime(2000, 1, 1, 0, 0), 'uid': '2'},
            {'last_touched': datetime(1995, 1, 1, 0, 0), 'uid': '1'}],
            recently_touched_log)
Exemplo n.º 19
0
    def test_listing(self):
        self.login(self.records_manager)

        with freeze(datetime(2016, 11, 1, 11, 0)):
            storage = IHistoryStorage(self.disposition)
            storage.add('edited', api.user.get_current().getId(), [])

        with freeze(datetime(2016, 11, 6, 12, 33)), elevated_privileges():
            api.content.transition(self.disposition,
                                   'disposition-transition-appraise')
            api.content.transition(self.disposition,
                                   'disposition-transition-dispose')

        with freeze(datetime(2016, 11, 16, 8, 12)), elevated_privileges():
            api.content.transition(self.disposition,
                                   'disposition-transition-archive')

        rows = self.get_listing_rows(self.disposition,
                                     'disposition_history',
                                     self.disposition.get_history())

        expected_rows = [
            ['Nov 16, 2016 08:12 AM', 'Flucht Ramon (ramon.flucht)', 'disposition-transition-archive'],
            ['Nov 06, 2016 12:33 PM', 'Flucht Ramon (ramon.flucht)', 'disposition-transition-dispose'],
            ['Nov 06, 2016 12:33 PM', 'Flucht Ramon (ramon.flucht)', 'disposition-transition-appraise'],
            ['Nov 01, 2016 11:00 AM', 'Flucht Ramon (ramon.flucht)', 'Disposition edited'],
            ['Aug 31, 2016 07:07 PM', 'Flucht Ramon (ramon.flucht)', 'Disposition added']]

        for row, expected_row in zip(rows, expected_rows):
            self.assert_row_values(expected_row, row)
Exemplo n.º 20
0
    def test_only_expired_dossiers_can_be_added(self, browser):
        self.login(self.records_manager, browser)

        data = {'paths:list': obj2paths([self.expired_dossier]),
                '_authenticator': createToken()}

        self.assertEqual(date(2000, 12, 31), IDossier(self.expired_dossier).end)

        with freeze(datetime(2001, 1, 1)):
            browser.open(self.repository_root,
                         view='++add++opengever.disposition.disposition',
                         data=data)

            browser.find('Save').click()

            self.assertEquals(['There were some errors.'], error_messages())
            self.assertEquals(
                ['The retention period of the selected dossiers is not expired.'],
                browser.css('.fieldErrorBox .error').text)

        with freeze(datetime(2021, 1, 1)):
            browser.open(self.repository_root,
                         view='++add++opengever.disposition.disposition',
                         data=data)

            browser.find('Save').click()

            self.assertEquals([], error_messages())
            self.assertEquals(['Item created'], info_messages())
Exemplo n.º 21
0
    def test_filters(self, browser):
        self.login(self.meeting_user, browser)

        with freeze(datetime(2011, 6, 1)):
            browser.open(
                self.committee,
                view='tabbedview_view-memberships',
                data={'membership_state_filter': 'filter_membership_all'})
            self.assertItemsEqual(
                [
                    'Neruda Pablo', u'Sch\xf6ller Heidrun', 'Wendler Jens',
                    u'W\xf6lfl Gerda'
                ],
                browser.css('#listing_container tbody tr td:first-child').text)

            browser.open(
                self.committee,
                view='tabbedview_view-memberships',
                data={'membership_state_filter': 'filter_membership_active'})
            self.assertItemsEqual(
                ['Neruda Pablo'],
                browser.css('#listing_container tbody tr td:first-child').text)

        with freeze(datetime(2015, 6, 1)):
            browser.open(
                self.committee,
                view='tabbedview_view-memberships',
                data={'membership_state_filter': 'filter_membership_active'})
            self.assertItemsEqual(
                [u'Sch\xf6ller Heidrun', 'Wendler Jens', u'W\xf6lfl Gerda'],
                browser.css('#listing_container tbody tr td:first-child').text)
Exemplo n.º 22
0
    def test_existing_objects_are_indexed_when_installing(self):
        with freeze(datetime(2010, 1, 1)):
            folder = create(Builder('folder'))
        with freeze(datetime(2010, 1, 2)):
            create(Builder('document'))
        with freeze(datetime(2010, 1, 3)):
            create(Builder('document').within(folder))
        with freeze(datetime(2010, 1, 4)):
            folder.notifyModified()

        get_activity_soup().clear()
        applyProfile(self.portal, 'ftw.activity:default')

        self.maxDiff = None
        self.assertEquals(
            [{'path': '/plone/folder',
              'action': 'added',
              'date': DateTime('2010/01/01')},
             {'path': '/plone/document',
              'action': 'added',
              'date': DateTime('2010/01/02')},
             {'path': '/plone/folder/document',
              'action': 'added',
              'date': DateTime('2010/01/03')},
             {'path': '/plone/folder',
              'action': 'changed',
              'date': DateTime('2010/01/04')}],

            get_soup_activities(('path', 'action', 'date')))
Exemplo n.º 23
0
    def test_lists_usage_logs(self, browser):
        # Create a service key and issue two access tokens with it
        service_key = create(Builder('service_key'))
        self.request._client_addr = '10.0.0.77'
        self.request.environ['HTTP_USER_AGENT'] = 'some-client/1.23.4'

        with freeze(datetime(2018, 1, 1, 15, 30)):
            create(Builder('access_token').from_key(service_key))

        with freeze(datetime(2018, 1, 5, 12, 45)):
            create(Builder('access_token').from_key(service_key))

        transaction.commit()

        browser.login().open(view='@@manage-service-keys')
        keys_table = browser.css('#table-service-keys').first
        self.assertEqual(['Jan 05, 2018 12:45 PM'],
                         keys_table.column('Last Used', head=False))

        logs_link = keys_table.find('Jan 05, 2018 12:45 PM').css('a').first
        logs_link.click()

        logs_table = browser.css('#table-usage-logs').first
        self.assertEqual([{
            'IP Address': '10.0.0.77',
            'User ID': 'test_user_1_',
            'Time': 'Jan 05, 2018 12:45 PM',
            'User Agent': 'some-client/1.23.4'
        }, {
            'IP Address': '10.0.0.77',
            'User ID': 'test_user_1_',
            'Time': 'Jan 01, 2018 03:30 PM',
            'User Agent': 'some-client/1.23.4'
        }], logs_table.dicts())
Exemplo n.º 24
0
    def test_can_update_webaction(self, browser):
        self.login(self.webaction_manager, browser=browser)

        with freeze(datetime(2019, 12, 31, 17, 45)):
            action = create(
                Builder('webaction').having(
                    title=u'Open in ExternalApp',
                    target_url='http://example.org/endpoint',
                ))
        url = '%s/@webactions/%s' % (self.portal.absolute_url(),
                                     action['action_id'])

        with freeze(datetime(2020, 7, 31, 19, 15)):
            browser.open(url,
                         method='PATCH',
                         data=json.dumps({'title': u'My new title'}),
                         headers=self.HEADERS)

        self.assertEqual(204, browser.status_code)
        self.assertEqual('', browser.contents)

        storage = get_storage()
        self.assertEqual(
            {
                'action_id': 0,
                'title': u'My new title',
                'target_url': 'http://example.org/endpoint',
                'display': 'actions-menu',
                'mode': 'self',
                'order': 0,
                'scope': 'global',
                'created': datetime(2019, 12, 31, 17, 45),
                'modified': datetime(2020, 7, 31, 19, 15),
                'owner': 'webaction.manager',
            }, storage.get(action['action_id']))
    def test_filters(self, browser):
        self.login(self.meeting_user, browser)

        with freeze(datetime(2011, 6, 1)):
            browser.open(self.committee,
                         view='tabbedview_view-memberships',
                         data={'membership_state_filter': 'filter_membership_all'})
            self.assertItemsEqual(
                ['Neruda Pablo', u'Sch\xf6ller Heidrun', 'Wendler Jens', u'W\xf6lfl Gerda'],
                browser.css('#listing_container tbody tr td:first-child').text)

            browser.open(self.committee,
                         view='tabbedview_view-memberships',
                         data={'membership_state_filter': 'filter_membership_active'})
            self.assertItemsEqual(
                ['Neruda Pablo'],
                browser.css('#listing_container tbody tr td:first-child').text)

        with freeze(datetime(2015, 6, 1)):
            browser.open(self.committee,
                         view='tabbedview_view-memberships',
                         data={'membership_state_filter': 'filter_membership_active'})
            self.assertItemsEqual(
                [u'Sch\xf6ller Heidrun', 'Wendler Jens', u'W\xf6lfl Gerda'],
                browser.css('#listing_container tbody tr td:first-child').text)
Exemplo n.º 26
0
    def test_listing(self):
        self.login(self.records_manager)

        with freeze(datetime(2016, 11, 1, 11, 0)):
            storage = IHistoryStorage(self.disposition)
            storage.add('edited', api.user.get_current().getId(), [])

        with freeze(datetime(2016, 11, 6, 12, 33)), elevated_privileges():
            api.content.transition(self.disposition,
                                   'disposition-transition-appraise')
            api.content.transition(self.disposition,
                                   'disposition-transition-dispose')

        with freeze(datetime(2016, 11, 16, 8, 12)), elevated_privileges():
            api.content.transition(self.disposition,
                                   'disposition-transition-archive')

        rows = self.get_listing_rows(self.disposition,
                                     'disposition_history',
                                     self.disposition.get_history())

        expected_rows = [
            ['Nov 16, 2016 08:12 AM', 'Flucht Ramon (ramon.flucht)', 'disposition-transition-archive'],
            ['Nov 06, 2016 12:33 PM', 'Flucht Ramon (ramon.flucht)', 'disposition-transition-dispose'],
            ['Nov 06, 2016 12:33 PM', 'Flucht Ramon (ramon.flucht)', 'disposition-transition-appraise'],
            ['Nov 01, 2016 11:00 AM', 'Flucht Ramon (ramon.flucht)', 'Disposition edited'],
            ['Aug 31, 2016 07:05 PM', 'Flucht Ramon (ramon.flucht)', 'Disposition added']]

        for row, expected_row in zip(rows, expected_rows):
            self.assert_row_values(expected_row, row)
Exemplo n.º 27
0
    def test_unlock_button_available_only_for_managers(self, browser):
        with freeze():
            self.login(self.regular_user, browser)
            with freeze(FREEZE_DATE):
                oc_url = self.fetch_document_checkout_oc_url(
                    browser, self.document)

            expected_token = {
                u'action': u'checkout',
                u'documents': [u'createtreatydossiers000000000002'],
                u'exp': 4121033100,
                u'sub': u'kathi.barfuss',
                u'url': u'http://nohost/plone/oc_checkout',
            }
            raw_token = oc_url.split(':')[-1]
            token = jwt.decode(raw_token,
                               JWT_SIGNING_SECRET_PLONE,
                               algorithms=('HS256', ))
            self.assertEqual(expected_token, token)

            self.lock_document(browser, raw_token, self.document)

            self.login(self.meeting_user, browser)
            browser.open(self.document)
            self.assertIn(self.locked_message, info_messages())
            self.assertNotIn(self.unlockable_message, info_messages())

            self.login(self.manager, browser)
            browser.open(self.document)
            self.assertNotIn(self.locked_message, info_messages())
            self.assertIn(self.unlockable_message, info_messages())
    def test_recently_touched_log_rotation_handles_checked_out_docs(self):
        self.login(self.regular_user)

        # Touch a document to initialize the log
        with freeze(FROZEN_NOW):
            notify(ObjectTouchedEvent(self.document))

        recently_touched_log = self._get_log(self.regular_user)

        limit = api.portal.get_registry_record(
            'limit', IRecentlyTouchedSettings)

        for i in range(limit * 3):
            recently_touched_log.append(
                {'last_touched': datetime.now(pytz.utc).astimezone(get_localzone()), 'uid': str(i)})

        self.checkout_document(self.subdocument)

        # Touch a document to trigger rotation
        with freeze(FROZEN_NOW):
            notify(ObjectTouchedEvent(self.document))

        # We should now end up with twice the display limit plus number of
        # checked out documents as the total number of items in the log

        # Fetch the log again because it doesn't get rotated in place
        recently_touched_log = self._get_log(self.regular_user)

        self.assertEqual(
            limit + 1,
            len(recently_touched_log))
Exemplo n.º 29
0
    def test_sets_journal_pdf_document_date_to_dossier_end_date(self, browser):
        """When the document date is not set to the dossiers end date the
        subdossier will be left in an inconsistent state. this will make
        resolving the main dossier impossible.
        """
        self.activate_feature('journal-pdf')
        self.login(self.secretariat_user, browser)

        subdossier = create(Builder('dossier')
                            .within(self.empty_dossier)
                            .having(
                                start=date(2016, 1, 1),
                                end=date(2016, 3, 15))
                            .titled(u'Sub'))

        with self.observe_children(subdossier) as sub_children:
            with freeze(datetime(2016, 4, 25)):
                resolve_dossier(subdossier, browser)

        self.assertEquals(1, len(sub_children['added']))
        sub_journal_pdf, = sub_children['added']
        self.assertEqual(date(2016, 3, 15), sub_journal_pdf.document_date,
                         "End date should be set to dossier end date")

        with self.observe_children(self.empty_dossier) as main_children:
            with freeze(datetime(2016, 9, 1)):
                resolve_dossier(self.empty_dossier, browser)

        self.assertEquals(1, len(main_children['added']))
        main_journal_pdf, = main_children['added']
        self.assertEqual(date(2016, 3, 15), IDossier(self.empty_dossier).end,
                         "End should be earliest possible date")
        self.assertEqual(date(2016, 3, 15), main_journal_pdf.document_date,
                         "Document date should be earliest possible date")
Exemplo n.º 30
0
    def test_migrate_dexterity_folder_to_dexterity(self):
        self.grant('Manager')
        self.install_profile('plone.app.contenttypes:default')

        creation_date = datetime(2015, 11, 29, 10, 45)
        modification_date = datetime(2016, 1, 2, 9, 30)
        effective_date = datetime(2016, 2, 2, 2, 30)
        expires_date = datetime(2016, 3, 3, 3, 30)

        with dx_content_builders_registered():
            with freeze(creation_date):
                folder = create(Builder('folder')
                                .titled(u'The Folder')
                                .having(description=u'The Description',
                                        exclude_from_nav=True,
                                        subjects=(u'One', u'Two'),
                                        effective=effective_date,
                                        expires=expires_date)
                                .in_state('pending'))

        with freeze(modification_date):
            folder.reindexObject()  # update modification date

        self.assertFalse(IBaseObject.providedBy(folder))
        self.assertTrue(IDexterityContent.providedBy(folder))
        self.assertEqual(('', 'plone', 'the-folder'), folder.getPhysicalPath())
        self.assertEqual('The Folder', folder.Title())
        self.assertEqual('The Description', folder.Description())
        self.assertEqual(True, folder.exclude_from_nav)
        self.assertEqual(('One', 'Two'), folder.Subject())
        self.assertEqual(todt(creation_date), todt(folder.created()))
        self.assertEqual(todt(modification_date), todt(folder.modified()))
        self.assertEqual(todt(effective_date), todt(folder.effective()))
        self.assertEqual(todt(expires_date), todt(folder.expires()))
        self.assertEqual('pending', self.review_state(folder))

        old_catalog_indexdata = self.get_catalog_indexdata_for(folder)

        InplaceMigrator('Folder').migrate_object(folder)

        folder = self.portal.get('the-folder')
        self.assertFalse(IBaseObject.providedBy(folder))
        self.assertTrue(IDexterityContent.providedBy(folder))
        self.assertEqual(('', 'plone', 'the-folder'), folder.getPhysicalPath())
        self.assertEqual('The Folder', folder.Title())
        self.assertEqual('The Description', folder.Description())
        self.assertEqual(True, folder.exclude_from_nav)
        self.assertEqual(('One', 'Two'), folder.Subject())
        self.assertEqual(todt(creation_date), todt(folder.created()))
        self.assertEqual(todt(modification_date), todt(folder.modified()))
        self.assertEqual(todt(effective_date), todt(folder.effective()))
        self.assertEqual(todt(expires_date), todt(folder.expires()))
        self.assertEqual('pending', self.review_state(folder))

        self.maxDiff = None
        self.assertDictEqual(old_catalog_indexdata,
                             self.get_catalog_indexdata_for(folder))
Exemplo n.º 31
0
    def test_migrate_dexterity_folder_to_dexterity(self):
        self.grant('Manager')
        self.install_profile('plone.app.contenttypes:default')

        creation_date = datetime(2015, 11, 29, 10, 45)
        modification_date = datetime(2016, 1, 2, 9, 30)
        effective_date = datetime(2016, 2, 2, 2, 30)
        expires_date = datetime(2016, 3, 3, 3, 30)

        with dx_content_builders_registered():
            with freeze(creation_date):
                folder = create(
                    Builder('folder').titled(u'The Folder').having(
                        description=u'The Description',
                        exclude_from_nav=True,
                        subjects=(u'One', u'Two'),
                        effective=effective_date,
                        expires=expires_date).in_state('pending'))

        with freeze(modification_date):
            folder.reindexObject()  # update modification date

        self.assertFalse(IBaseObject.providedBy(folder))
        self.assertTrue(IDexterityContent.providedBy(folder))
        self.assertEqual(('', 'plone', 'the-folder'), folder.getPhysicalPath())
        self.assertEqual('The Folder', folder.Title())
        self.assertEqual('The Description', folder.Description())
        self.assertEqual(True, folder.exclude_from_nav)
        self.assertEqual(('One', 'Two'), folder.Subject())
        self.assertEqual(todt(creation_date), todt(folder.created()))
        self.assertEqual(todt(modification_date), todt(folder.modified()))
        self.assertEqual(todt(effective_date), todt(folder.effective()))
        self.assertEqual(todt(expires_date), todt(folder.expires()))
        self.assertEqual('pending', self.review_state(folder))

        old_catalog_indexdata = self.get_catalog_indexdata_for(folder)

        InplaceMigrator('Folder').migrate_object(folder)

        folder = self.portal.get('the-folder')
        self.assertFalse(IBaseObject.providedBy(folder))
        self.assertTrue(IDexterityContent.providedBy(folder))
        self.assertEqual(('', 'plone', 'the-folder'), folder.getPhysicalPath())
        self.assertEqual('The Folder', folder.Title())
        self.assertEqual('The Description', folder.Description())
        self.assertEqual(True, folder.exclude_from_nav)
        self.assertEqual(('One', 'Two'), folder.Subject())
        self.assertEqual(todt(creation_date), todt(folder.created()))
        self.assertEqual(todt(modification_date), todt(folder.modified()))
        self.assertEqual(todt(effective_date), todt(folder.effective()))
        self.assertEqual(todt(expires_date), todt(folder.expires()))
        self.assertEqual('pending', self.review_state(folder))

        self.maxDiff = None
        self.assertDictEqual(old_catalog_indexdata,
                             self.get_catalog_indexdata_for(folder))
Exemplo n.º 32
0
    def test_ignore_modules_real_time_supports_timezones(self):
        timezone = pytz.timezone('Europe/Zurich')
        dt_now = datetime.datetime(2010, 12, 1).replace(tzinfo=timezone)
        time_now = time.mktime(dt_now.timetuple())

        with freeze(dt_now):
            with freeze(datetime.datetime(2000, 1, 1),
                        ignore_modules=('ftw.testing.tests.test_freezer',)):
                self.assertEquals(dt_now, datetime.datetime.now(timezone))
                self.assertEquals(time_now, time_function())
Exemplo n.º 33
0
    def setUp(self):
        super(TestReturnedWebactions, self).setUp()

        with self.login(self.webaction_manager):
            with freeze(datetime(2018, 4, 20)):
                create(
                    Builder('webaction').titled(u'Action 1').having(order=5))

            with freeze(datetime(2018, 4, 21)):
                create(
                    Builder('webaction').titled(u'Action 2').having(order=10))

            with freeze(datetime(2018, 4, 22)):
                create(
                    Builder('webaction').titled(u'Action 3').having(order=20))

        self.action1_data = {
            'target_url': 'http://example.org/endpoint',
            'title': u'Action 1',
            'display': 'actions-menu',
            'mode': 'self',
            'action_id': 0,
            'order': 5,
            'created': datetime(2018, 4, 20),
            'modified': datetime(2018, 4, 20),
            'owner': 'webaction.manager',
            'scope': 'global'
        }

        self.action2_data = {
            'target_url': 'http://example.org/endpoint',
            'title': u'Action 2',
            'display': 'actions-menu',
            'mode': 'self',
            'action_id': 1,
            'order': 10,
            'created': datetime(2018, 4, 21),
            'modified': datetime(2018, 4, 21),
            'owner': 'webaction.manager',
            'scope': 'global'
        }

        self.action3_data = {
            'target_url': 'http://example.org/endpoint',
            'title': u'Action 3',
            'display': 'actions-menu',
            'mode': 'self',
            'action_id': 2,
            'order': 20,
            'created': datetime(2018, 4, 22),
            'modified': datetime(2018, 4, 22),
            'owner': 'webaction.manager',
            'scope': 'global'
        }
Exemplo n.º 34
0
    def test_revert_to_version_updates_changed(self):
        self.login(self.regular_user)
        CHECKIN_TIME = datetime(2018, 4, 28, 0, 0, tzinfo=pytz.UTC)
        with freeze(CHECKIN_TIME):
            self.checkout_document(self.document)
            self.checkin_document(self.document)

        self.assert_changed_value(self.document, CHECKIN_TIME)
        with freeze(FREEZING_TIME):
            manager = getMultiAdapter(
                (self.document, self.portal.REQUEST), ICheckinCheckoutManager)
            manager.revert_to_version(0)
        self.assert_changed_value(self.document, FREEZING_TIME)
    def setUp(self):
        super(TestWebactionsEditForm, self).setUp()

        with self.login(self.webaction_manager):
            with freeze(datetime(2018, 4, 20)):
                create(Builder('webaction')
                       .titled(u'Action 1')
                       .having(order=5))

            with freeze(datetime(2018, 4, 21)):
                create(Builder('webaction')
                       .titled(u'Action 2')
                       .having(order=10))
Exemplo n.º 36
0
    def test_ignore_modules_real_time_is_correct(self):
        """This test makes sure that the correct current time is used when
        a module is ignored and should fall back to real time while a freezer is active.
        This is tested by using a wrapping freezer and assuming that freezing behaves correctly.
        """
        dt_now = datetime.datetime(2010, 12, 1)
        time_now = time.mktime(dt_now.timetuple())

        with freeze(dt_now):
            with freeze(datetime.datetime(2000, 1, 1), ignore_modules=('ftw.testing.tests.test_freezer',)):
                self.assertEquals(dt_now, datetime.datetime.now())
                self.assertEquals(dt_now, datetime.datetime.today())
                self.assertEquals(time_now, time_function())
Exemplo n.º 37
0
    def test_ignore_modules(self):
        dt_now = datetime.datetime(2010, 12, 1)
        time_now = time.mktime(dt_now.timetuple())

        with freeze(dt_now):
            self.assertEquals(dt_now, datetime.datetime.now())
            self.assertEquals(dt_now, datetime.datetime.today())
            self.assertEquals(time_now, time_function())

        with freeze(dt_now, ignore_modules=('ftw.testing.tests.test_freezer',)):
            self.assertNotEquals(dt_now, datetime.datetime.now())
            self.assertNotEquals(dt_now, datetime.datetime.today())
            self.assertNotEquals(time_now, time_function())
    def setUp(self):
        super(TestWebactionsEditForm, self).setUp()

        with self.login(self.webaction_manager):
            with freeze(datetime(2018, 4, 20)):
                create(Builder('webaction')
                       .titled(u'Action 1')
                       .having(order=5))

            with freeze(datetime(2018, 4, 21)):
                create(Builder('webaction')
                       .titled(u'Action 2')
                       .having(order=10))
Exemplo n.º 39
0
    def test_list_all_notifications_for_the_given_userid(self, browser):
        self.login(self.administrator, browser=browser)

        center = notification_center()

        self.assertEqual(0,  Notification.query.count())

        with freeze(datetime(2017, 10, 16, 0, 0, tzinfo=pytz.utc)):
            TaskAddedActivity(self.task, self.request, self.task.__parent__).record()

        for notification in Notification.query.all():
            notification.is_read = True

        with freeze(datetime(2018, 10, 16, 0, 0, tzinfo=pytz.utc)):
            TaskAddedActivity(self.task, self.request, self.task.__parent__).record()

        self.assertEqual(2, len(center.get_watchers(self.task)))

        # two notifications for each watcher, the responsible and the issuer
        self.assertEqual(4,  Notification.query.count())

        self.login(self.regular_user, browser=browser)

        url = '{}/@notifications/{}'.format(self.portal.absolute_url(),
                                            self.regular_user.getId())
        browser.open(url, method='GET', headers={'Accept': 'application/json'})

        self.assertEqual(200, browser.status_code)

        self.assertEquals(
            [{u'@id': u'http://nohost/plone/@notifications/kathi.barfuss/3',
              u'actor_id': u'nicole.kohler',
              u'actor_label': u'Kohler Nicole',
              u'created': u'2018-10-16T00:00:00+00:00',
              u'label': u'Task opened',
              u'link': u'http://nohost/plone/@@resolve_notification?notification_id=3',
              u'notification_id': 3,
              u'read': False,
              u'summary': u'New task opened by Ziegler Robert',
              u'title': u'Vertragsentwurf \xdcberpr\xfcfen'},
             {u'@id': u'http://nohost/plone/@notifications/kathi.barfuss/1',
              u'actor_id': u'nicole.kohler',
              u'actor_label': u'Kohler Nicole',
              u'created': u'2017-10-16T00:00:00+00:00',
              u'label': u'Task opened',
              u'link': u'http://nohost/plone/@@resolve_notification?notification_id=1',
              u'notification_id': 1,
              u'read': True,
              u'summary': u'New task opened by Ziegler Robert',
              u'title': u'Vertragsentwurf \xdcberpr\xfcfen'}],
            browser.json.get('items'))
    def setUp(self):
        super(TestReturnedWebactions, self).setUp()

        with self.login(self.webaction_manager):
            with freeze(datetime(2018, 4, 20)):
                create(Builder('webaction')
                       .titled(u'Action 1')
                       .having(order=5))

            with freeze(datetime(2018, 4, 21)):
                create(Builder('webaction')
                       .titled(u'Action 2')
                       .having(order=10))

            with freeze(datetime(2018, 4, 22)):
                create(Builder('webaction')
                       .titled(u'Action 3')
                       .having(order=20))

        self.action1_data = {'target_url': 'http://example.org/endpoint',
                             'title': u'Action 1',
                             'display': 'actions-menu',
                             'mode': 'self',
                             'action_id': 0,
                             'order': 5,
                             'created': datetime(2018, 4, 20),
                             'modified': datetime(2018, 4, 20),
                             'owner': 'webaction.manager',
                             'scope': 'global'}

        self.action2_data = {'target_url': 'http://example.org/endpoint',
                             'title': u'Action 2',
                             'display': 'actions-menu',
                             'mode': 'self',
                             'action_id': 1,
                             'order': 10,
                             'created': datetime(2018, 4, 21),
                             'modified': datetime(2018, 4, 21),
                             'owner': 'webaction.manager',
                             'scope': 'global'}

        self.action3_data = {'target_url': 'http://example.org/endpoint',
                             'title': u'Action 3',
                             'display': 'actions-menu',
                             'mode': 'self',
                             'action_id': 2,
                             'order': 20,
                             'created': datetime(2018, 4, 22),
                             'modified': datetime(2018, 4, 22),
                             'owner': 'webaction.manager',
                             'scope': 'global'}
    def test_invariants_are_validated_on_final_resulting_object(self):
        """When updating, we need to make sure that invariants are validated
        on the final object that would result from the change (an invariant
        might impose a constraint that involves a field that already exists
        on the object and isn't touched by the update, and one that is being
        changed by the update).
        """
        self.login(self.manager)

        storage = get_storage()
        # We start with an action in the 'title-buttons' display location,
        # which requires an icon, and an value for icon_name property.
        # This is valid so far, no invariants are violated.
        with freeze(datetime(2019, 12, 31, 17, 45)):
            action = create(Builder('webaction').titled(u'Open in ExternalApp')
                            .having(
                                icon_name='fa-helicopter',
                                display='title-buttons',
            ))
        action_id = action['action_id']

        # But if we now attempt to change the display location to the
        # 'actions-menu', which doesn't allow for an icon, the invariant will
        # be violated.
        with self.assertRaises(ValidationError) as cm:
            storage.update(action_id, {'display': 'actions-menu'})

        self.assertEqual(
            "WebAction doesn't conform to schema (First error: "
            "(None, Invalid(\"Display location 'actions-menu' doesn't allow an icon.\",))).",
            cm.exception.message)

        # If we however change both the properties covered by the invariant in
        # the same update, the change succeeds:
        with freeze(datetime(2020, 7, 31, 19, 15)):
            storage.update(action_id, {'display': 'actions-menu', 'icon_name': None})

        self.assertEqual({
            'action_id': 0,
            'title': u'Open in ExternalApp',
            'target_url': 'http://example.org/endpoint',
            'icon_name': None,
            'display': 'actions-menu',
            'mode': 'self',
            'order': 0,
            'scope': 'global',
            'created': datetime(2019, 12, 31, 17, 45),
            'modified': datetime(2020, 7, 31, 19, 15),
            'owner': 'admin',
        }, storage.get(action_id))
Exemplo n.º 42
0
    def test_returns_list_of_serialized_response_objects(self, browser):
        self.login(self.workspace_member, browser=browser)

        with freeze(datetime(2016, 12, 9, 9, 40)):
            response = Response()
            response.text = u'Ich bin hier anderer Meinung!'
            IResponseContainer(self.todo).add(response)

        with freeze(datetime(2016, 12, 24, 8, 23)):
            with self.login(self.workspace_admin):
                response = Response()
                response.text = u'Ok, Danke f\xfcr dein Feedback'
                response.add_change('title', 'Foo', 'Bar')
                IResponseContainer(self.todo).add(response)

        browser.open(self.todo, method="GET", headers=self.api_headers)
        self.assertEquals([{
            u'@id':
            u'http://nohost/plone/workspaces/workspace-1/todo-1/@responses/1481272800000000',
            u'changes': [],
            u'created': u'2016-12-09T09:40:00',
            u'creator': {
                u'title': u'Schr\xf6dinger B\xe9atrice',
                u'token': u'beatrice.schrodinger'
            },
            u'response_id': 1481272800000000,
            u'response_type': u'default',
            u'text': u'Ich bin hier anderer Meinung!',
        }, {
            u'@id':
            u'http://nohost/plone/workspaces/workspace-1/todo-1/@responses/1482564180000000',
            u'changes': [{
                u'after': u'Bar',
                u'before': u'Foo',
                u'field_id': u'title',
                u'field_title': u''
            }],
            u'created':
            u'2016-12-24T08:23:00',
            u'creator': {
                u'title': u'Hugentobler Fridolin',
                u'token': u'fridolin.hugentobler'
            },
            u'response_id':
            1482564180000000,
            u'response_type':
            u'default',
            u'text':
            u'Ok, Danke f\xfcr dein Feedback',
        }], browser.json['responses'])
    def test_invariants_are_validated_on_final_resulting_object(self):
        """When updating, we need to make sure that invariants are validated
        on the final object that would result from the change (an invariant
        might impose a constraint that involves a field that already exists
        on the object and isn't touched by the update, and one that is being
        changed by the update).
        """
        self.login(self.manager)

        storage = get_storage()
        # We start with an action in the 'title-buttons' display location,
        # which requires an icon, and an value for icon_name property.
        # This is valid so far, no invariants are violated.
        with freeze(datetime(2019, 12, 31, 17, 45)):
            action = create(Builder('webaction').titled(u'Open in ExternalApp')
                            .having(
                                icon_name='fa-helicopter',
                                display='title-buttons',
            ))
        action_id = action['action_id']

        # But if we now attempt to change the display location to the
        # 'actions-menu', which doesn't allow for an icon, the invariant will
        # be violated.
        with self.assertRaises(ValidationError) as cm:
            storage.update(action_id, {'display': 'actions-menu'})

        self.assertEqual(
            "WebAction doesn't conform to schema (First error: "
            "(None, Invalid(\"Display location 'actions-menu' doesn't allow an icon.\",))).",
            str(cm.exception))

        # If we however change both the properties covered by the invariant in
        # the same update, the change succeeds:
        with freeze(datetime(2020, 7, 31, 19, 15)):
            storage.update(action_id, {'display': 'actions-menu', 'icon_name': None})

        self.assertEqual({
            'action_id': 0,
            'title': u'Open in ExternalApp',
            'target_url': 'http://example.org/endpoint',
            'icon_name': None,
            'display': 'actions-menu',
            'mode': 'self',
            'order': 0,
            'scope': 'global',
            'created': datetime(2019, 12, 31, 17, 45),
            'modified': datetime(2020, 7, 31, 19, 15),
            'owner': 'admin',
        }, storage.get(action_id))
Exemplo n.º 44
0
    def test_sip_folder_name_correspond_to_ech0160_definition(self):
        """See chapter 5.4 Aufbau eines SIP in eCH-0160 definition.

        SIP_[Ablieferungsdatum]_[Name der ablieferenden Stelle]_[Referenz].
        """
        self.login(self.records_manager)
        package = SIPPackage(self.disposition)

        with freeze(datetime(2016, 11, 6)):
            self.assertEquals('SIP_20161106_PLONE', package.get_folder_name())

        self.disposition.transfer_number = u'10\xe434'
        with freeze(datetime(2016, 11, 6)):
            self.assertEquals(u'SIP_20161106_PLONE_10\xe434',
                              package.get_folder_name())
    def test_protocol_document(self, browser):
        self.login(self.committee_responsible, browser)

        browser.open(self.meeting)
        docnode = browser.css('.meeting-document.protocol-doc').first
        self.assertFalse(docnode.css('div.document-label a'))
        self.assertEquals('Pre-protocol', docnode.css('.document-label').first.text)
        self.assertEquals('Not yet generated.', docnode.css('.document-created').first.text)
        self.assertTrue(docnode.css('.action.generate'))
        self.assertFalse(docnode.css('.action.download'))

        with freeze(datetime(2016, 9, 2, 10, 15, 1, tzinfo=pytz.UTC)) as clock:
            docnode.css('.action.generate').first.click()
            docnode = browser.css('.meeting-document.protocol-doc').first
            self.assertTrue(docnode.css('div.document-label a'))
            self.assertEquals('Pre-protocol', docnode.css('.document-label').first.text)
            self.assertEquals('Created at Sep 02, 2016 11:15 AM', docnode.css('.document-created').first.text)
            self.assertTrue(docnode.css('.action.generate'))
            self.assertTrue(docnode.css('.action.download'))

            self.assertEquals(self.meeting.model.protocol_document.get_download_url(),
                              docnode.css('.action.download').first.attrib['href'])

            clock.forward(hours=1)
            docnode.css('.action.generate').first.click()
            docnode = browser.css('.meeting-document.protocol-doc').first
            self.assertEquals('Created at Sep 02, 2016 12:15 PM', docnode.css('.document-created').first.text)

            self.meeting.model.workflow_state = self.meeting.model.STATE_HELD.name
            browser.reload()
            docnode = browser.css('.meeting-document.protocol-doc').first
            self.assertEquals('Protocol', docnode.css('.document-label').first.text)
    def test_agenda_items_list_document(self, browser):
        self.login(self.committee_responsible, browser)

        browser.open(self.meeting)
        docnode = browser.css('.meeting-document.agenda-item-list-doc').first
        self.assertFalse(docnode.css('div.document-label a'))
        self.assertEquals('Agenda item list', docnode.css('.document-label').first.text)
        self.assertEquals('Not yet generated.', docnode.css('.document-created').first.text)
        self.assertTrue(docnode.css('.action.generate'))
        self.assertFalse(docnode.css('.action.download'))

        with freeze(datetime(2016, 9, 2, 10, 15, 1, tzinfo=pytz.UTC)) as clock:
            docnode.css('.action.generate').first.click()
            docnode = browser.css('.meeting-document.agenda-item-list-doc').first
            self.assertTrue(docnode.css('div.document-label a'))
            self.assertEquals('Agenda item list', docnode.css('.document-label').first.text)
            self.assertEquals('Created at Sep 02, 2016 11:15 AM', docnode.css('.document-created').first.text)
            self.assertTrue(docnode.css('.action.generate'))
            self.assertTrue(docnode.css('.action.download'))

            self.assertEquals(self.meeting.model.agendaitem_list_document.get_download_url(),
                              docnode.css('.action.download').first.attrib['href'])

            clock.forward(hours=1)
            docnode.css('.action.generate').first.click()
            docnode = browser.css('.meeting-document.agenda-item-list-doc').first
            self.assertEquals('Created at Sep 02, 2016 12:15 PM', docnode.css('.document-created').first.text)
Exemplo n.º 47
0
    def test_adding_a_response_sucessful(self, browser):
        self.login(self.workspace_member, browser=browser)

        self.assertEquals([], IResponseContainer(self.todo).list())

        with freeze(datetime(2016, 12, 9, 9, 40)):
            url = '{}/@responses'.format(self.todo.absolute_url())
            browser.open(url,
                         method="POST",
                         headers=self.api_headers,
                         data=json.dumps({'text': u'Angebot \xfcberpr\xfcft'}))

        responses = IResponseContainer(self.todo).list()
        self.assertEquals(1, len(responses))
        self.assertEquals(u'Angebot \xfcberpr\xfcft', responses[0].text)

        self.assertEquals(201, browser.status_code)
        self.assertEquals(
            {
                u'@id':
                u'http://nohost/plone/workspaces/workspace-1/todo-1/@responses/1481272800000000',
                'response_id': 1481272800000000,
                'response_type': 'comment',
                u'created': u'2016-12-09T09:40:00',
                u'changes': [],
                u'creator': {
                    u'token': self.workspace_member.id,
                    u'title': u'Schr\xf6dinger B\xe9atrice'
                },
                u'text': u'Angebot \xfcberpr\xfcft',
            }, browser.json)
    def test_checked_out_docs_arent_listed_twice(self, browser):
        self.login(self.regular_user, browser=browser)

        self._clear_recently_touched_log(self.regular_user.getId())

        with freeze(datetime(2018, 4, 30)):
            manager = queryMultiAdapter(
                (self.document, self.request), ICheckinCheckoutManager)
            manager.checkout()
            notify(ObjectTouchedEvent(self.document))

        url = '%s/@recently-touched/%s' % (
            self.portal.absolute_url(), self.regular_user.getId())
        browser.open(url, method='GET', headers={'Accept': 'application/json'})

        # If a document is both in the log for recently touched objects as
        # well as checked out, it must only be listed once, in the
        # checked out documents section.

        self.assertEqual(200, browser.status_code)
        self.assertEquals(
            {'checked_out': [{
                'icon_class': 'icon-docx is-checked-out-by-current-user',
                'last_touched': '2018-04-30T00:00:00+02:00',
                'target_url': self.document.absolute_url(),
                'title': u'Vertr\xe4gsentwurf'}],
             'recently_touched': []},
            browser.json)
    def test_limits_recently_touched_items(self, browser):
        self.login(self.regular_user, browser=browser)
        user_id = self.regular_user.getId()

        self._clear_recently_touched_log(user_id)

        # Touch a couple documents (more than the current limit)
        docs = [self.document, self.private_document, self.expired_document,
                self.subdocument, self.taskdocument]

        with freeze(datetime(2018, 4, 30)) as freezer:
            for doc in docs:
                freezer.forward(minutes=1)
                notify(ObjectTouchedEvent(doc))

        api.portal.set_registry_record(
            'limit', 3, IRecentlyTouchedSettings)

        url = '%s/@recently-touched/%s' % (
            self.portal.absolute_url(), self.regular_user.getId())
        browser.open(
            url, method='GET', headers={'Accept': 'application/json'})

        # Even though the storage contains more logged touched entries, the
        # API endpoint should truncate them to the currently defined limit.

        self.assertEqual(200, browser.status_code)
        recently_touched_list = browser.json['recently_touched']
        self.assertEqual(3, len(recently_touched_list))
    def test_journal_and_task_pdfs_are_not_listed(self, browser):
        self.activate_feature('tasks-pdf')
        self.activate_feature('journal-pdf')
        self.login(self.secretariat_user, browser)

        create(Builder('task')
               .within(self.empty_dossier)
               .titled(u'Arbeitsentwurf checken')
               .having(responsible_client='fa',
                       responsible=self.secretariat_user.getId(),
                       issuer=self.dossier_responsible.getId(),
                       task_type='correction',
                       deadline=date(2016, 11, 1))
               .in_state('task-state-tested-and-closed'))

        with freeze(datetime(2018, 4, 30)):
            self.resolve(self.empty_dossier, browser)

        url = '%s/@recently-touched/%s' % (
            self.portal.absolute_url(), self.secretariat_user.getId())
        browser.open(url, method='GET', headers={'Accept': 'application/json'})

        self.assertEqual(200, browser.status_code)
        self.assertEquals(
            {'checked_out': [],
             'recently_touched': []},
            browser.json)
    def test_excerpt_json_does_not_contain_start_page(self):
        with freeze(datetime(2018, 5, 4)):
            data = ExcerptProtocolData(self.meeting).get_processed_data()

        self.assertEqual(
            {
                'agenda_items': [],
                'protocol': {
                    'type': u'Protocol-Excerpt'
                },
                'document': {
                    'generated': u'04.05.2018'
                },
                'participants': {
                    'other': [],
                    'members': []
                },
                'committee': {
                    'name': u'Gemeinderat'
                },
                'mandant': {
                    'name': u'Client1'
                },
                'meeting': {
                    'date': u'13.12.2011',
                    'start_time': u'09:30 AM',
                    'end_time': u'11:45 AM',
                    'number': 11,
                    'location': u'B\xe4rn',
                }
            }, data)
 def test_protocol_json(self):
     with freeze(datetime(2018, 5, 4)):
         data = ProtocolData(self.meeting).get_processed_data()
     expected_data = copy.deepcopy(SAMPLE_MEETING_DATA)
     expected_data.update({'document': {'generated': '04.05.2018'}})
     expected_data['meeting']['date'] = '13.12.2011'
     self.assertDictEqual(expected_data, data)
Exemplo n.º 53
0
 def test_changed_is_updated_when_metadata_is_changed(self, browser):
     self.login(self.regular_user, browser)
     with freeze(FREEZING_TIME):
         browser.open(self.document, view='edit')
         browser.fill({"Title": 'foo'})
         browser.find('Save').click()
     self.assert_changed_value(self.document, FREEZING_TIME)
Exemplo n.º 54
0
 def test_changed_is_updated_when_metadata_is_changed(self, browser):
     self.login(self.records_manager, browser)
     with freeze(FREEZING_TIME):
         browser.open(self.disposition, view='edit')
         browser.fill({"Title": 'foo'})
         browser.find('Save').click()
     self.assert_changed_value(self.disposition, FREEZING_TIME)
Exemplo n.º 55
0
 def test_changed_is_updated_when_metadata_is_changed(self, browser):
     self.login(self.administrator, browser)
     with freeze(FREEZING_TIME):
         browser.open(self.inbox_forwarding, view='edit')
         browser.fill({"Title": 'foo'})
         browser.find('Save').click()
     self.assert_changed_value(self.inbox_forwarding, FREEZING_TIME)