Completed
Pull Request — master (#60)
by Paolo
06:42
created

SubmissionTaskMixin.mail_to_owner()   A

Complexity

Conditions 2

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 2
nop 4
1
#!/usr/bin/env python3
2
# -*- coding: utf-8 -*-
3
"""
4
Created on Tue Jul  9 16:10:06 2019
5
6
@author: Paolo Cozzi <[email protected]>
7
"""
8
9
import logging
10
11
from common.constants import ERROR
12
from image_app.models import Submission
13
14
from .helpers import send_message
15
16
# Get an instance of a logger
17
logger = logging.getLogger(__name__)
18
19
20
# HINT: should I move all this stuff into image_app module?
21
class SubmissionTaskMixin():
22
    """A mixin to extend Task to support UID Submission objects"""
23
24
    action = None
25
    max_body_size = 5000
26
27
    def get_uid_submission(self, submission_id):
28
        """Get a UID Submission instance from an id
29
30
        Args:
31
            submission_id (int): the submission id
32
33
        Returns:
34
            :py:class:`Submission`: a UID submission instance
35
        """
36
37
        return Submission.objects.get(pk=submission_id)
38
39
    def update_submission_status(self, submission_obj, status, message):
40
        """Mark submission with status, then send message"""
41
42
        submission_obj.status = ERROR
43
        submission_obj.message = message
44
        submission_obj.save()
45
46
        # send async message
47
        send_message(submission_obj)
48
49
    def mail_to_owner(self, submission_obj, subject, body):
50
        # truncate message body if necessary
51
        if len(body) > self.max_body_size:
52
            body = body[:self.max_body_size] + "...[truncated]"
53
54
        submission_obj.owner.email_user(subject, body)
55
56
    def on_failure(self, exc, task_id, args, kwargs, einfo):
57
        """Override the default on_failure method"""
58
59
        # call base class
60
        super().on_failure(exc, task_id, args, kwargs, einfo)
61
62
        # get submission object
63
        submission_id = args[0]
64
        submission_obj = self.get_uid_submission(submission_id)
65
66
        # mark submission with ERROR and send message
67
        self.update_submission_status(
68
            submission_obj,
69
            ERROR,
70
            "Error in %s: %s" % (self.action, str(exc))
71
        )
72
73
        # send a mail to the user with the stacktrace (einfo)
74
        subject = "Error in %s: %s" % (self.action, submission_id)
75
        body = (
76
            "Something goes wrong with %s. Please report "
77
            "this to InjectTool team\n\n %s" % (
78
                self.action,
79
                str(einfo))
80
        )
81
82
        self.mail_to_owner(submission_obj, subject, body)
83
84
        # TODO: submit mail to admin
85
86
87
class ImportGenericTaskMixin(SubmissionTaskMixin):
88
    """A mixing used to import datasource into UID"""
89
90
    action = None
91
92
    def run(self, submission_id):
93
        """a function to upload data into UID"""
94
95
        logger.info(
96
            "Start %s for submission: %s" % (self.action, submission_id))
97
98
        # get a submission object (from SubmissionTaskMixin)
99
        submission_obj = self.get_uid_submission(submission_id)
100
101
        # upload data into UID with the proper method (defined in child class)
102
        status = self.import_data_from_file(submission_obj)
103
104
        # if something went wrong, uploaded_cryoweb has token the exception
105
        # ad update submission.message field
106
        if status is False:
107
            message = "Error in %s" % (self.action)
108
            logger.error(message)
109
110
            # this a failure in my import, not the task itself
111
            return message
112
113
        else:
114
            message = "%s completed for submission: %s" % (
115
                self.action, submission_id)
116
117
            # debug
118
            logger.info(message)
119
120
            # always return something
121
            return "success"
122