Passed
Push — 2.x ( 27353a...2605e4 )
by Jordi
05:12
created

senaite.core.scripts._upgrade_sites.run()   A

Complexity

Conditions 3

Size

Total Lines 12
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 10
dl 0
loc 12
rs 9.9
c 0
b 0
f 0
cc 3
nop 1
1
# -*- coding: utf-8 -*-
2
3
import transaction
4
from AccessControl.SecurityManagement import newSecurityManager
5
from bika.lims import api
6
from senaite.core import logger
7
from senaite.core.decorators import retriable
8
from senaite.core.scripts import parser
9
from senaite.core.scripts.utils import setup_site
10
11
__doc__ = """Run upgrade profiles on sites
12
"""
13
14
parser.description = __doc__
15
16
17
def get_site_ids(app):
18
    """Returns a list of available site ids
19
    """
20
    sites = app.objectValues("Plone Site")
21
    return map(api.get_id, sites)
22
23
24
def run_last_upgrade_step(portal_setup, profile_id):
25
    """Run the last upgrade step
26
    """
27
    upgrades = portal_setup.listUpgrades(profile_id, show_old=True)
28
29
    # we always take the last upgrade step
30
    if not upgrades:
31
        return
32
33
    upgrade = upgrades[-1]
34
    step = upgrade.get("step")
35
    if step:
36
        sdest = upgrade.get("sdest")
37
        logger.debug("Running upgrade step %s for profile %s"
38
                     % (sdest, profile_id))
39
        step.doStep(portal_setup)
40
41
42
@retriable(sync=True)
43
def upgrade(site):
44
    setup_site(site)
45
46
    # attempt to upgrade plone first
47
    pm = site.portal_migration
48
    report = pm.upgrade(dry_run=False)
49
    if report:
50
        logger.debug(report)
51
    ps = site.portal_setup
52
    # go through all profiles that need upgrading
53
    for profile_id in ps.listProfilesWithUpgrades():
54
        if not profile_id.startswith("senaite"):
55
            continue
56
        run_last_upgrade_step(ps, profile_id)
57
    transaction.commit()
58
59
60
def run(app):
61
    args, _ = parser.parse_known_args()
62
    user = app.acl_users.getUser("admin")
63
    newSecurityManager(None, user.__of__(app.acl_users))
64
65
    if args.site_id:
66
        site = app[args.site_id]
67
        upgrade(site)
68
    else:
69
        for sid in get_site_ids(app):
70
            site = app[sid]
71
            upgrade(site)
72
73
74
if __name__ == "__main__":
75
    run(app)  # noqa
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable app does not seem to be defined.
Loading history...
76