branding
[cas.git] / src / services / models.py
1 import secrets
2 from django.conf import settings
3 from django.contrib.auth.models import User
4 from django.db import models
5 from django.urls import reverse
6 from django.utils.translation import ugettext_lazy as _
7
8
9 class Service(models.Model):
10     name = models.CharField(_('name'), max_length=255)
11     url = models.URLField(_('URL'), blank=True)
12     key = models.CharField(_('key'), max_length=255, blank=True)
13     uses_ssh = models.BooleanField(_('uses SSH'), default=False)
14
15     for_all = models.BooleanField(_('for all'), default=False)
16     description = models.TextField(_('description'), blank=True)
17     icon = models.FileField(_('icon'), blank=True, upload_to='service/icon')
18
19     groups = models.ManyToManyField('auth.Group', verbose_name=_('groups'), blank=True)
20     users = models.ManyToManyField(settings.AUTH_USER_MODEL, verbose_name=_('users'), blank=True)
21
22     class Meta:
23         ordering = ('name', )
24         verbose_name = _('service')
25         verbose_name_plural = _('services')
26
27     def __str__(self):
28         return self.name
29
30     def get_absolute_url(self):
31         return reverse('service_detail', args=[self.pk])
32     
33     def save(self, *args, **kwargs):
34         if not self.key:
35             self.key = secrets.token_urlsafe()
36         return super().save(*args, **kwargs)
37
38     def all_users(self):
39         return User.objects.filter(
40                 models.Q(service=self) |
41                 models.Q(groups__service=self)
42             ).distinct()
43
44     @classmethod
45     def for_user(cls, user):
46         return cls.objects.filter(
47             models.Q(for_all=True) | models.Q(users=user) | models.Q(groups__user=user)
48         )
49
50
51 class Hook(models.Model):
52     service = models.ForeignKey(Service, on_delete=models.CASCADE)
53     email = models.CharField(max_length=255)