61 lines
2.0 KiB
Python
61 lines
2.0 KiB
Python
from django.contrib.auth.models import AbstractUser
|
|
from django.db import models
|
|
import json
|
|
|
|
|
|
class CustomUser(AbstractUser):
|
|
"""Custom User model to store CAS attributes from PolyLAN."""
|
|
|
|
# Store CAS user ID (the numeric ID from CAS)
|
|
cas_user_id = models.CharField(max_length=50, blank=True, null=True, unique=True)
|
|
|
|
# Store CAS groups as JSON
|
|
cas_groups = models.JSONField(default=list, blank=True)
|
|
|
|
# Additional fields that might come from CAS
|
|
cas_attributes = models.JSONField(default=dict, blank=True)
|
|
|
|
def __str__(self):
|
|
return f"{self.username} ({self.cas_user_id})"
|
|
|
|
def has_cas_group(self, group_name):
|
|
"""Check if user has a specific CAS group."""
|
|
return group_name in self.cas_groups
|
|
|
|
def get_cas_groups_display(self):
|
|
"""Get a comma-separated list of CAS groups for display."""
|
|
return ", ".join(self.cas_groups) if self.cas_groups else "No groups"
|
|
|
|
def update_cas_data(self, cas_user_id, attributes):
|
|
"""Update user with CAS data."""
|
|
self.cas_user_id = cas_user_id
|
|
|
|
# Update basic fields from CAS attributes
|
|
if "firstname" in attributes:
|
|
self.first_name = attributes["firstname"]
|
|
if "lastname" in attributes:
|
|
self.last_name = attributes["lastname"]
|
|
if "email" in attributes:
|
|
self.email = attributes["email"]
|
|
|
|
# Store groups
|
|
if "groups" in attributes:
|
|
# CAS groups come as a list or single value
|
|
groups = attributes["groups"]
|
|
if isinstance(groups, str):
|
|
self.cas_groups = [groups]
|
|
elif isinstance(groups, list):
|
|
self.cas_groups = groups
|
|
else:
|
|
self.cas_groups = []
|
|
|
|
if "RESPONSABLE_ANIMATION" in self.cas_groups:
|
|
self.is_staff = True
|
|
self.is_superuser = True
|
|
|
|
# Store all other attributes
|
|
self.cas_attributes = attributes
|
|
|
|
self.save()
|
|
|