Completed
Push — master ( 8d2e48...36dfc2 )
by Ramon
07:01 queued 02:36
created

bika.lims.workflow.analysisrequest.events   A

Complexity

Total Complexity 24

Size/Duplication

Total Lines 222
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 24
eloc 56
dl 0
loc 222
rs 10
c 0
b 0
f 0

15 Functions

Rating   Name   Duplication   Size   Complexity  
A after_reinstate() 0 11 2
A after_cancel() 0 11 2
A after_attach() 0 10 1
A after_verify() 0 10 1
A after_publish() 0 12 2
A after_invalidate() 0 7 1
A after_sampling_workflow() 0 14 1
A after_reject() 0 27 5
A _promote_transition() 0 8 2
A after_receive() 0 13 1
A after_no_sampling_workflow() 0 14 1
A after_sample() 0 11 1
A after_schedule_sampling() 0 10 1
A after_preserve() 0 13 1
A after_retract() 0 10 2
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 bika.lims.utils.analysisrequest import create_retest
9
from bika.lims.workflow import doActionFor
10
from bika.lims.workflow import getCurrentState
11
12
13
def _promote_transition(obj, transition_id):
14
    """Promotes the transition passed in to the object's parent
15
    :param obj: Analysis Request for which the transition has to be promoted
16
    :param transition_id: Unique id of the transition
17
    """
18
    sample = obj.getSample()
19
    if sample:
20
        doActionFor(sample, transition_id)
21
22
23
def after_no_sampling_workflow(obj):
24
    """Method triggered after a 'no_sampling_workflow' transition for the
25
    Analysis Request passed inis performed. Performs the same transition to the
26
    parent's Sample.
27
    This function is called automatically by
28
    bika.lims.workflow.AfterTransitionEventHandler
29
    :param obj: Analysis Request affected by the transition
30
    :type obj: AnalysisRequest
31
    """
32
33
    # Do note that the 'no_sampling' transition for Sample already transitions
34
    # all the analyses associated to all the sample partitions, so there
35
    # is no need to transition neither the analyses nor partitions here
36
    _promote_transition(obj, 'no_sampling_workflow')
37
38
39
def after_sampling_workflow(obj):
40
    """Method triggered after a 'sampling_workflow' transition for the
41
    Analysis Request passed in is performed. Performs the same transition to
42
    the parent's Sample.
43
    This function is called automatically by
44
    bika.lims.workflow.AfterTransitionEventHandler
45
    :param obj: Analysis Request affected by the transition
46
    :type obj: AnalysisRequest
47
    """
48
49
    # Do note that the 'sampling' transition for Sample already transitions
50
    # all the analyses associated to all the sample partitions, so there
51
    # is no need to transition neither the analyses nor partitions here
52
    _promote_transition(obj, 'sampling_workflow')
53
54
55
def after_preserve(obj):
56
    """Method triggered after a 'preserve' transition for the Analysis Request
57
    passed in is performed. Promotes the same transition to parent's Sample.
58
    This function is called automatically by
59
    bika.lims.workflow.AfterTransitionEventHandler
60
    :param obj: Analysis Request affected by the transition
61
    :type obj: AnalysisRequest
62
    """
63
64
    # Do note that the 'preserve' transition for Sample already transitions
65
    # all the analyses associated to all the sample partitions, so there
66
    # is no need to transition neither the analyses nor partitions here
67
    _promote_transition(obj, 'preserve')
68
69
70
def after_schedule_sampling(obj):
71
    """Method triggered after a 'schedule_sampling' transition for the Analysis
72
    Request passed in is performed. Promotes the same transition to parent's
73
    Sample.
74
    This function is called automatically by
75
    bika.lims.workflow.AfterTransitionEventHandler
76
    :param obj: Analysis Request affected by the transition
77
    :type obj: AnalysisRequest
78
    """
79
    _promote_transition(obj, 'schedule_sampling')
80
81
82
def after_sample(obj):
83
    """Method triggered after a 'sample' transition for the Analysis Request
84
    passed in is performed. Promotes sample transition to parent's sample
85
    bika.lims.workflow.AfterTransitionEventHandler
86
    :param obj: Analysis Request affected by the transition
87
    :type obj: AnalysisRequest
88
    """
89
    # Do note that the 'sample' transition for Sample already transitions
90
    # all the analyses associated to all the sample partitions, so there
91
    # is no need to transition neither the analyses nor partitions here
92
    _promote_transition(obj, 'sample')
93
94
95
def after_receive(obj):
96
    """Method triggered after a 'receive' transition for the Analysis Request
97
    passed in is performed. Responsible of triggering cascade actions such as
98
    transitioning the container (sample), as well as associated analyses.
99
    This function is called automatically by
100
    bika.lims.workflow.AfterTransitionEventHandler
101
    :param obj: Analysis Request affected by the transition
102
    :type obj: AnalysisRequest
103
    """
