def _contract_remove_users_view(self, contract_id, dry_run = False): contract = Contract.objects.get(id=contract_id) contract_archive_group = u'Espaço Aberto %s' % (contract.name,) if not Group.objects.filter(name=contract_archive_group).exists(): contract_archive_group = Group(name=contract_archive_group) contract_archive_group.save() else: contract_archive_group = Group.objects.get(name=contract_archive_group) groups_add = [Group.objects.get(name="Espaço Aberto"), Group.objects.get(name="students"), contract_archive_group] errors = { 'num_errors' : 0, 'email_with_error' : [], } stats = { "users_to_add" : 0, } users_to_remove = TimtecUser.objects\ .exclude(is_superuser=True, is_staff=True)\ .exclude(groups=Group.objects.get(name="Espaço Aberto")) stats["users_to_add"] = len(users_to_remove) if errors['num_errors'] == 0: groups_remove = contract.groups \ .exclude(Q(name="Avante") | Q(name="Entremeios")) \ .values_list('id', flat=True) contract_classes = contract.classes.exclude(name__contains="ARQUIVO_") archive_classes = {} for c in contract_classes: archive_class_name = "%s%s@%s" % \ ( CONTRACT_ARCHIVE_CLASS_PREFIX, c.course.name, contract.name ) if not Class.objects \ .filter(name=archive_class_name, course=c.course, contract__id=contract_id).exists(): archive_class = Class(name=archive_class_name, course=c.course,) archive_class.save() archive_class.contract.add(contract_id,) else: archive_class = Class.objects.get(name=archive_class_name, course=c.course, contract__id=contract_id) archive_classes[c.name + c.course.name] = archive_class from django.db import transaction with transaction.atomic(): for u in users_to_remove: for g in groups_remove: if not dry_run: u.groups.remove(g) for g in groups_add: if not dry_run: u.groups.add(g) for c in u.classes.all().exclude(name__contains="ARQUIVO_"): if c.contract.first() and \ c.contract.first().id == contract.id: if not dry_run: c.remove_students(u) archive_classes[c.name + c.course.name] \ .add_students(u) return (stats, errors) else: return errors
def contract_remove_users_view(request): CONTRACT_ARCHIVE_CLASS_PREFIX = "ARQUIVO_" contract_id = request.data.get('contract', None) if not contract_id: return Response({"error" : "Contrato não informado"}, status=status.HTTP_400_BAD_REQUEST) users = request.data.get('users', None) if users: users = users.split('\n') else: return Response({"error" : "Erro ao receber lista de usuários"}, status=status.HTTP_400_BAD_REQUEST) contract = Contract.objects.get(id=contract_id) contract_archive_group = u'Espaço Aberto %s' % (contract.name,) if not Group.objects.filter(name=contract_archive_group).exists(): contract_archive_group = Group(name=contract_archive_group) contract_archive_group.save() else: contract_archive_group = Group.objects.get(name=contract_archive_group) groups_add = [Group.objects.get(name="Espaço Aberto"), Group.objects.get(name="students"), contract_archive_group] errors = { 'num_errors' : 0, 'email_with_error' : [], } users_to_remove = [] for u in users: if TimtecUser.objects.filter(email=u).exists(): user = TimtecUser.objects.get(email=u) users_to_remove.append(user) else: errors['num_errors']+=1 errors['email_with_error'].append(u) if errors['num_errors'] == 0: groups_remove = contract.groups.values_list('id', flat=True) contract_classes = contract.classes.exclude(name__contains="ARQUIVO_") archive_classes = {} for c in contract_classes: archive_class_name = "%s%s@%s" % \ ( CONTRACT_ARCHIVE_CLASS_PREFIX, c.course.name, contract.name ) if not Class.objects \ .filter(name=archive_class_name, course=c.course, contract__id=contract_id).exists(): archive_class = Class(name=archive_class_name, course=c.course,) archive_class.save() archive_class.contract.add(contract_id,) else: archive_class = Class.objects.get(name=archive_class_name, course=c.course, contract__id=contract_id) archive_classes[c.name + c.course.name] = archive_class from django.db import transaction with transaction.atomic(): for u in users_to_remove: for g in groups_remove: u.groups.remove(g) for g in groups_add: u.groups.add(g) for c in u.classes.all().exclude(name__contains="ARQUIVO_"): if c.contract.first().id == contract.id: c.remove_students(u) archive_classes[c.name + c.course.name].add_students(u) return Response({}, status=status.HTTP_200_OK) else: return Response(errors, status=status.HTTP_400_BAD_REQUEST)