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
Example #2
0
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)