From 590ddbbf5671f6fe12aa198f8e4ad3102fd38b2f Mon Sep 17 00:00:00 2001 From: Rodrigo Ferreira de Souza Date: Tue, 3 May 2016 13:03:15 -0300 Subject: [PATCH] Allow traversing to micro-updates --- CHANGES.rst | 5 + src/collective/liveblog/browser/base.py | 7 +- .../liveblog/browser/configure.zcml | 9 ++ src/collective/liveblog/browser/header.py | 7 +- .../liveblog/browser/microupdates.py | 30 ++++++ .../liveblog/browser/templates/microupdate.pt | 91 +++++++++++++++++++ .../liveblog/browser/templates/view.pt | 21 +++-- src/collective/liveblog/content.py | 8 ++ src/collective/liveblog/profiles.zcml | 2 + .../liveblog/profiles/default/metadata.xml | 2 +- src/collective/liveblog/static/styles.css | 10 +- .../liveblog/tests/test_upgrades.py | 43 +++++++++ src/collective/liveblog/tests/test_viewlet.py | 14 ++- src/collective/liveblog/tests/test_views.py | 29 ++++++ src/collective/liveblog/upgrades/__init__.py | 14 +++ .../liveblog/upgrades/configure.zcml | 3 + .../liveblog/upgrades/v1001/__init__.py | 1 + .../liveblog/upgrades/v1001/configure.zcml | 19 ++++ 18 files changed, 298 insertions(+), 17 deletions(-) create mode 100644 src/collective/liveblog/browser/templates/microupdate.pt create mode 100644 src/collective/liveblog/tests/test_upgrades.py create mode 100644 src/collective/liveblog/upgrades/__init__.py create mode 100644 src/collective/liveblog/upgrades/configure.zcml create mode 100644 src/collective/liveblog/upgrades/v1001/__init__.py create mode 100644 src/collective/liveblog/upgrades/v1001/configure.zcml diff --git a/CHANGES.rst b/CHANGES.rst index 33be35f..86128c8 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,10 @@ Changelog 1.1b2 (unreleased) ------------------ +- Micro-updates are now traversable; + this allows to share them as separate pieces of content (closes `#19`_). + [rodfersou, hvelarde] + - Use POST as request method on form used to edit micro-updates. [hvelarde] @@ -109,3 +113,4 @@ Changelog .. _`#7`: https://github.com/collective/collective.liveblog/issues/7 .. _`#10`: https://github.com/collective/collective.liveblog/issues/10 .. _`#14`: https://github.com/collective/collective.liveblog/issues/14 +.. _`#19`: https://github.com/collective/collective.liveblog/issues/19 diff --git a/src/collective/liveblog/browser/base.py b/src/collective/liveblog/browser/base.py index c230b9e..2326db5 100644 --- a/src/collective/liveblog/browser/base.py +++ b/src/collective/liveblog/browser/base.py @@ -7,10 +7,15 @@ class BaseView: """Base view with helper methods for Liveblog.""" + @property + @view.memoize + def is_anonymous(self): + return api.user.is_anonymous() + @property @view.memoize def show_byline(self): """Return True if user is allowed to view 'about' information.""" site_props = api.portal.get_tool('portal_properties').site_properties allow_view = site_props.getProperty('allowAnonymousViewAbout', True) - return not api.user.is_anonymous() or allow_view + return not self.is_anonymous or allow_view diff --git a/src/collective/liveblog/browser/configure.zcml b/src/collective/liveblog/browser/configure.zcml index 18d3258..b4c4716 100644 --- a/src/collective/liveblog/browser/configure.zcml +++ b/src/collective/liveblog/browser/configure.zcml @@ -29,6 +29,15 @@ layer="collective.liveblog.interfaces.IBrowserLayer" /> + + + + + + + +
+
+
+ +

+ Title +

