Changeset View
Changeset View
Standalone View
Standalone View
profiles/signals.py
| from typing import Dict | from typing import Dict | ||||
| import logging | import logging | ||||
| from django.contrib.auth.models import User | from django.contrib.auth.models import User | ||||
| from django.db.models.signals import post_save | from django.db.models.signals import post_save | ||||
| from django.dispatch import receiver | from django.dispatch import receiver | ||||
| from blender_id_oauth_client import signals as bid_signals | from blender_id_oauth_client import signals as bid_signals | ||||
| from profiles.models import Profile | from profiles.models import Profile | ||||
| from profiles.queries import set_groups | |||||
| logger = logging.getLogger(__name__) | logger = logging.getLogger(__name__) | ||||
| @receiver(bid_signals.user_created) | @receiver(bid_signals.user_created) | ||||
| def fill_profile( | def fill_profile( | ||||
| sender: object, instance: User, oauth_info: Dict[str, str], **kwargs: object | sender: object, instance: User, oauth_info: Dict[str, str], **kwargs: object | ||||
| ) -> None: | ) -> None: | ||||
| """Update a Profile when a new OAuth user is created. | """Update a Profile when a new OAuth user is created. | ||||
| Copy 'full_name' from the received 'oauth_info' and attempt to copy avatar from Blender ID. | Copy 'full_name' from the received 'oauth_info' and attempt to copy avatar from Blender ID. | ||||
| """ | """ | ||||
| if not hasattr(instance, 'profile'): | if not hasattr(instance, 'profile'): | ||||
| logger.warning(f'User pk={instance.pk} is missing a profile') | logger.warning(f'User pk={instance.pk} is missing a profile') | ||||
| return | return | ||||
| instance.profile.full_name = oauth_info.get('full_name') or '' | instance.profile.full_name = oauth_info.get('full_name') or '' | ||||
| instance.profile.save() | instance.profile.save() | ||||
| group_names = oauth_info.get('roles') or [] | |||||
| set_groups(instance, group_names=group_names) | |||||
| instance.profile.copy_avatar_from_blender_id() | instance.profile.copy_avatar_from_blender_id() | ||||
| @receiver(post_save, sender=User) | @receiver(post_save, sender=User) | ||||
| def create_profile(sender: object, instance: User, created: bool, **kwargs: object) -> None: | def create_profile(sender: object, instance: User, created: bool, **kwargs: object) -> None: | ||||
| """Create a Profile record for a newly created User.""" | """Create a Profile record for a newly created User.""" | ||||
| if not created: | if not created: | ||||
| return | return | ||||
| if not getattr(instance, 'profile', None): | if not getattr(instance, 'profile', None): | ||||
| logger.info('Creating new Profile for user pk={instance.pk}') | logger.info('Creating new Profile for user pk={instance.pk}') | ||||
| Profile.objects.create(user=instance) | Profile.objects.create(user=instance) | ||||