Passed
Push — 2.x ( 6901b2...882482 )
by Jordi
07:20
created

Setup.getAlwaysCCResponsiblesInReportEmail()   A

Complexity

Conditions 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 4
dl 0
loc 6
rs 10
c 0
b 0
f 0
cc 1
nop 1
1
# -*- coding: utf-8 -*-
2
3
from AccessControl import ClassSecurityInfo
4
from bika.lims import api
5
from plone.app.textfield import IRichTextValue
6
from plone.app.textfield.widget import RichTextFieldWidget  # TBD: port to core
7
from plone.autoform import directives
8
from plone.formwidget.namedfile.widget import NamedFileFieldWidget
9
from plone.supermodel import model
10
from Products.CMFCore import permissions
11
from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
12
from senaite.core.catalog import AUDITLOG_CATALOG
13
from senaite.core.content.base import Container
14
from senaite.core.interfaces import IHideActionsMenu
15
from senaite.core.interfaces import ISetup
16
from senaite.core.schema import RichTextField
17
from senaite.impress import senaiteMessageFactory as _
18
from zope import schema
19
from zope.interface import implementer
20
from zope.interface import provider
21
from zope.schema.interfaces import IContextAwareDefaultFactory
22
23
24
@provider(IContextAwareDefaultFactory)
25
def default_email_body_sample_publication(context):
26
    """Returns the default body text for publication emails
27
    """
28
    view = api.get_view("senaite_view", context=api.get_setup())
29
    if view is None:
30
        # Test fixture
31
        return u""
32
    tpl = ViewPageTemplateFile(
33
        "../browser/setup/templates/email_body_sample_publication.pt")
34
    return tpl(view)
35
36
37
class ISetupSchema(model.Schema):
38
    """Schema and marker interface
39
    """
40
41
    directives.widget("email_body_sample_publication", RichTextFieldWidget)
42
    email_body_sample_publication = RichTextField(
43
        title=_("title_senaitesetup_publication_email_text",
44
                default=u"Publication Email Text"),
45
        description=_(
46
            "description_senaitesetup_publication_email_text",
47
            default=u"Set the email body text to be used by default "
48
            "when sending out result reports to the selected recipients. "
49
            "You can use reserved keywords: "
50
            "$client_name, $recipients, $lab_name, $lab_address"),
51
        defaultFactory=default_email_body_sample_publication,
52
        required=False,
53
    )
54
55
    always_cc_responsibles_in_report_emails = schema.Bool(
56
        title=_(
57
            "title_senaitesetup_always_cc_responsibles_in_report_emails",
58
            default=u"Always send publication email to responsibles"),
59
        description=_(
60
            "description_senaitesetup_always_cc_responsibles_in_report_emails",
61
            default="When selected, the responsible persons of all involved "
62
            "lab departments will receive publication emails."
63
        ),
64
        default=True,
65
    )
66
67
    enable_global_auditlog = schema.Bool(
68
        title=_(u"Enable global Auditlog"),
69
        description=_(
70
            "The global Auditlog shows all modifications of the system. "
71
            "When enabled, all entities will be indexed in a separate "
72
            "catalog. This will increase the time when objects are "
73
            "created or modified."
74
        ),
75
        default=False,
76
    )
77
78
    # NOTE:
79
    # We use the `NamedFileFieldWidget` instead of `NamedImageFieldWidget`
80
    # by purpose! Using the latter rises this PIL error (appears only in log):
81
    # IOError: cannot identify image file <cStringIO.StringI object at ...>
82
    directives.widget("site_logo", NamedFileFieldWidget)
83
    site_logo = schema.Bytes(
84
        title=_(u"Site Logo"),
85
        description=_(u"This shows a custom logo on your SENAITE site."),
86
        required=False,
87
    )
88
89
    site_logo_css = schema.ASCII(
90
        title=_(u"Site Logo CSS"),
91
        description=_(
92
            u"Add custom CSS rules for the Logo, "
93
            u"e.g. height:15px; width:150px;"
94
        ),
95
        required=False,
96
    )
97
98
    immediate_results_entry = schema.Bool(
99
        title=_(u"Immediate results entry"),
100
        description=_(
101
            "description_senaitesetup_immediateresultsentry",
102
            default=u"Allow the user to directly enter results after sample "
103
            "creation, e.g. to enter field results immediately, or lab "
104
            "results, when the automatic sample reception is activated."
105
        ),
106
    )
107
108
    categorize_sample_analyses = schema.Bool(
109
        title=_("title_senaitesetup_categorizesampleanalyses",
110
                default=u"Categorize sample analyses"),
111
        description=_(
112
            "description_senaitesetup_categorizesampleanalyses",
113
            default=u"Group analyses by category for samples"
114
        ),
115
        default=False,
116
    )
117
118
    sample_analyses_required = schema.Bool(
119
        title=_("title_senaitesetup_sampleanalysesrequired",
120
                default=u"Require sample analyses"),
121
        description=_(
122
            "description_senaitesetup_sampleanalysesrequired",
123
            default=u"Analyses are required for sample registration"
124
        ),
125
        default=True,
126
    )
127
128
    ###
129
    # Fieldsets
130
    ###