104
    # Do note that the 'sample' transition for Sample already transitions
105
    # all the analyses associated to all the sample partitions, so there
106
    # is no need to transition neither the analyses nor partitions here
107
    _promote_transition(obj, 'receive')
108
109
110
def after_reject(obj):
111
    """Method triggered after a 'reject' transition for the Analysis Request
112
    passed in is performed. Transitions and sets the rejection reasons to the
113
    parent Sample. Also transitions the analyses assigned to the AR
114
    bika.lims.workflow.AfterTransitionEventHandler
115
    :param obj: Analysis Request affected by the transition
116
    :type obj: AnalysisRequest
117
    """
118
    sample = obj.getSample()
119
    if not sample:
120
        return
121
122
    if getCurrentState(sample) != 'rejected':
123
        doActionFor(sample, 'reject')
124
        reasons = obj.getRejectionReasons()
125
        sample.setRejectionReasons(reasons)
126
127
    # Deactivate all analyses from this Analysis Request
128
    ans = obj.getAnalyses(full_objects=True)
129
    for analysis in ans:
130
        doActionFor(analysis, 'reject')
131
132
    if obj.bika_setup.getNotifyOnRejection():
133
        # Import here to brake circular importing somewhere
134
        from bika.lims.utils.analysisrequest import notify_rejection
135
        # Notify the Client about the Rejection.
136
        notify_rejection(obj)
137
138
139
def after_retract(obj):
140
    """Method triggered after a 'retract' transition for the Analysis Request
141
    passed in is performed. Transitions and sets the analyses of the Analyses
142
    Request to retracted.
143
    :param obj: Analysis Request affected by the transition
144
    :type obj: AnalysisRequest
145
    """
146
    ans = obj.getAnalyses(full_objects=True)
147
    for analysis in ans:
148
        doActionFor(analysis, 'retract')
149
150
151
def after_invalidate(obj):
152
    """Function triggered after 'invalidate' transition for the Analysis
153
    Request passed in is performed. Creates a retest
154
    :param obj: Analysis Request affected by the transition
155
    :type obj: AnalysisRequest
156
    """
157
    create_retest(obj)
158
159
160
def after_attach(obj):
161
    """Method triggered after an 'attach' transition for the Analysis Request
162
    passed in is performed.
163
    This function is called automatically by
164
    bika.lims.workflow.AfterTransitionEventHandler
165
    :param obj: Analysis Request affected by the transition
166
    :type obj: AnalysisRequest
167
    """
168
    # Don't cascade. Shouldn't be attaching ARs for now (if ever).
169
    pass
170
171
172
def after_verify(obj):
173
    """Method triggered after a 'verify' transition for the Analysis Request
174
    passed in is performed. Responsible of triggering cascade actions to
175
    associated analyses.
176
    This function is called automatically by
177
    bika.lims.workflow.AfterTransitionEventHandler
178
    :param obj: Analysis Request affected by the transition
179
    :type obj: AnalysisRequest
180
    """
181
    pass
182
183
184
def after_publish(obj):
185
    """Method triggered after an 'publish' transition for the Analysis Request
186
    passed in is performed. Performs the 'publish' transition to children.
187
    This function is called automatically by
188
    bika.lims.workflow.AfterTransitionEventHandler
189
    :param obj: Analysis Request affected by the transition
190
    :type obj: AnalysisRequest
191
    """
192
    # Transition the children
193
    ans = obj.getAnalyses(full_objects=True)
194
    for analysis in ans:
195
        doActionFor(analysis, 'publish')
196
197
198
def after_reinstate(obj):
199
    """Method triggered after a 'reinstate' transition for the Analysis Request
200
    passed in is performed. Activates all analyses contained in the object.
201
    This function is called automatically by
202
    bika.lims.workflow.AfterTransitionEventHandler
203
    :param obj: Analysis Request affected by the transition
204
    :type obj: AnalysisRequest
205
    """
206
    ans = obj.getAnalyses(full_objects=True, cancellation_state='cancelled')
207
    for analysis in ans:
208
        doActionFor(analysis, 'reinstate')
209
210
211
def after_cancel(obj):
212
    """Method triggered after a 'cancel' transition for the Analysis Request
213
    passed in is performed. Deactivates all analyses contained in the object.
214
    This function is called automatically by
215
    bika.lims.workflow.AfterTransitionEventHandler
216
    :param obj: Analysis Request affected by the transition
217
    :type obj: AnalysisRequest
218
    """
219
    ans = obj.getAnalyses(full_objects=True, cancellation_state='active')
220
    for analysis in ans:
221
        doActionFor(analysis, 'cancel')
222