297 lines
8.7 KiB
Python
297 lines
8.7 KiB
Python
from django.db.models import (Model, TextField, CharField, EmailField,
|
|
URLField, BooleanField, IntegerField, ForeignKey, SlugField)
|
|
from django.contrib.auth.models import User as AuthUser
|
|
from django.utils.translation import ugettext_lazy as _
|
|
from django.core.exceptions import ValidationError
|
|
|
|
class User(AuthUser):
|
|
# givenName -> first_name
|
|
# sn -> last_name
|
|
# userPassword -> password
|
|
# mail -> email
|
|
# cdg59isDisabled -> ! active
|
|
# cdg59lastConnectionTime -> last_login
|
|
# cn -> get_full_name()
|
|
# ou -> collectivity
|
|
# username = uid + '@' + collectivity.slug
|
|
uid = CharField(
|
|
verbose_name=_('identifier'),
|
|
max_length=128)
|
|
collectivity = ForeignKey(
|
|
'Collectivity',
|
|
verbose_name=_('collectivity'))
|
|
# cdg59isAdmin
|
|
is_admin = BooleanField(
|
|
verbose_name=_('is admin'),
|
|
default=False,
|
|
blank=True)
|
|
# cdg59agentSirhCode
|
|
sirh_code = CharField(
|
|
verbose_name=_('SIRH Code'),
|
|
max_length=8,
|
|
blank=True)
|
|
# cdg59direction
|
|
direction = CharField(
|
|
verbose_name=_('direction'),
|
|
max_length=32,
|
|
blank=True)
|
|
# cdg59lastConnectionDuration
|
|
last_login_duration = IntegerField(
|
|
verbose_name=_('last connection duration'),
|
|
default=0,
|
|
blank=True)
|
|
# cdg59serviceAccesses -> convert to ACLs
|
|
# employeeType
|
|
employee_type = CharField(
|
|
verbose_name=_('employee type'),
|
|
max_length=64,
|
|
blank=True)
|
|
# postalAddress
|
|
postal_address = TextField(
|
|
verbose_name=_('postal address'),
|
|
blank=True)
|
|
# facsimileTelephoneNumber
|
|
fax = CharField(
|
|
verbose_name=_('fax'),
|
|
max_length=32)
|
|
# mobile
|
|
mobile = CharField(
|
|
verbose_name=_('mobile'),
|
|
max_length=16,
|
|
blank=True)
|
|
# telephoneNumber
|
|
phone = CharField(
|
|
verbose_name=_('phone'),
|
|
max_length=32)
|
|
|
|
class Meta:
|
|
verbose_name = _('agent')
|
|
verbose_name_plural = _('agents')
|
|
# enforce unicity of login by collectivity
|
|
unique_together = (('uid', 'collectivity'),)
|
|
|
|
def clean(self):
|
|
# prevent collisions between users from multiple collectivities
|
|
if self.uid and not self.username and self.collectivity:
|
|
self.username = u'%s@%s' % (self.uid, self.collectivity.slug)
|
|
super(User, self).clean()
|
|
|
|
# Fields to support
|
|
class Collectivity(Model):
|
|
# Identifiers
|
|
# cn = ou
|
|
name = CharField(
|
|
verbose_name=_('name'),
|
|
max_length=64,
|
|
unique=True)
|
|
slug = SlugField(
|
|
verbose_name=_('identifier'),
|
|
max_length=64,
|
|
unique=True)
|
|
# cdg59collectivityId
|
|
collectivity_id = CharField(
|
|
verbose_name=_('collectivity id'),
|
|
max_length=8,
|
|
blank=True)
|
|
# cdg59collectivitySirhCode
|
|
sirh_code = CharField(
|
|
verbose_name=_('SIRH Code'),
|
|
max_length=8,
|
|
blank=True)
|
|
# cdg59collectivitySirhLabel
|
|
sirh_label = CharField(
|
|
verbose_name=_('SIRH Code'),
|
|
max_length=64,
|
|
blank=True)
|
|
# cdg59inseeCode
|
|
insee_code = CharField(
|
|
verbose_name=_('INSEE Code'),
|
|
max_length=8,
|
|
blank=True)
|
|
# cdg59siretCode
|
|
siret_code = CharField(
|
|
verbose_name=_('SIRET Code'),
|
|
max_length=8,
|
|
blank=True)
|
|
|
|
|
|
# Postal addresse
|
|
# postalAddress
|
|
postal_address = TextField(
|
|
verbose_name=_('postal address'),
|
|
blank=True)
|
|
# cdg59streetNumber
|
|
street_number = CharField(
|
|
verbose_name=_('street number'),
|
|
max_length=8,
|
|
blank=True)
|
|
# street
|
|
street = CharField(
|
|
verbose_name=_('street'),
|
|
max_length=128,
|
|
blank=True)
|
|
# postalCode
|
|
postal_code = CharField(
|
|
verbose_name=_('postal code'),
|
|
max_length=16,
|
|
blank=True)
|
|
# cdg59addressCompl
|
|
address_complementary = CharField(
|
|
verbose_name=_('complementary address'),
|
|
max_length=64,
|
|
blank=True)
|
|
# cdg59addressMention
|
|
address_mention = CharField(
|
|
verbose_name=_('address mention'),
|
|
max_length=64,
|
|
blank=True)
|
|
# cdg59arrondissementCode
|
|
arrondissement_code = CharField(
|
|
verbose_name=_('arrondissement code'),
|
|
max_length=64,
|
|
blank=True)
|
|
# cdg59cantonCode
|
|
canton_code = CharField(
|
|
verbose_name=_('canton code'),
|
|
max_length=4,
|
|
blank=True)
|
|
# cdg59departementCode
|
|
departement_code = CharField(
|
|
verbose_name=_('departement code'),
|
|
max_length=2,
|
|
blank=True)
|
|
# cdg59distOffice
|
|
dist_office = CharField(
|
|
verbose_name=_('distribution office'),
|
|
max_length=64,
|
|
blank=True)
|
|
# cdg59regionCode
|
|
region_code = CharField(
|
|
verbose_name=_('distribution office'),
|
|
max_length=4,
|
|
blank=True)
|
|
|
|
|
|
# Contact
|
|
# telephoneNumber
|
|
phone = CharField(
|
|
verbose_name=_('phone'),
|
|
max_length=32,
|
|
blank=True)
|
|
# facsimileTelephoneNumber
|
|
fax = CharField(
|
|
verbose_name=_('fax'),
|
|
max_length=32,
|
|
blank=True)
|
|
# mail
|
|
email = EmailField(
|
|
verbose_name=_('email'),
|
|
max_length=64,
|
|
blank=True)
|
|
# cdg59URL
|
|
url = URLField(
|
|
verbose_name=_('URL'),
|
|
max_length=128,
|
|
blank=True)
|
|
|
|
def __unicode__(self):
|
|
return self.name
|
|
|
|
class Meta:
|
|
verbose_name = _('collectivity')
|
|
verbose_name_plural = _('collectivities')
|
|
ordering = ('name',)
|
|
|
|
|
|
class Service(Model):
|
|
# Services without a collectivity are global
|
|
# cn
|
|
name = CharField(
|
|
verbose_name=_('name'),
|
|
max_length=32,
|
|
unique=True)
|
|
# cdg59sid
|
|
slug = SlugField(
|
|
verbose_name=('identifier'),
|
|
unique=True)
|
|
is_global = BooleanField(
|
|
verbose_name=_('is global'),
|
|
default=False,
|
|
blank=True)
|
|
service_url = URLField(
|
|
verbose_name=_('URL'))
|
|
metadata_url = URLField(
|
|
verbose_name=_('SAML Metadata URL'),
|
|
blank=True)
|
|
oauth2_url = URLField(
|
|
verbose_name=_('OAuth2 URL'),
|
|
blank=True)
|
|
oauth2_key = CharField(
|
|
verbose_name=_('OAuth2 Key'),
|
|
max_length=64,
|
|
blank=True)
|
|
|
|
def __unicode__(self):
|
|
return self.name
|
|
|
|
class Meta:
|
|
verbose_name = _('service')
|
|
verbose_name_plural = _('services')
|
|
ordering = ('name',)
|
|
|
|
class ServiceInstance(Model):
|
|
# cdg59sid
|
|
slug = SlugField(
|
|
verbose_name=('identifier'))
|
|
service = ForeignKey(
|
|
'Service',
|
|
verbose_name=_('service'))
|
|
collectivity = ForeignKey(
|
|
'Collectivity',
|
|
verbose_name=_('collectivity'))
|
|
service_url = URLField(
|
|
verbose_name=_('URL'),
|
|
blank=True)
|
|
metadata_url = URLField(
|
|
verbose_name=_('SAML Metadata URL'),
|
|
blank=True)
|
|
oauth2_url = URLField(
|
|
verbose_name=_('OAuth2 URL'),
|
|
blank=True)
|
|
oauth2_key = CharField(
|
|
verbose_name=_('OAuth2 Key'),
|
|
max_length=64,
|
|
blank=True)
|
|
|
|
def __unicode__(self):
|
|
return unicode(self.service)
|
|
|
|
def clean(self):
|
|
if self.collectivity and self.service and self.service.is_global:
|
|
qs = ServiceInstance.objects.exclude(id=self.id)
|
|
qs = qs.filter(collectivity=self.collectivity,
|
|
service=self.service)
|
|
if qs.exists():
|
|
raise ValidationError(_('There can be only one instance of a global service by collectivity'))
|
|
if not self.service.is_global and not self.service_url:
|
|
raise ValidationError(_('Service URL field is required'))
|
|
|
|
class Meta:
|
|
verbose_name = _('service instance')
|
|
verbose_name = _('service instances')
|
|
unique_together = (('slug', 'service', 'collectivity'),)
|
|
ordering = ('service__name', 'slug')
|
|
|
|
class Access(Model):
|
|
user = ForeignKey('User',
|
|
verbose_name=_('user'))
|
|
service_instance = ForeignKey('ServiceInstance',
|
|
verbose_name=_('service instance'))
|
|
|
|
class Meta:
|
|
verbose_name = _('access')
|
|
verbose_name = _('accesses')
|
|
unique_together = (('user', 'service_instance'),)
|
|
ordering = ('user__last_name', 'user__first_name', 'service_instance__service__name')
|
|
|