131
    model.fieldset(
132
        "analyses",
133
        label=_("label_senaitesetup_fieldset_analyses", default=u"Analyses"),
134
        fields=[
135
            "immediate_results_entry",
136
            "categorize_sample_analyses",
137
            "sample_analyses_required",
138
        ]
139
    )
140
141
    model.fieldset(
142
        "notifications",
143
        label=_(u"Notifications"),
144
        fields=[
145
            "email_body_sample_publication",
146
            "always_cc_responsibles_in_report_emails",
147
        ]
148
    )
149
150
    model.fieldset(
151
        "appearance",
152
        label=_(u"Appearance"),
153
        fields=[
154
            "site_logo",
155
            "site_logo_css",
156
        ]
157
    )
158
159
160
@implementer(ISetup, ISetupSchema, IHideActionsMenu)
161
class Setup(Container):
162
    """SENAITE Setup Folder
163
    """
164
    security = ClassSecurityInfo()
165
166
    @security.protected(permissions.View)
167
    def getEmailBodySamplePublication(self):
168
        """Returns the transformed email body text for publication emails
169
        """
170
        accessor = self.accessor("email_body_sample_publication")
171
        value = accessor(self)
172
        if IRichTextValue.providedBy(value):
173
            # Transforms the raw value to the output mimetype
174
            value = value.output_relative_to(self)
175
        if not value:
176
            # Always fallback to default value
177
            value = default_email_body_sample_publication(self)
178
        return value
179
180
    @security.protected(permissions.ModifyPortalContent)
181
    def setEmailBodySamplePublication(self, value):
182
        """Set email body text for publication emails
183
        """
184
        mutator = self.mutator("email_body_sample_publication")
185
        return mutator(self, value)
186
187
    @security.protected(permissions.View)
188
    def getAlwaysCCResponsiblesInReportEmail(self):
189
        """Returns if responsibles should always receive publication emails
190
        """
191
        accessor = self.accessor("always_cc_responsibles_in_report_emails")
192
        return accessor(self)
193
194
    @security.protected(permissions.View)
195
    def setAlwaysCCResponsiblesInReportEmail(self, value):
196
        """Set if responsibles should always receive publication emails
197
        """
198
        mutator = self.mutator("always_cc_responsibles_in_report_emails")
199
        return mutator(self, value)
200
201
    @security.protected(permissions.View)
202
    def getEnableGlobalAuditlog(self):
203
        """Returns if the global Auditlog is enabled
204
        """
205
        accessor = self.accessor("enable_global_auditlog")
206
        return accessor(self)
207
208
    @security.protected(permissions.ModifyPortalContent)
209
    def setEnableGlobalAuditlog(self, value):
210
        """Enable/Disable global Auditlogging
211
        """
212
        if value is False:
213
            # clear the auditlog catalog
214
            catalog = api.get_tool(AUDITLOG_CATALOG)
215
            catalog.manage_catalogClear()
216
        mutator = self.mutator("enable_global_auditlog")
217
        return mutator(self, value)
218
219
    @security.protected(permissions.View)
220
    def getSiteLogo(self):
221
        """Returns the global site logo
222
        """
223
        accessor = self.accessor("site_logo")
224
        return accessor(self)
225
226
    @security.protected(permissions.ModifyPortalContent)
227
    def setSiteLogo(self, value):
228
        """Set the site logo
229
        """
230
        mutator = self.mutator("site_logo")
231
        return mutator(self, value)
232
233
    @security.protected(permissions.View)
234
    def getSiteLogoCSS(self):
235
        """Returns the global site logo
236
        """
237
        accessor = self.accessor("site_logo_css")
238
        return accessor(self)
239
240
    @security.protected(permissions.ModifyPortalContent)
241
    def setSiteLogoCSS(self, value):
242
        """Set the site logo
243
        """
244
        mutator = self.mutator("site_logo_css")
245
        return mutator(self, value)
246
247
    @security.protected(permissions.View)
248
    def getImmediateResultsEntry(self):
249
        """Returns if immediate results entry is enabled or not
250
        """
251
        accessor = self.accessor("immediate_results_entry")
252
        return accessor(self)
253
254
    @security.protected(permissions.ModifyPortalContent)
255
    def setImmediateResultsEntry(self, value):
256
        """Enable/Disable global Auditlogging
257
        """
258
        mutator = self.mutator("immediate_results_entry")
259
        return mutator(self, value)
260
261
    @security.protected(permissions.View)
262
    def getCategorizeSampleAnalyses(self):
263
        """Returns if analyses should be grouped by category for samples
264
        """
265
        accessor = self.accessor("categorize_sample_analyses")
266
        return accessor(self)
267
268
    @security.protected(permissions.ModifyPortalContent)
269
    def setCategorizeSampleAnalyses(self, value):
270
        """Enable/Disable grouping of analyses by category for samples
271
        """
272
        mutator = self.mutator("categorize_sample_analyses")
273
        return mutator(self, value)
274
275
    @security.protected(permissions.View)
276
    def getSampleAnalysesRequired(self):
277
        """Returns if analyses are required in sample add form
278
        """
279
        accessor = self.accessor("sample_analyses_required")
280
        return accessor(self)
281
282
    @security.protected(permissions.ModifyPortalContent)
283
    def setSampleAnalysesRequired(self, value):
284
        """Allow/Disallow to create samples without analyses
285
        """
286
        mutator = self.mutator("sample_analyses_required")
287
        return mutator(self, value)
288