Ejemplo n.º 1
0
    def partial_update(self, request, pk=None):
        serializer = MemberPartialSerializer(data=request.data)
        if serializer.is_valid():
            response = self.dolibarr.get(
                model='members/{}'.format(pk),
                api_key=request.user.profile.dolibarr_token)

            # Validate / modify data (serialize to match Dolibarr formats)
            data = Member.validate_data(request.data,
                                        mode='update',
                                        base_options=response['array_options'])

            try:
                # Envoi mail lorsque l'option "Je souhaite être informé..." à été modifiée
                if (response['array_options']['options_recevoir_actus'] !=
                        data['array_options']['options_recevoir_actus']):
                    Member.send_mail_newsletter(
                        login=str(request.user),
                        profile=request.user.profile,
                        new_status=data['array_options']
                        ['options_recevoir_actus'],
                        lang=response['array_options']['options_langue'])

                # Envoi mail lorsque l'option "Je souhaite être informé..." à été modifiée
                if (response['array_options']
                    ['options_prelevement_change_montant'] !=
                        data['array_options']
                    ['options_prelevement_change_montant']):
                    Member.send_mail_change_auto(
                        login=str(request.user),
                        profile=request.user.profile,
                        mode=data['mode'],
                        new_amount=data['array_options']
                        ['options_prelevement_change_montant'],
                        comment=data['prelevement_change_comment'],
                        lang=response['array_options']['options_langue'])

            except KeyError:
                pass
        else:
            log.critical(serializer.errors)
            return Response(
                {
                    'error':
                    'Oops! Something is wrong in your request data: {}'.format(
                        serializer.errors)
                },
                status=status.HTTP_400_BAD_REQUEST)

        return Response(
            self.dolibarr.patch(model='members/{}'.format(pk),
                                data=data,
                                api_key=request.user.profile.dolibarr_token))
Ejemplo n.º 2
0
    def create(self, request):
        data = request.data
        serializer = MemberSerializer(data=data)
        if serializer.is_valid():
            data = Member.validate_data(data)
        else:
            log.critical(serializer.errors)
            return Response({'error': 'Oops! Something is wrong in your request data: {}'.format(serializer.errors)},
                            status=status.HTTP_400_BAD_REQUEST)

        log.info('posted data: {}'.format(data))

        # #841 : We need to connect to Cyclos before doing Dolibarr calls, making sure Cyclos token is still valid.
        # This way, we avoid creating a member in Dolibarr if it's not the case.
        try:
            self.cyclos = CyclosAPI(token=request.user.profile.cyclos_token, mode='bdc')
        except CyclosAPIException:
            return Response({'error': 'Unable to connect to Cyclos!'}, status=status.HTTP_400_BAD_REQUEST)

        # Dolibarr: Register member
        response_obj = self.dolibarr.post(model=self.model, data=data, api_key=request.user.profile.dolibarr_token)
        log.info(response_obj)

        # Cyclos: Register member
        create_user_data = {
            'group': str(settings.CYCLOS_CONSTANTS['groups']['adherents_sans_compte']),
            'name': '{} {}'.format(data['firstname'], data['lastname']),
            'username': data['login'],
            'skipActivationEmail': True,
        }
        self.cyclos.post(method='user/register', data=create_user_data)

        return Response(response_obj, status=status.HTTP_201_CREATED)
Ejemplo n.º 3
0
    def create(self, request):
        data = request.data
        serializer = MemberSerializer(data=data)
        if serializer.is_valid():
            data = Member.validate_data(data)
        else:
            log.critical(serializer.errors)
            return Response(
                {
                    'error':
                    'Oops! Something is wrong in your request data: {}'.format(
                        serializer.errors)
                },
                status=status.HTTP_400_BAD_REQUEST)

        log.info('posted data: {}'.format(data))

        # #841 : We need to connect to Cyclos before doing Dolibarr calls, making sure Cyclos token is still valid.
        # This way, we avoid creating a member in Dolibarr if it's not the case.
        try:
            self.cyclos = CyclosAPI(token=request.user.profile.cyclos_token,
                                    mode='bdc')
        except CyclosAPIException:
            return Response({'error': 'Unable to connect to Cyclos!'},
                            status=status.HTTP_400_BAD_REQUEST)

        # Dolibarr: Register member
        response_obj = self.dolibarr.post(
            model=self.model,
            data=data,
            api_key=request.user.profile.dolibarr_token)
        log.info(response_obj)

        # Cyclos: Register member
        create_user_data = {
            'group':
            str(settings.CYCLOS_CONSTANTS['groups']['adherents_sans_compte']),
            'name':
            '{} {}'.format(data['firstname'], data['lastname']),
            'username':
            data['login'],
            'skipActivationEmail':
            True,
        }
        self.cyclos.post(method='user/register', data=create_user_data)

        if data['email']:
            # Activate user pre-selected language
            # TODO: Ask member for his prefered lang
            # activate(data['options_langue'])

            # Translate subject & body for this email
            subject = _('Votre adhésion à Euskal Moneta')
            body = render_to_string('mails/create_member.txt', {'user': data})

            sendmail_euskalmoneta(subject=subject,
                                  body=body,
                                  to_email=data['email'])

        return Response(response_obj, status=status.HTTP_201_CREATED)
