Passed
Push — master ( caa188...9d0ad3 )
by Ramon
11:25 queued 07:12
created

LateAnalysesView.folderitems()   B

Complexity

Conditions 5

Size

Total Lines 35
Code Lines 34

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 34
dl 0
loc 35
rs 8.5973
c 0
b 0
f 0
cc 5
nop 1
1
# -*- coding: utf-8 -*-
2
#
3
# This file is part of SENAITE.CORE
4
#
5
# Copyright 2018 by it's authors.
6
# Some rights reserved. See LICENSE.rst, CONTRIBUTORS.rst.
7
8
from AccessControl import getSecurityManager
9
from DateTime import DateTime
10
from Products.CMFCore.utils import getToolByName
11
from bika.lims import api
12
from bika.lims import bikaMessageFactory as _
13
from bika.lims.utils import t
14
from bika.lims.browser.bika_listing import BikaListingView
15
from bika.lims.utils import isActive
16
from zope.component import getMultiAdapter
17
import plone
18
19
class LateAnalysesView(BikaListingView):
20
    """ Late analyses (click from portlet_late_analyses More... link)
21
    """
22
    def __init__(self, context, request):
23
        super(LateAnalysesView, self).__init__(context, request)
24
        self.catalog = 'bika_analysis_catalog'
25
        self.contentFilter = {
26
            'portal_type':'Analysis',
27
            'getDueDate': {'query': [DateTime(),], 'range': 'max'},
28
            'review_state':['assigned',
29
                            'sample_received',
30
                            'to_be_verified',
31
                            'verified'],
32
            'cancellation_state': 'active',
33
            'sort_on': 'getDateReceived'
34
        }
35
        self.title = self.context.translate(_("Late Analyses"))
36
        self.description = ""
37
        self.context_actions = {}
38
        self.show_sort_column = False
39
        self.show_select_row = False
40
        self.show_select_column = False
41
        self.pagesize = 100
42
        self.show_workflow_action_buttons = False
43
        self.view_url = self.view_url + "/late_analyses"
44
45
        request.set('disable_border', 1)
46
47
        self.columns = {'Analysis': {'title': _('Analysis'),
48
                                     'index': 'sortable_title'},
49
                        'getRequestID': {'title': _('Request ID'),
50
                                         'index': 'getRequestID'},
51
                        'Client': {'title': _('Client')},
52
                        'Contact': {'title': _('Contact')},
53
                        'DateReceived': {'title': _('Date Received'),
54
                                         'index': 'getDateReceived'},
55
                        'DueDate': {'title': _('Due Date'),
56
                                    'index': 'getDueDate'},
57
                        'Late': {'title': _('Late')},
58
                        }
59
60
        self.review_states = [
61
            {'id':'default',
62
             'title': _('All'),
63
             'contentFilter':{},
64
             'columns':['Analysis',
65
                        'getRequestID',
66
                        'Client',
67
                        'Contact',
68
                        'DateReceived',
69
                        'DueDate',
70
                        'Late'],
71
             },
72
        ]
73
74
    def folderitems(self):
75
        items = super(LateAnalysesView, self).folderitems()
76
        mtool = getToolByName(self.context, 'portal_membership')
77
        member = mtool.getAuthenticatedMember()
78
        roles = member.getRoles()
79
        hideclientlink = 'RegulatoryInspector' in roles \
80
            and 'Manager' not in roles \
81
            and 'LabManager' not in roles \
82
            and 'LabClerk' not in roles
83
84
        for x in range(len(items)):
85
            if not items[x].has_key('obj'):
86
                continue
87
            obj = items[x]['obj']
88
            ar = obj.aq_parent
89
            sample = ar.getSample()
90
            client = ar.aq_parent
91
            contact = ar.getContact()
92
            items[x]['Analysis'] = obj.Title()
93
            items[x]['getRequestID'] = ''
94
            items[x]['replace']['getRequestID'] = "<a href='%s'>%s</a>" % \
95
                 (ar.absolute_url(), ar.Title())
96
            items[x]['Client'] = ''
97
            if hideclientlink == False:
98
                items[x]['replace']['Client'] = "<a href='%s'>%s</a>" % \
99
                     (client.absolute_url(), client.Title())
100
            items[x]['Contact'] = ''
101
            if contact:
102
                items[x]['replace']['Contact'] = "<a href='mailto:%s'>%s</a>" % \
103
                                                 (contact.getEmailAddress(),
104
                                                  contact.getFullname())
105
            items[x]['DateReceived'] = self.ulocalized_time(sample.getDateReceived())
106
            items[x]['DueDate'] = self.ulocalized_time(obj.getDueDate())
107
            items[x]['Late'] = api.to_dhm_format(obj.getLateness())
108
        return items
109
110
    def isItemAllowed(self, obj):
111
        """Checks if the passed in Analysis must be displayed in the list.
112
113
        If the 'filtering by department' option is enabled in Bika Setup, this
114
        function checks if the Analysis Service associated to the Analysis is
115
        assigned to any of the currently selected departments (information
116
        stored in a cookie).
117
118
        If department filtering is disabled in bika_setup, returns True. If the
119
        obj is None or empty, returns False.
120
121
        If the obj has no department assigned, returns True
122
123
        :param obj: A single Analysis brain or content object
124
        :type obj: ATContentType/CatalogBrain
125
        :returns: True if the item can be added to the list.
126
        :rtype: bool
127
        """
128
        if not obj:
129
            return False
130
131
        if not self.context.bika_setup.getAllowDepartmentFiltering():
132
            # Filtering by department is disabled. Return True
133
            return True
134
135
        # Department filtering is enabled. Check if the Analysis Service
136
        # associated to this Analysis is assigned to at least one of the
137
        # departments currently selected.
138
        dep_uid = obj.getDepartmentUID()
139
        departments = self.request.get('filter_by_department_info', '')
140
        return not dep_uid or dep_uid in departments.split(',')
141