From cba07634c60b619d2509007cf14619ed9c540816 Mon Sep 17 00:00:00 2001 From: Ramon Bartl Date: Mon, 3 Feb 2020 13:12:33 +0100 Subject: [PATCH 1/4] Moved setupview into core --- bika/lims/browser/controlpanel.py | 86 ++++++++++++++++++ bika/lims/browser/controlpanel.zcml | 8 ++ bika/lims/browser/css/setupview.css | 32 +++++++ bika/lims/browser/images/gears.png | Bin 0 -> 1206 bytes bika/lims/browser/templates/setupview.pt | 85 +++++++++++++++++ bika/lims/browser/viewlets/configure.zcml | 9 ++ bika/lims/browser/viewlets/setupbutton.py | 35 +++++++ .../browser/viewlets/templates/setupbutton.pt | 14 +++ 8 files changed, 269 insertions(+) create mode 100644 bika/lims/browser/css/setupview.css create mode 100644 bika/lims/browser/images/gears.png create mode 100644 bika/lims/browser/templates/setupview.pt create mode 100644 bika/lims/browser/viewlets/setupbutton.py create mode 100644 bika/lims/browser/viewlets/templates/setupbutton.pt diff --git a/bika/lims/browser/controlpanel.py b/bika/lims/browser/controlpanel.py index 418e44bf60..ecfdb4ecbe 100644 --- a/bika/lims/browser/controlpanel.py +++ b/bika/lims/browser/controlpanel.py @@ -18,10 +18,96 @@ # Copyright 2018-2020 by it's authors. # Some rights reserved, see README and LICENSE. +import os + +from bika.lims.utils import t from plone.app.controlpanel.overview import OverviewControlPanel +from plone.memoize.volatile import cache +from plone.memoize.volatile import store_on_context +from Products.Five.browser import BrowserView from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile +from bika.lims import api + + +def modified_cache_key(method, self, brain_or_object): + """A cache key that returns the millis of the last modification time + """ + return api.get_modification_date(brain_or_object).millis() class SenaiteOverviewControlPanel(OverviewControlPanel): + """Bootstrapped version of the standard Plone Control Panel + """ template = ViewPageTemplateFile( "templates/plone.app.controlpanel.overview.pt") + + +class SetupView(BrowserView): + """Ordered overview of all Setup Items + """ + template = ViewPageTemplateFile("templates/setupview.pt") + + def __init__(self, context, request): + self.context = context + self.request = request + + def __call__(self): + self.request.set("disable_border", 1) + return self.template() + + @property + def portal(self): + """Returns the Portal Object + """ + return api.get_portal() + + @property + def setup(self): + """Returns the Senaite Setup Object + """ + return api.get_setup() + + @cache(modified_cache_key, store_on_context) + def get_icon_url(self, brain): + """Returns the (big) icon URL for the given catalog brain + """ + icon_url = api.get_icon(brain, html_tag=False) + url, icon = icon_url.rsplit("/", 1) + relative_url = url.lstrip(self.portal.absolute_url()) + name, ext = os.path.splitext(icon) + + # big icons endwith _big + if not name.endswith("_big"): + icon = "{}_big{}".format(name, ext) + + icon_big_url = "/".join([relative_url, icon]) + + # fall back to a default icon if the looked up icon does not exist + if self.context.restrictedTraverse(icon_big_url, None) is None: + icon_big_url = "++resource++bika.lims.images/gears.png" + + return icon_big_url + + def setupitems(self): + """Lookup available setup items + + :returns: catalog brains + """ + query = { + "path": { + "query": api.get_path(self.setup), + "depth": 1, + }, + } + items = api.search(query, "portal_catalog") + # filter out items + items = filter(lambda item: not item.exclude_from_nav, items) + + # sort by (translated) title + def cmp_by_translated_title(brain1, brain2): + title1 = t(api.get_title(brain1)) + title2 = t(api.get_title(brain2)) + # XXX: Python 3 compatibility + return cmp(title1, title2) + + return sorted(items, cmp=cmp_by_translated_title) diff --git a/bika/lims/browser/controlpanel.zcml b/bika/lims/browser/controlpanel.zcml index 13814ac408..4a268bb511 100644 --- a/bika/lims/browser/controlpanel.zcml +++ b/bika/lims/browser/controlpanel.zcml @@ -15,4 +15,12 @@ permission="plone.app.controlpanel.Overview" layer="bika.lims.interfaces.IBikaLIMS"/> + + + diff --git a/bika/lims/browser/css/setupview.css b/bika/lims/browser/css/setupview.css new file mode 100644 index 0000000000..7476dc318c --- /dev/null +++ b/bika/lims/browser/css/setupview.css @@ -0,0 +1,32 @@ +/* CSS Styles for the SENAITE Setup View*/ +.vcenter { + display: inline-block; + vertical-align: middle; + float: none; +} +.tile { + width: 100%; + height: 6em; + box-sizing: border-box; + display: inline-block; + background: #d9edf7; + padding: 2em; + margin: auto auto 1em auto; + overflow: hidden; +} +.tile .title { + text-transform: uppercase; + font-weight: bold; + text-overflow: ellipsis; + overflow: hidden; +} +.tile:hover { + background: #d9edff; + text-decoration: none; +} +.tile.setup { + background: #ddd; +} +.tile.setup:hover { + background: #aaa; +} diff --git a/bika/lims/browser/images/gears.png b/bika/lims/browser/images/gears.png new file mode 100644 index 0000000000000000000000000000000000000000..16ad2104cf0b344237504ede62d7a8a25c7fbeb4 GIT binary patch literal 1206 zcmV;n1WEgeP)C}R{3hn4Tl+4}mr97WMq>^qam@EHt70Uv-up@^KHpOZ0}eb=_sGi z|Ak19Mx!BIE;mOakuHd2#A0!(;q;}`={pn(rFeB$OeXWS$K#ns5QGWG#3WZ`L91bf>rBZ860Z^&bA`qPE$jHbh zkzO{N<&sFGH$=LVlap(;_$Q+%N+n|U_xJxq#Ovboa0O;!*4hny}i9@qFqf)Oa#nk^Ou#vtXgFNdDpM32RG! zP$rYfZ&In02mqi|Dz!?b(inCe|EP(4KHo7nH|N~h*}0FcRqGBOkN4u>;NT9xUsKfW zc28H{69539R;!<4vMd(s72b!*WO7`wcQZyuN8h?9oKEKq#>?e$>|ikX5nlf2=;(c& zPUpwuT`t!Q06;3060zCr696cS#o|<@J8p*G@1MeqQK{78>FH^EEEc;P3WXkMwc0fR zDEoZADUZivI6FIg4*(#MNDSeFX0ceW$Yk>6?66oY%S{#B*x1~{O7 za7`D;WU?p#t_$h`ilVJF8VvyeP^nbkdcEF{*=+vGZnrNa5(%kJ zr&|R85C{a%_xAQ=4u|6tzu(_@*J(7GC)iF3g~BZW0I%0;z}AAn;Kx^MLakOm4Fm!c zO{E<}G#b6v*Vp$90Losk*H9=FZmCqNZvddI)oRyrxg5J$A2&j;*I!mSo@L z_H3#Gkx2ARuh*}}VzIl)WU_C3eEhp&u}JUi?ELke?;ek6G + + + + + + + + + + + + + + + + + + + diff --git a/bika/lims/browser/viewlets/configure.zcml b/bika/lims/browser/viewlets/configure.zcml index 7b4dd5bcec..ff869b7619 100644 --- a/bika/lims/browser/viewlets/configure.zcml +++ b/bika/lims/browser/viewlets/configure.zcml @@ -2,6 +2,15 @@ xmlns:browser="http://namespaces.zope.org/browser" i18n_domain="senaite.core"> + + + +
+ + + + + + + +
From 2798588c49d1c390da0f371308b8d89cd93bd446 Mon Sep 17 00:00:00 2001 From: Ramon Bartl Date: Mon, 3 Feb 2020 13:19:55 +0100 Subject: [PATCH 2/4] Imports sorted --- bika/lims/browser/viewlets/setupbutton.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bika/lims/browser/viewlets/setupbutton.py b/bika/lims/browser/viewlets/setupbutton.py index 73a89ef002..9ee4091136 100644 --- a/bika/lims/browser/viewlets/setupbutton.py +++ b/bika/lims/browser/viewlets/setupbutton.py @@ -18,9 +18,9 @@ # Copyright 2018-2019 by it's authors. # Some rights reserved, see README and LICENSE. +from bika.lims import api from plone.app.layout.viewlets.common import ViewletBase from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile -from bika.lims import api class SenaiteSetupButtonViewlet(ViewletBase): From 3ee7fa1bc917b78c4d329d2afb0916c63dfefd60 Mon Sep 17 00:00:00 2001 From: Ramon Bartl Date: Mon, 3 Feb 2020 13:35:19 +0100 Subject: [PATCH 3/4] Don't render QC viewlet on setup screen --- bika/lims/browser/viewlets/instruments.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bika/lims/browser/viewlets/instruments.py b/bika/lims/browser/viewlets/instruments.py index f2a7514d23..2e3f175eb3 100644 --- a/bika/lims/browser/viewlets/instruments.py +++ b/bika/lims/browser/viewlets/instruments.py @@ -91,9 +91,11 @@ def get_failed_instruments(self): def available(self): """Control availability of the viewlet """ - url = api.get_url(self.context) + context_state = api.get_view("plone_context_state") + url = context_state.current_page_url() + portal_url = api.get_url(api.get_portal()) # render on the portal root - if self.context == api.get_portal(): + if url.endswith(portal_url): return True # render on the front-page if url.endswith("/front-page"): From 7a59f73049f1e157892de9d1ac35138ede0b0158 Mon Sep 17 00:00:00 2001 From: Ramon Bartl Date: Mon, 3 Feb 2020 13:43:32 +0100 Subject: [PATCH 4/4] Changelog updated --- CHANGES.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.rst b/CHANGES.rst index a02b05bb2a..e5776a9dc4 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -7,6 +7,7 @@ Changelog **Added** +- #1515 Moved Setup View into Core - #1506 Specification non-compliant viewlet in Sample - #1506 Sample results ranges out-of-date viewlet in Sample - #1506 Warn icon in analyses when range is not compliant with Specification