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))
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)
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)
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))
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)
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)
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)