def setup_project_groups( sender, instance, created: bool = False, new_roles: Optional[Set[str]] = None, **kwargs, ): """Set up group objects upon saving project.""" # Handle group automation to set project visibility auto_projects = Group.objects.filter(project_selection__in=( SELECTION_ALL, SELECTION_ALL_PUBLIC, SELECTION_ALL_PROTECTED, )) for group in auto_projects: group.save() old_access_control = instance.old_access_control instance.old_access_control = instance.access_control # Handle no groups as newly created project if not created and not instance.defined_groups.exists(): created = True # No changes needed if old_access_control == instance.access_control and not created and not new_roles: return # Do not pefrom anything with custom ACL if instance.access_control == Project.ACCESS_CUSTOM: return # Choose groups to configure if instance.access_control == Project.ACCESS_PUBLIC: groups = {"Administration", "Review"} else: groups = set(ACL_GROUPS.keys()) # Remove review group if review is not enabled if not instance.source_review and not instance.translation_review: groups.remove("Review") # Remove billing if billing is not installed if "weblate.billing" not in settings.INSTALLED_APPS: groups.discard("Billing") # Filter only newly introduced groups if new_roles: groups = {group for group in groups if ACL_GROUPS[group] in new_roles} # Access control changed elif not created and (instance.access_control == Project.ACCESS_PUBLIC or old_access_control in (Project.ACCESS_PROTECTED, Project.ACCESS_PRIVATE)): # Avoid changing groups on some access control changes: # - Public groups are always present, so skip change on changing to public # - Change between protected/private means no change in groups return # Create role specific groups for group_name in groups: group, created = instance.defined_groups.get_or_create( internal=True, name=group_name, project_selection=SELECTION_MANUAL, defining_project=instance, language_selection=SELECTION_ALL, ) if not created: continue group.projects.add(instance) group.roles.add(Role.objects.get(name=ACL_GROUPS[group_name]))
def setup_project_groups(sender, instance, **kwargs): """Set up group objects upon saving project.""" # Handle group automation to set project visibility auto_projects = Group.objects.filter(project_selection__in=( SELECTION_ALL, SELECTION_ALL_PUBLIC, SELECTION_ALL_PROTECTED, )) for group in auto_projects: group.save() old_access_control = instance.old_access_control instance.old_access_control = instance.access_control if instance.access_control == Project.ACCESS_CUSTOM: if old_access_control == Project.ACCESS_CUSTOM: return # Do cleanup of previous setup Group.objects.filter(name__contains="@", internal=True, projects=instance).delete() return # Choose groups to configure if instance.access_control == Project.ACCESS_PUBLIC: groups = {"Administration", "Review"} else: groups = set(ACL_GROUPS.keys()) # Remove review group if review is not enabled if not instance.enable_review: groups.remove("Review") # Remove billing if billing is not installed if "weblate.billing" not in settings.INSTALLED_APPS: groups.discard("Billing") # Create role specific groups handled = set() for group_name in groups: name = "{0}@{1}".format(instance.name, group_name) try: group = instance.group_set.get( internal=True, name__endswith="@{}".format(group_name)) # Update exiting group (to handle rename) if group.name != name: group.name = name group.save() except Group.DoesNotExist: # Create new group group, created = Group.objects.get_or_create( internal=True, name=name, defaults={ "project_selection": SELECTION_MANUAL, "language_selection": SELECTION_ALL, }, ) if created: group.projects.add(instance) group.roles.set( Role.objects.filter(name=ACL_GROUPS[group_name]), clear=True) handled.add(group.pk) # Remove stale groups instance.group_set.filter(name__contains="@", internal=True).exclude(pk__in=handled).delete()
def setup_project_groups(sender, instance, **kwargs): """Set up group objects upon saving project.""" # Handle group automation to set project visibility auto_projects = Group.objects.filter( project_selection__in=( SELECTION_ALL, SELECTION_ALL_PUBLIC, SELECTION_ALL_PROTECTED, ) ) for group in auto_projects: group.save() old_access_control = instance.old_access_control instance.old_access_control = instance.access_control if instance.access_control == Project.ACCESS_CUSTOM: if old_access_control == Project.ACCESS_CUSTOM: return # Do cleanup of previous setup Group.objects.filter( name__contains='@', internal=True, projects=instance ).delete() return # Choose groups to configure if instance.access_control == Project.ACCESS_PUBLIC: groups = set(('Administration', 'Review')) else: groups = set(ACL_GROUPS.keys()) # Remove review group if review is not enabled if not instance.enable_review: groups.remove('Review') # Remove billing if billing is not installed if 'weblate.billing' not in settings.INSTALLED_APPS: groups.discard('Billing') # Create role specific groups handled = set() for group_name in groups: name = '{0}@{1}'.format(instance.name, group_name) try: group = instance.group_set.get( internal=True, name__endswith='@{}'.format(group_name) ) # Update exiting group (to hanle rename) if group.name != name: group.name = name group.save() except Group.DoesNotExist: # Create new group group, created = Group.objects.get_or_create( internal=True, name=name, defaults={ 'project_selection': SELECTION_MANUAL, 'language_selection': SELECTION_ALL, } ) if created: group.projects.add(instance) group.roles.set( Role.objects.filter(name=ACL_GROUPS[group_name]), clear=True ) handled.add(group.pk) # Remove stale groups instance.group_set.filter( name__contains='@', internal=True, ).exclude( pk__in=handled ).delete()