Ejemplo n.º 4
0
    def partial_update(self, request, pk=None):
        serializer = MemberPartialSerializer(data=request.data)
        if serializer.is_valid():
            member = self.dolibarr.get(model='members/{}'.format(pk), api_key=request.user.profile.dolibarr_token)

            # Validate / modify data (serialize to match Dolibarr formats)
            data = Member.validate_data(request.data, mode='update', base_options=member['array_options'])

            try:
                # Envoi d'un email lorsque l'option "Recevoir les actualités liées à l'Eusko" est modifiée
                if (member['array_options']['options_recevoir_actus'] !=
                   data['array_options']['options_recevoir_actus']):
                    Member.send_mail_newsletter(
                        login=str(request.user), profile=request.user.profile,
                        new_status=data['array_options']['options_recevoir_actus'],
                        lang=member['array_options']['options_langue'])

                # Envoi d'un email lorsque l'option "Montant du change automatique" est modifiée
                if (float(member['array_options']['options_prelevement_change_montant']) !=
                   float(data['array_options']['options_prelevement_change_montant'])):
                    Member.send_mail_change_auto(
                        login=str(request.user), profile=request.user.profile,
                        mode=data['mode'], new_amount=data['array_options']['options_prelevement_change_montant'],
                        comment=data['prelevement_change_comment'], email=member['email'],
                        lang=member['array_options']['options_langue'])

                # Envoi d'un email lorsque l'option "IBAN" est modifiée.
                if (member['array_options']['options_iban'] !=
                   data['array_options']['options_iban']):
                    sujet = _("Modification de l'IBAN pour le change automatique mensuel")
                    texte = render_to_string('mails/modification_iban.txt',
                                             {'dolibarr_member': member,
                                             'nouvel_iban': data['array_options']['options_iban']}).strip('\n')
                    sendmail_euskalmoneta(subject=sujet, body=texte)

            except KeyError:
                pass
        else:
            log.critical(serializer.errors)
            return Response({'error': 'Oops! Something is wrong in your request data: {}'.format(serializer.errors)},
                            status=status.HTTP_400_BAD_REQUEST)

        return Response(self.dolibarr.put(model='members/{}'.format(pk), data=data,
                                            api_key=request.user.profile.dolibarr_token))
Ejemplo n.º 5
0
    def list(self, request):
        email = request.GET.get('email', '')
        login = request.GET.get('login', '')
        name = request.GET.get('name', '')
        valid_login = Member.validate_num_adherent(login)
        token = request.GET.get('token', '')
        # Si un token est fourni pour récupérer un adhérent, la
        # recherche peut être faite de manière anonyme, sinon il faut
        # être authentifié, afin d'éviter la fuite d'information sur les
        # adhérents.
        if token and not request.user.is_authenticated:
            dolibarr = DolibarrAPI()
            dolibarr_token = dolibarr.login(login=settings.APPS_ANONYMOUS_LOGIN,
                                            password=settings.APPS_ANONYMOUS_PASSWORD)
        else:
            dolibarr_token = request.user.profile.dolibarr_token

        if login and valid_login:
            # We want to search in members by login (N° Adhérent)
            try:
                response = self.dolibarr.get(model='members', sqlfilters="login='******'".format(login), api_key=dolibarr_token)
            except DolibarrAPIException:
                return Response(status=status.HTTP_204_NO_CONTENT)
            return Response(response)

        elif login and not valid_login:
            return Response({'error': 'You need to provide a *VALID* ?login parameter! (Format: E12345)'},
                            status=status.HTTP_400_BAD_REQUEST)

        elif name and len(name) >= 3:
            # We want to search in members by name (firstname, lastname or societe)
            try:
                sqlfilters = "(firstname like '%25{name}%25' or lastname like '%25{name}%25' or societe like '%25{name}%25') and statut=1".format(name=name)
                response = self.dolibarr.get(model='members', sqlfilters=sqlfilters, api_key=dolibarr_token)
            except DolibarrAPIException:
                return Response(status=status.HTTP_204_NO_CONTENT)
            return Response(response)

        elif name and len(name) < 3:
            return Response({'error': 'You need to provide a ?name parameter longer than 2 characters!'},
                            status=status.HTTP_400_BAD_REQUEST)

        elif email:
            try:
                validate_email(email)
                user_results = self.dolibarr.get(model='members', sqlfilters="email='{}' and statut=1".format(email), api_key=dolibarr_token)
                user_data = [item
                             for item in user_results
                             if item['email'] == email][0]
                return Response(user_data)
            except forms.ValidationError:
                return Response({'error': 'You need to provide a *VALID* ?email parameter! (Format: E12345)'},
                                status=status.HTTP_400_BAD_REQUEST)
        elif token:
            try:
                response = self.dolibarr.get(model='members', token=token, api_key=dolibarr_token)
            except DolibarrAPIException:
                return Response(status=status.HTTP_204_NO_CONTENT)
            return Response(response)

        else:
            objects = self.dolibarr.get(model='members', sqlfilters="statut=1", api_key=dolibarr_token)
            paginator = CustomPagination()
            result_page = paginator.paginate_queryset(objects, request)

            serializer = MemberSerializer(result_page, many=True)
            return paginator.get_paginated_response(serializer.data)
