Source code for ploneintranet.network.upgrades
# coding=utf-8
from BTrees.OOBTree import OOBTree
from datetime import datetime
from logging import getLogger
from plone import api
from ploneintranet.layout.setuphandlers import create_apps
import pytz
default_profile = "profile-ploneintranet.network:default"
logger = getLogger(__name__)
[docs]def upgrade_to_0002(context):
context.runImportStepFromProfile(default_profile, "componentregistry")
[docs]def upgrade_to_0003(context):
""" Get the ploneintranet_network tool and make it bookmark aware
"""
ng = api.portal.get_tool("ploneintranet_network")
if not hasattr(ng, "_bookmarks"):
ng._bookmarks = OOBTree()
if not hasattr(ng, "_bookmarked"):
ng._bookmarked = OOBTree()
for item_type in ng.supported_bookmark_types:
ng._bookmarks.insert(item_type, OOBTree())
ng._bookmarked.insert(item_type, OOBTree())
[docs]def upgrade_to_0004(context):
""" Set timestamps on bookmarks
"""
ng = api.portal.get_tool("ploneintranet_network")
if not hasattr(ng, "_bookmarked_on"):
ng._bookmarked_on = OOBTree()
for btree in ng._bookmarks.values():
for (user_id, item_ids) in btree.items():
_init_bookmark_on(ng, user_id, item_ids)
[docs]def _init_bookmark_on(ng, user_id, item_ids):
# leaves existing intact
ng._bookmarked_on.insert(user_id, OOBTree())
for item_id in item_ids:
if item_id not in ng._bookmarked_on[user_id].keys():
ng._bookmarked_on[user_id][item_id] = datetime.now(pytz.utc)
[docs]def upgrade_to_0005(context):
""" Apps are now objects, so we want to update the bookmark storage
"""
ng = api.portal.get_tool("ploneintranet_network")
# We may have some bookmarked apps as paths
try:
paths = set(ng._bookmarked.get("apps"))
except TypeError:
# no old-style apps bookmarked, nothing to upgrade
logger.info("No old-style apps bookmarks found, move on folks.")
return
# we now have some apps
create_apps()
portal = api.portal.get()
apps = [app for app in portal.apps.objectValues() if app.app]
# We want to create a mapping between those ones
mapping = {}
for path in paths:
for app in apps:
if app.app in path:
mapping[path] = app.UID()
logger.info(
"Mapping path %s to application %s (%s)",
path,
app.title.encode("utf8"),
app.UID(),
)
# If there are some differences, warn the user
for path in paths.difference(mapping):
logger.warning(
"Cannot map path %s to any of %r", path, sorted([app.app for app in apps])
)
# Now we migrate the database
for path in mapping:
uid = mapping[path]
users = ng._bookmarked["apps"].pop(path, [])
for user in users:
# If the app is not already bookmarked for some reason,
# bookmark it
if not ng.is_bookmarked("content", uid, user):
ng.bookmark("content", uid, user)
# but setting an older timestamp (if possible)
old_date = ng._bookmarked_on[user].pop(path, None)
if old_date:
ng._bookmarked_on[user][uid] = old_date
# At this point we also clear the bookmarks
try:
ng._bookmarks["apps"][user].remove(path)
except KeyError:
logger.info("User %s bookmark %s appears already removed", user, path)
# Finally clean up keys with empty values
for user in set(ng._bookmarks.get("apps", [])):
if not ng._bookmarks["apps"][user]:
ng._bookmarks["apps"].pop(user)
if not ng._bookmarks.get("apps"):
ng._bookmarks.pop("apps", None)
if not ng._bookmarked.get("apps"):
ng._bookmarked.pop("apps", None)