Completed
Push — master ( 37fea1...d1de09 )
by Fox
01:10
created

th_create_user_profile()   B

Complexity

Conditions 6

Size

Total Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 1 Features 0
Metric Value
cc 6
c 1
b 1
f 0
dl 0
loc 17
rs 8
1
# coding: utf-8
2
from django.conf import settings
3
from django.contrib.auth.models import User
4
from django.db import models
5
from django.db.models.signals import post_save
6
from django.core.exceptions import ObjectDoesNotExist
7
from django.utils.timezone import now
8
from django.utils.translation import ugettext_lazy as _
9
from django.utils.log import getLogger
10
11
from django_th.tools import warn_user_and_admin
12
13
logger = getLogger('django_th.trigger_happy')
14
15
16
class ServicesActivated(models.Model):
17
18
    """
19
        Services Activated from the admin
20
    """
21
    name = models.CharField(max_length=200, unique=True)
22
    status = models.BooleanField(default=False)
23
    auth_required = models.BooleanField(default=True)
24
    self_hosted = models.BooleanField(default=False)
25
    description = models.CharField(max_length=200)
26
27
    class Meta:
28
        verbose_name = 'Services'
29
        verbose_name_plural = 'Services'
30
31
    def show(self):
32
        """
33
34
        :return: string representing object
35
        """
36
        return "Service Activated %s %s %s %s" % (self.name, self.status,
37
                                                  self.auth_required,
38
                                                  self.description)
39
40
    def __str__(self):
41
        return self.name
42
43
44
class UserService(models.Model):
45
46
    """
47
        UserService a model to link service and user
48
    """
49
    user = models.ForeignKey(User)
50
    token = models.CharField(max_length=255, blank=True)
51
    name = models.ForeignKey(
52
        ServicesActivated, to_field='name', related_name='+')
53
    username = models.CharField(
54
        _('username'), max_length=255, default='', blank=True)
55
    password = models.CharField(
56
        _('password'), max_length=128, default='', blank=True)
57
    host = models.CharField(_('host'), max_length=255, default='', blank=True)
58
    client_id = models.CharField(
59
        _('client id'), max_length=255, default='', blank=True)
60
    client_secret = models.CharField(
61
        _('client secret'), max_length=255, default='', blank=True)
62
63
    def show(self):
64
        """
65
66
        :return: string representing object
67
        """
68
        return "User Service %s %s %s" % (self.user, self.token, self.name)
69
70
    def __str__(self):
71
        return self.name.name
72
73
74
class TriggerService(models.Model):
75
76
    """
77
        TriggerService
78
    """
79
    provider = models.ForeignKey(UserService, related_name='+', blank=True)
80
    consumer = models.ForeignKey(UserService, related_name='+', blank=True)
81
    description = models.CharField(max_length=200)
82
    user = models.ForeignKey(User)
83
    date_created = models.DateField(auto_now_add=True)
84
    date_triggered = models.DateTimeField(null=True)
85
    status = models.BooleanField(default=False)
86
    result = models.CharField(max_length=255, default='')
87
    date_result = models.DateTimeField(auto_now=True, null=True)
88
    provider_failed = models.IntegerField(db_index=True, default=0)
89
    consumer_failed = models.IntegerField(db_index=True, default=0)
90
91
    def show(self):
92
        """
93
94
        :return: string representing object
95
        """
96
        return "My Service %s - %s - %s - %s" % (self.user,
97
                                                 self.provider.name,
98
                                                 self.consumer.name,
99
                                                 self.description)
100
101
    def __str__(self):
102
        return "%s - %s - %s - %s" % (self.user,
103
                                      self.provider.name,
104
                                      self.consumer.name,
105
                                      self.description)
106
107
108
def update_result(trigger_id, msg, status):
109
    """
110
    :param trigger_id: trigger id
111
    :param msg: result msg
112
    :param status: status of the handling of the current trigger
113
    :return:
114
    """
115
    # if status is True, reset *_failed counter
116
    if status:
117
        TriggerService.objects.filter(id=trigger_id).update(result=msg,
118
                                                            date_result=now(),
119
                                                            provider_failed=0,
120
                                                            consumer_failed=0)
121
    # otherwise, add 1 to the consumer_failed
122
    else:
123
        service = TriggerService.objects.get(id=trigger_id)
124
        failed = service.consumer_failed + 1
125
        if failed > settings.DJANGO_TH.get('failed_tries', 5):
126
            TriggerService.objects.filter(id=trigger_id).\
127
                update(result=msg, date_result=now(), status=False)
128
        else:
129
            TriggerService.objects.filter(id=trigger_id).\
130
                update(result=msg, date_result=now(), consumer_failed=failed)
131
132
        warn_user_and_admin('consumer', service)
133
134
135
def th_create_user_profile(sender, instance, created, **kwargs):
136
    # create the default service that does not
137
    # need any third party auth
138
    user = instance
139
    if user.last_login is None:
140
        services = ('ServiceRss', 'ServicePelican', )
141
        for service in services:
142
            if any(service in s for s in settings.TH_SERVICES):
143
                try:
144
                    sa = ServicesActivated.objects.get(name=service)
145
                    UserService.objects.get_or_create(user=user, name=sa)
146
                except ObjectDoesNotExist:
147
                    logger.debug("A new user %s has been connected but %s "
148
                                 "could not be added to his services because "
149
                                 "the service is present in TH_SERVICES but not"
150
                                 " activated from the Admin Panel" %
151
                                 (user, service))
152
153
154
post_save.connect(th_create_user_profile, sender=User,
155
                  dispatch_uid="create_user_profile")
156