Ejemplo n.º 6
0
def first_connection(request):
    """
    First connection
    """
    serializer = serializers.FirstConnectionSerializer(data=request.data)
    serializer.is_valid(
        raise_exception=True)  # log.critical(serializer.errors)

    try:
        dolibarr = DolibarrAPI()
        dolibarr_token = dolibarr.login(
            login=settings.APPS_ANONYMOUS_LOGIN,
            password=settings.APPS_ANONYMOUS_PASSWORD)

        valid_login = Member.validate_num_adherent(request.data['login'])

        try:
            dolibarr.get(model='users',
                         login=request.data['login'],
                         api_key=dolibarr_token)
            return Response({'error': 'User already exist!'},
                            status=status.HTTP_201_CREATED)
        except DolibarrAPIException:
            pass

        if valid_login:
            # We want to search in members by login (N° Adhérent)
            response = dolibarr.get(model='members',
                                    login=request.data['login'],
                                    api_key=dolibarr_token)
            user_data = [
                item for item in response
                if item['login'] == request.data['login']
            ][0]

            if user_data['email'] == request.data['email']:
                # We got a match!

                # We need to mail a token etc...
                payload = {
                    'login': request.data['login'],
                    'aud': 'guest',
                    'iss': 'first-connection',
                    'jti': str(uuid4()),
                    'iat': datetime.utcnow(),
                    'nbf': datetime.utcnow(),
                    'exp': datetime.utcnow() + timedelta(hours=1)
                }

                jwt_token = jwt.encode(payload, settings.JWT_SECRET)
                confirm_url = '{}/valide-premiere-connexion?token={}'.format(
                    settings.CEL_PUBLIC_URL, jwt_token.decode("utf-8"))

                # Activate user pre-selected language
                activate(user_data['array_options']['options_langue'])

                # Translate subject & body for this email
                subject = _('Première connexion à votre compte en ligne Eusko')
                body = render_to_string('mails/first_connection.txt', {
                    'token': confirm_url,
                    'user': user_data
                })

                sendmail_euskalmoneta(subject=subject,
                                      body=body,
                                      to_email=request.data['email'])
                return Response({'member': 'OK'})
            else:
                return Response(status=status.HTTP_400_BAD_REQUEST)

        else:
            return Response(
                {
                    'error':
                    'You need to provide a *VALID* login parameter! (Format: E12345)'
                },
                status=status.HTTP_400_BAD_REQUEST)

    except (DolibarrAPIException, KeyError, IndexError):
        return Response({'error': 'Unable to get user data for this login!'},
                        status=status.HTTP_400_BAD_REQUEST)
Ejemplo n.º 7
0
    def list(self, request):
        email = request.GET.get('email', '')
        login = request.GET.get('login', '')
        name = request.GET.get('name', '')
        valid_login = Member.validate_num_adherent(login)
        dolibarr_token = request.user.profile.dolibarr_token

        if login and valid_login:
            # We want to search in members by login (N° Adhérent)
            try:
                response = self.dolibarr.get(model='members',
                                             login=login,
                                             api_key=dolibarr_token)
            except DolibarrAPIException:
                return Response(status=status.HTTP_204_NO_CONTENT)
            return Response(response)

        elif login and not valid_login:
            return Response(
                {
                    'error':
                    'You need to provide a *VALID* ?login parameter! (Format: E12345)'
                },
                status=status.HTTP_400_BAD_REQUEST)

        elif name and len(name) >= 3:
            # We want to search in members by name (Firstname and Lastname)
            try:
                response = self.dolibarr.get(model='members',
                                             name=name,
                                             api_key=dolibarr_token)
            except DolibarrAPIException:
                return Response(status=status.HTTP_204_NO_CONTENT)
            return Response(response)

        elif name and len(name) < 3:
            return Response(
                {
                    'error':
                    'You need to provide a ?name parameter longer than 2 characters!'
                },
                status=status.HTTP_400_BAD_REQUEST)

        elif email:
            try:
                validate_email(email)
                user_results = self.dolibarr.get(model='members',
                                                 email=email,
                                                 api_key=dolibarr_token)
                user_data = [
                    item for item in user_results if item['email'] == email
                ][0]
                return Response(user_data)
            except forms.ValidationError:
                return Response(
                    {
                        'error':
                        'You need to provide a *VALID* ?email parameter! (Format: E12345)'
                    },
                    status=status.HTTP_400_BAD_REQUEST)
        else:
            objects = self.dolibarr.get(model=self.model,
                                        api_key=dolibarr_token)
            paginator = CustomPagination()
            result_page = paginator.paginate_queryset(objects, request)

            serializer = MemberSerializer(result_page, many=True)
            return paginator.get_paginated_response(serializer.data)