Projet

Général

Profil

Télécharger (3,84 ko) Statistiques
| Branche: | Tag: | Révision:

root / wcsinst / wcsinst / models.py @ 6d9b70dc

1
import json
2
import logging
3
import urllib2
4

    
5
from django.conf import settings
6
from django.db import models
7
from django.utils.translation import ugettext_lazy as _
8

    
9
logger = logging.getLogger(__name__)
10

    
11
class WcsInstance(models.Model):
12
    title = models.CharField(max_length=50, unique=True)
13
    domain = models.CharField(max_length=100, unique=True)
14

    
15
    # site-options.cfg options
16
    postgresql = models.BooleanField(verbose_name=_('postgresql'),
17
            blank=True)
18
    saml2_use_role = models.BooleanField(verbose_name=_('use saml2 roles'),
19
            blank=True)
20
    saml2_role_prefix = models.CharField(verbose_name=_('role prefix'),
21
            blank=True, max_length=128)
22
    backoffice_feed_url = models.URLField(verbose_name=_('backoffice feed url'),
23
            blank=True, max_length=128)
24
    drupal = models.BooleanField(verbose_name=_('drupal'),
25
            blank=True)
26
    ezldap = models.BooleanField(verbose_name=_('ezldap'),
27
            blank=True)
28
    strongbox = models.BooleanField(verbose_name=_('strongbox'),
29
            blank=True)
30
    clicrdv = models.BooleanField(verbose_name=_('clicrdv'),
31
            blank=True)
32
    domino = models.BooleanField(verbose_name=_('domino'),
33
            blank=True)
34

    
35

    
36
    def __unicode__(self):
37
        return '%s (%s)' % (self.title, self.domain)
38

    
39
    def site_options_cfg(self):
40
        d = {
41
                'postgresql': self.postgresql,
42
                'saml2_use_role': self.saml2_use_role,
43
                'saml2_role_prefix': self.saml2_role_prefix,
44
                'backoffice_feed_url': self.backoffice_feed_url,
45
                'drupal': self.drupal,
46
                'ezldap': self.ezldap,
47
                'strongbox': self.strongbox,
48
                'clicrdv': self.clicrdv,
49
                'domino': self.domino,
50
        }
51
        d['api_secrets'] = dict((kv.key, kv.value) for kv in self.api_secrets.all())
52
        d['variables'] = dict((kv.key, kv.value) for kv in self.variables.all())
53
        return d
54

    
55
    def to_json(self):
56
        return {
57
                'title': self.title,
58
                'domain': self.domain,
59
                'site_options_cfg': self.site_options_cfg(),
60
        }
61

    
62
    def notify(self, created=True):
63
        # notify wcsinstd
64
        if not settings.WCSINSTD_URL:
65
            return
66
        if created:
67
            url = settings.WCSINSTD_URL + 'wcsinstd/create'
68
        else:
69
            url = settings.WCSINSTD_URL + 'wcsinstd/%s/' % self.domain
70
        post_data = json.dumps(self.to_json())
71
        request = urllib2.Request(url)
72
        request.add_header('Accept', 'application/json')
73
        request.add_header('Content-Type', 'application/json;charset=UTF-8')
74
        request.add_data(post_data)
75
        try:
76
            p = urllib2.urlopen(request)
77
        except urllib2.HTTPError as e:
78
            logger.error('wcsinstd HTTP error (%s)', str(e))
79
            print e.read()
80
        except urllib2.URLError as e:
81
            print e
82
            logger.error('wcsinstd URL error (%s)', str(e))
83
        else:
84
            out_data = p.read()
85
            p.close()
86

    
87
    def save(self, *args, **kwargs):
88
        created = (self.id is None)
89
        super(WcsInstance, self).save(*args, **kwargs)
90
        self.notify(created)
91

    
92
    class Meta:
93
        verbose_name = _('wcs instance')
94
        verbose_name_plural = _('wcs instances')
95

    
96

    
97
class KeyValue(models.Model):
98
    key = models.CharField(max_length=128)
99
    value = models.CharField(max_length=1024, blank=True)
100

    
101
    class Meta:
102
        abstract = True
103

    
104

    
105
class Variable(KeyValue):
106
    wcs_instance = models.ForeignKey(WcsInstance, related_name='variables')
107

    
108
    class Meta:
109
        verbose_name = _('variable')
110
        verbose_name_plural = _('variables')
111

    
112

    
113
class ApiSecret(KeyValue):
114
    wcs_instance = models.ForeignKey(WcsInstance, related_name='api_secrets')
115

    
116
    class Meta:
117
        verbose_name = _('api secret')
118
        verbose_name_plural = _('api secrets')
119

    
120

    
(3-3/5)