+ +
+ + + by + + Roland Barthes + + + — + + + + + + published + + + August 16, 2001 at 23:35:59 + , + + + + + last modified + + + August 16, 2001 at 23:35:59 + + + +
+
+ +
+ +
+
+
+
+
+
+
+ +
+ +
+ Extracted from: + Liveblog +
+
+
+ + diff --git a/src/collective/liveblog/browser/templates/view.pt b/src/collective/liveblog/browser/templates/view.pt index 6dcc180..3ff0f74 100644 --- a/src/collective/liveblog/browser/templates/view.pt +++ b/src/collective/liveblog/browser/templates/view.pt @@ -49,8 +49,11 @@ tal:attributes="datetime update/isoformat; title update/datetime; data-date update/date; - data-time update/time"> - + data-time update/time; + data-timestamp update/timestamp"> + + + @@ -68,14 +71,16 @@ diff --git a/src/collective/liveblog/content.py b/src/collective/liveblog/content.py index c904f7a..6e0d9b0 100644 --- a/src/collective/liveblog/content.py +++ b/src/collective/liveblog/content.py @@ -26,6 +26,13 @@ def get_microupdates(self): for id, update in enumerate(container): if update is None: continue # update has been removed + + # TODO: it would be better to initialize modified field as None + if update.created == update.modified: + modified = None + else: + modified = api.portal.get_localized_time(update.modified, True) # 28/08/2014 10h58 + updates.append(dict( id=id, creator=update.creator, @@ -34,6 +41,7 @@ def get_microupdates(self): date=api.portal.get_localized_time(update.created), # 28/08/2014 time=api.portal.get_localized_time(update.created, time_only=True), # 10h58 isoformat=update.created.isoformat()[:-3], # 2014-08-28T10:58:10.209468 + modified=modified, title=update.title, text=update.text, )) diff --git a/src/collective/liveblog/profiles.zcml b/src/collective/liveblog/profiles.zcml index 4fc017e..1642b58 100644 --- a/src/collective/liveblog/profiles.zcml +++ b/src/collective/liveblog/profiles.zcml @@ -23,6 +23,8 @@ i18n:attributes="title; description" /> + + diff --git a/src/collective/liveblog/profiles/default/metadata.xml b/src/collective/liveblog/profiles/default/metadata.xml index 796db63..f13799b 100644 --- a/src/collective/liveblog/profiles/default/metadata.xml +++ b/src/collective/liveblog/profiles/default/metadata.xml @@ -1,6 +1,6 @@ - 1000 + 1001 profile-plone.app.dexterity:default diff --git a/src/collective/liveblog/static/styles.css b/src/collective/liveblog/static/styles.css index fad62dc..4b5646c 100644 --- a/src/collective/liveblog/static/styles.css +++ b/src/collective/liveblog/static/styles.css @@ -4,10 +4,6 @@ } .portaltype-liveblog article .field input[type="text"] { width: 100%; - line-height: 125%; - color: black; - letter-spacing: -0.05em; - margin: inherit -0.05em; font-size: 2em; font-weight: bold; } @@ -38,6 +34,9 @@ padding: 1em 0 0 0; position: relative; } +.template-microupdate.portaltype-liveblog #micro-updates article { + border-top: none; +} .microupdate-byline time { background: #f1f1f1; padding: 1em 0; @@ -64,6 +63,9 @@ .microupdate-title, .microupdate-text, .microupdate-byline p { margin-left: 110px; } +.template-microupdate.portaltype-liveblog .microupdate-text { + margin-left: auto; +} .microupdate-byline { color: #666; } diff --git a/src/collective/liveblog/tests/test_upgrades.py b/src/collective/liveblog/tests/test_upgrades.py new file mode 100644 index 0000000..4681532 --- /dev/null +++ b/src/collective/liveblog/tests/test_upgrades.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +from collective.liveblog.testing import INTEGRATION_TESTING + +import unittest + + +class UpgradeBaseTestCase(unittest.TestCase): + + layer = INTEGRATION_TESTING + profile_id = u'collective.liveblog:default' + + def setUp(self): + self.portal = self.layer['portal'] + self.setup = self.portal['portal_setup'] + self.setup.setLastVersionForProfile(self.profile_id, self.from_) + + def _get_upgrade_step_by_title(self, title): + """Return the upgrade step that matches the title specified.""" + self.setup.setLastVersionForProfile(self.profile_id, self.from_) + upgrades = self.setup.listUpgrades(self.profile_id) + steps = [s for s in upgrades[0] if s['title'] == title] + return steps[0] if steps else None + + def _do_upgrade(self, step): + """Execute an upgrade step.""" + request = self.layer['request'] + request.form['profile_id'] = self.profile_id + request.form['upgrades'] = [step['id']] + self.setup.manage_doUpgrades(request=request) + + +class To1001TestCase(UpgradeBaseTestCase): + + from_ = '1' + to_ = '2' + + def test_profile_version(self): + version = self.setup.getLastVersionForProfile(self.profile_id)[0] + self.assertEqual(version, self.from_) + + def test_registered_steps(self): + steps = len(self.setup.listUpgrades(self.profile_id)[0]) + self.assertEqual(steps, 1) diff --git a/src/collective/liveblog/tests/test_viewlet.py b/src/collective/liveblog/tests/test_viewlet.py index 1c13153..bdf0505 100644 --- a/src/collective/liveblog/tests/test_viewlet.py +++ b/src/collective/liveblog/tests/test_viewlet.py @@ -54,11 +54,23 @@ def test_viewlet_order(self): viewlets, [u'plone.path_bar', u'collective.liveblog.header']) def test_viewlet_is_available(self): + from plone.namedfile.file import NamedBlobImage manager = self._get_viewlet_manager() manager.update() viewlet = manager[u'collective.liveblog.header'] viewlet.update() self.assertFalse(viewlet.available()) - from plone.namedfile.file import NamedBlobImage self.liveblog.image = NamedBlobImage() self.assertTrue(viewlet.available()) + + # default view + self.request['URL'] = 'http://nohost/plone/liveblog/view' + self.request['PARENTS'][0] = self.liveblog + self.assertTrue(viewlet.available()) + + # microupdate view + self.request.path = ['1462277979.55'] + self.request['URL'] = 'http://nohost/plone/liveblog/microupdate/1462277979.55' + view = api.content.get_view('microupdate', self.liveblog, self.request) + self.request['PARENTS'][0] = view + self.assertFalse(viewlet.available()) diff --git a/src/collective/liveblog/tests/test_views.py b/src/collective/liveblog/tests/test_views.py index 993c3d8..d4b856a 100644 --- a/src/collective/liveblog/tests/test_views.py +++ b/src/collective/liveblog/tests/test_views.py @@ -6,6 +6,7 @@ from datetime import timedelta from plone import api from time import time +from zExceptions import NotFound from zope.interface import alsoProvides import unittest @@ -52,6 +53,34 @@ def test_date_is_shown_in_microupdates_older_than_today(self): self.assertIn(comment, self.view()) +class MicroUpdateViewTestCase(ViewTestCase): + + def test_no_timestamp_raises_bad_request(self): + self.request.path = [] + view = api.content.get_view('microupdate', self.liveblog, self.request) + self.assertEqual(view(), '') + self.assertEqual(self.request.RESPONSE.getStatus(), 400) + + def test_invalid_timestamp_raises_not_found(self): + self.request.path = ['asdf'] + view = api.content.get_view('microupdate', self.liveblog, self.request) + with self.assertRaises(NotFound): + view.publishTraverse(self.request, 'asdf') + + def test_rendered(self): + _create_microupdates(self.liveblog, 1) + timestamp = self.liveblog.get_microupdates()[0]['timestamp'] + self.request.path = [timestamp] + view = api.content.get_view('microupdate', self.liveblog, self.request) + view.publishTraverse(self.request, timestamp) + rendered = view() + self.assertIn('itemtype="http://schema.org/BlogPosting"', rendered) + self.assertIn('test_user_1_', rendered) + self.assertIn('', rendered) + self.assertNotIn('', rendered) + self.assertIn('data-timestamp="{0}"'.format(timestamp), rendered) + + class UpdateViewTestCase(ViewTestCase): def setUp(self): diff --git a/src/collective/liveblog/upgrades/__init__.py b/src/collective/liveblog/upgrades/__init__.py new file mode 100644 index 0000000..5b41517 --- /dev/null +++ b/src/collective/liveblog/upgrades/__init__.py @@ -0,0 +1,14 @@ +# -*- coding:utf-8 -*- +from plone import api +from collective.liveblog.config import PROJECTNAME + +import logging + +logger = logging.getLogger(PROJECTNAME) + + +def cook_css_resources(context): + """Cook CSS resources.""" + css_tool = api.portal.get_tool('portal_css') + css_tool.cookResources() + logger.info('CSS resources were cooked') diff --git a/src/collective/liveblog/upgrades/configure.zcml b/src/collective/liveblog/upgrades/configure.zcml new file mode 100644 index 0000000..f5037cc --- /dev/null +++ b/src/collective/liveblog/upgrades/configure.zcml @@ -0,0 +1,3 @@ + + + diff --git a/src/collective/liveblog/upgrades/v1001/__init__.py b/src/collective/liveblog/upgrades/v1001/__init__.py new file mode 100644 index 0000000..380474e --- /dev/null +++ b/src/collective/liveblog/upgrades/v1001/__init__.py @@ -0,0 +1 @@ +# -*- coding:utf-8 -*- diff --git a/src/collective/liveblog/upgrades/v1001/configure.zcml b/src/collective/liveblog/upgrades/v1001/configure.zcml new file mode 100644 index 0000000..03e8b8b --- /dev/null +++ b/src/collective/liveblog/upgrades/v1001/configure.zcml @@ -0,0 +1,19 @@ + + + + + + + + +