This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
authentic2-pratic/src/authentic2_pratic/models.py

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')