Completed
Pull Request — master (#41)
by
unknown
05:43
created

samples.tasks   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 77
Duplicated Lines 66.23 %

Importance

Changes 0
Metric Value
wmc 4
eloc 39
dl 51
loc 77
rs 10
c 0
b 0
f 0

2 Methods

Rating   Name   Duplication   Size   Complexity  
A BatchUpdateSamples.on_failure() 19 19 1
A BatchUpdateSamples.run() 21 21 3

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
#!/usr/bin/env python3
2
# -*- coding: utf-8 -*-
3
"""
4
Created on Wed Feb 27 16:38:37 2019
5
6
@author: Paolo Cozzi <[email protected]>
7
"""
8
9
from celery.utils.log import get_task_logger
10
11
from common.constants import ERROR, NEED_REVISION
12
from image.celery import app as celery_app, MyTask
13
from image_app.models import Sample, Submission
14
from submissions.helpers import send_message
15
from validation.helpers import construct_validation_message
16
17
# Get an instance of a logger
18
logger = get_task_logger(__name__)
19
20
21 View Code Duplication
class BatchUpdateSamples(MyTask):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
22
    name = "Batch update samples"
23
    description = """Batch update of field in samples"""
24
25
    # Ovverride default on failure method
26
    # This is not a failed validation for a wrong value, this is an
27
    # error in task that mean an error in coding
28
    def on_failure(self, exc, task_id, args, kwargs, einfo):
29
        logger.error('{0!r} failed: {1!r}'.format(task_id, exc))
30
31
        # get submission object
32
        submission_obj = Submission.objects.get(pk=args[0])
33
34
        # mark submission with ERROR
35
        submission_obj.status = ERROR
36
        submission_obj.message = ("Error in batch update for samples: %s"
37
                                  % (str(exc)))
38
        submission_obj.save()
39
40
        send_message(submission_obj)
41
42
        # send a mail to the user with the stacktrace (einfo)
43
        submission_obj.owner.email_user(
44
            "Error in batch update for samples: %s" % (args[0]),
45
            ("Something goes wrong in batch update for samples. Please report "
46
             "this to InjectTool team\n\n %s" % str(einfo)),
47
        )
48
49
        # TODO: submit mail to admin
50
51
    def run(self, submission_id, sample_ids, attribute):
52
        """a function to upload data into UID"""
53
54
        logger.info("Start batch update for samples")
55
56
        for sample_id, value in sample_ids.items():
57
            sample = Sample.objects.get(pk=sample_id)
58
            if getattr(sample, attribute) != value:
59
                setattr(sample, attribute, value)
60
                sample.save()
61
62
        # Update submission
63
        submission_obj = Submission.objects.get(pk=submission_id)
64
        submission_obj.status = NEED_REVISION
65
        submission_obj.message = "Data updated, try to rerun validation"
66
        submission_obj.save()
67
68
        send_message(
69
            submission_obj, construct_validation_message(submission_obj)
70
        )
71
        return 'success'
72
73
74
# register explicitly tasks
75
# https://github.com/celery/celery/issues/3744#issuecomment-271366923
76
celery_app.tasks.register(BatchUpdateSamples)
77