Ejemplo n.º 1
0
    def post(self, request):
        serializer = SolicitationSerializer(data=request.data)
        if serializer.is_valid():
            solicitation = Solicitation()
            with transaction.atomic():
                data = {}
                solicitation.owner = request.user
                solicitation.donation = Donation.objects.get(id=request.POST.get('donation'))
                if request.POST.get('comment') == '':
                    solicitation.comment = 'Nenhum comentário'
                else:
                    solicitation.comment = request.POST.get('comment')
                if solicitation.donation.status != Donation.ACTIVE:
                    data['message'] = 'Esta doação não pode ser solicitada.'
                    return Response(data, status=status.HTTP_403_FORBIDDEN)
                solicitation.save()

                donation = Donation.objects.get(id=request.POST.get('donation'))
                message = 'A sua doação ' + donation.slug + ' foi solicitada pelo usuário ' + solicitation.owner.get_name() + '.'
                notification = Notification.objects.create(message=message, notified=donation.donator, sender=solicitation.owner, type=Notification.MY_DONATIONS)
                send_push_notification(notification)

                subject = "Sua doação foi solicitada"
                context = {}
                context['user'] = donation.donator
                context['domain'] = get_current_site(request).domain
                context['protocol'] = 'https' if request.is_secure() else 'http'
                context['donation'] = donation
                context['solicitation'] = solicitation
                send_mail_template(subject, "emails/notification_solicitation_email.html", context, [donation.donator.email])
                data['message'] = 'Solicitação feita com sucesso!'
                return Response(data, status=status.HTTP_201_CREATED,)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Ejemplo n.º 2
0
    def post(self, request):
        data = {}
        with transaction.atomic():
            solicitation_pk = request.POST.get('solicitation', None)
            if not solicitation_pk:
                data['message'] = "Solicitação não encontrada."
                return Response(data, status=status.HTTP_404_NOT_FOUND,)

            reason_rejection = request.POST.get('reason_rejection')
            if reason_rejection == '':
                data['message'] = "O motivo de rejeição não pode ficar em branco."
                return Response(data, status=status.HTTP_400_BAD_REQUEST,)

            solicitation = Solicitation.objects.get(pk=solicitation_pk)
            solicitation.status = Solicitation.REJECTED
            solicitation.reason_rejection = reason_rejection
            solicitation.save()

            #Validação da doação
            donation = Donation.objects.get(pk=solicitation.donation.pk)
            if donation.status == Donation.INVALID:
                data['message'] = 'Esta solicitação não pode ser movimentada, a doação está vencida.'
                return Response(data, status=status.HTTP_400_BAD_REQUEST)

            list_solicitations = []
            queryset = Solicitation.objects.filter(donation__id=donation.pk)
            for obj in queryset:
                obj.update_status()
                list_solicitations.append(obj)
            serializer = SolicitationSerializer(list_solicitations, many=True)
            data['solicitations'] = serializer.data
            data['message'] = 'Solicitação rejeitada com sucesso.'

            #Notificação
            message = 'A sua solicitação ' + solicitation.slug + ' foi rejeitada pelo usuário ' + donation.donator.get_name() + '.'
            notification = Notification.objects.create(message=message, notified=solicitation.owner, sender=donation.donator, type=Notification.MY_SOLICITATIONS)
            send_push_notification(notification)

            #E-mail
            subject = "Sua solicitação foi rejeitada"
            context = {}
            context['user'] = solicitation.owner
            context['domain'] = get_current_site(request).domain
            context['protocol'] = 'https' if request.is_secure() else 'http'
            context['donation'] = donation
            context['solicitation'] = solicitation
            send_mail_template(subject, "emails/notification_rejection_solicitation_email.html", context, [solicitation.owner.email])

            return Response(data, status=status.HTTP_200_OK)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Ejemplo n.º 3
0
    def post(self, request):
        data = {}
        solicitation_pk = request.POST.get('solicitation')
        try:
            solicitation = Solicitation.objects.get(pk=solicitation_pk)
        except:
            data['message'] = 'Solicitação não encontrada.'
            return 
        with transaction.atomic():
            solicitation.status = Solicitation.COMPLETED
            solicitation.save()
            serializer = SolicitationSerializer(solicitation)
            donation = Donation.objects.get(pk=solicitation.donation.pk)

            donation.status = Donation.COMPLETED
            donation.is_accepted = True
            donation.receiver = solicitation.owner
            donation.save()

            message = 'A sua solicitação ' + solicitation.slug + ' da doação ' + donation.slug + 'foi finalizada. Obrigado por usar o AlimentAÍ.'
            notification = Notification.objects.create(message=message, notified=solicitation.owner, sender=donation.donator, type=Notification.MY_SOLICITATIONS)
            send_push_notification(notification)
            
            subject = "Parabéns - Sua solicitação foi finalizada"
            context = {}
            context['user'] = solicitation.owner
            context['domain'] = get_current_site(request).domain
            context['protocol'] = 'https' if request.is_secure() else 'http'
            context['donation'] = donation
            context['solicitation'] = solicitation
            send_mail_template(subject, "emails/notification_finalize_solicitation_email.html", context, [solicitation.owner.email])

            list_solicitations = []
            for obj in donation.solicitations.all():
                if obj.pk != solicitation.pk:
                    if obj.status != Solicitation.REJECTED:
                        obj.status = Solicitation.UNCOMPLETED
                        obj.save()
                list_solicitations.append(obj)
            serializer = SolicitationSerializer(list_solicitations, many=True)
            data['solicitations'] = serializer.data
            data['message'] = 'Solicitação finalizada com sucesso.'

            return Response(data, status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Ejemplo n.º 4
0
    def post(self, request):
        data = {}
        solicitation_pk = request.POST.get('solicitation')
        try:
            solicitation = Solicitation.objects.get(pk=solicitation_pk)
        except:
            data['message'] = 'Solicitação não encontrada.'
        with transaction.atomic():
            solicitation.status = Solicitation.CREATED
            solicitation.save()

            donation = Donation.objects.get(pk=solicitation.donation.pk)
            for obj in donation.solicitations.all():
                if obj.status != Solicitation.REJECTED:
                    obj.status = Solicitation.CREATED
                    obj.save()

            message = 'A sua solicitação ' + solicitation.slug + ' foi cancelada pelo usuário ' + donation.donator.get_name() + '.'
            notification = Notification.objects.create(message=message, notified=solicitation.owner, sender=donation.donator, type=Notification.MY_SOLICITATIONS)
            send_push_notification(notification)

            list_solicitations = []
            queryset = Solicitation.objects.filter(donation__id=donation.pk)
            for obj in queryset:
                obj.update_status()
                list_solicitations.append(obj)
            serializer = SolicitationSerializer(list_solicitations, many=True)
            if donation.status != Donation.INVALID:
                donation.status = Donation.ACTIVE
                donation.save()
            data['solicitations'] = serializer.data
            data['message'] = 'Solicitação rejeitada com sucesso.'

            subject = "Sua solicitação foi rejeitada"
            context = {}
            context['user'] = solicitation.owner
            context['domain'] = get_current_site(request).domain
            context['protocol'] = 'https' if request.is_secure() else 'http'
            context['donation'] = donation
            context['solicitation'] = solicitation
            send_mail_template(subject, "emails/notification_cancelation_solicitation_email.html", context, [solicitation.owner.email])

            return Response(data, status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Ejemplo n.º 5
0
    def post(self, request):
        data = {}
        solicitation_pk = request.POST.get('solicitation')
        try:
            solicitation = Solicitation.objects.get(pk=solicitation_pk)
        except:
            data['message'] = 'Solicitação não encontrada.'
            return Response(data, status=status.HTTP_404_NOT_FOUND)
        with transaction.atomic():
            solicitation.status = Solicitation.UNCOMPLETED
            solicitation.save()

            donation = Donation.objects.get(pk=solicitation.donation.pk)

            message = 'A sua solicitação ' + solicitation.slug + ' da doação ' + donation.slug + ' foi marcada como incompleta, pois você não compareceu no local determinado.'
            notification = Notification.objects.create(message=message, notified=solicitation.owner, sender=donation.donator, type=Notification.MY_SOLICITATIONS)
            send_push_notification(notification)

            subject = "Sua solicitação está imcompleta"
            context = {}
            context['user'] = solicitation.owner
            context['domain'] = get_current_site(request).domain
            context['protocol'] = 'https' if request.is_secure() else 'http'
            context['donation'] = donation
            context['solicitation'] = solicitation
            send_mail_template(subject, "emails/notification_not_appear_solicitation_email.html", context, [solicitation.owner.email])

            list_solicitations = []
            for obj in donation.solicitations.all():
                if obj.pk != solicitation.pk and obj.status != Solicitation.REJECTED and obj.status != Solicitation.UNCOMPLETED:
                    obj.status = Solicitation.CREATED
                    obj.save()
                list_solicitations.append(obj)
            serializer = SolicitationSerializer(list_solicitations, many=True)
            if donation.status != Donation.INVALID:
                donation.status = Donation.ACTIVE
                donation.save()
            data['solicitations'] = serializer.data
            data['message'] = 'Solicitação atualizada com sucesso.'
            return Response(data, status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Ejemplo n.º 6
0
    def post(self, request):

        data = {}
        solicitation_pk = request.POST.get('solicitation')
        validity = request.POST.get('validity')
        validity_hour = request.POST.get('validity_hour')
        with transaction.atomic():
            if validity == '' or validity_hour == '' or solicitation_pk == '':
                data['message'] = "Nenhum dos campos podem ficar em branco."
                return Response(data, status=status.HTTP_401_UNAUTHORIZED,)

            try:
                solicitation = Solicitation.objects.get(pk=solicitation_pk)
            except:
                data['message'] = 'Solicitação não encontrada.'
                return Response(data, status=status.HTTP_404_NOT_FOUND)

            #Doação
            donation = Donation.objects.get(pk=solicitation.donation.pk)

            # Verificação se a validade da doação é maior ou menor que a validade da solicitação
            combined_time_donation = datetime.combine(donation.validity, donation.validity_hour)
            combined_time_solicitation = datetime.combine(datetime.strptime(validity, '%Y-%m-%d'), datetime.strptime(validity_hour, '%H:%M').time())
            if combined_time_solicitation > combined_time_donation:
                data['message'] = "A validade da solicitação tem que ser menor ou igual ao validade da doação."
                return Response(data, status=status.HTTP_401_UNAUTHORIZED,)

            #Doação fica com status de espera
            donation.status = Donation.ON_HOLD
            donation.save()

            # Solicitação fica com status de aceita
            solicitation.is_accepted = True
            solicitation.status = Solicitation.ACCEPTED
            solicitation.validity = validity
            solicitation.validity_hour = validity_hour
            solicitation.save()

            # As outras solicitações da doação ficam em espera
            for obj in donation.solicitations.all():
                if obj.pk != solicitation.pk and obj.status != Solicitation.REJECTED and obj.status != Solicitation.UNCOMPLETED:
                    obj.status = Solicitation.ON_HOLD
                    obj.save()

            # Notificação
            message = 'A sua solicitação ' + solicitation.slug + ' foi aceita pelo usuário ' + donation.donator.get_name() + '.'
            notification = Notification.objects.create(message=message, notified=solicitation.owner, sender=donation.donator, type=Notification.MY_SOLICITATIONS)
            send_push_notification(notification)

            #Email
            subject = "Sua solicitação foi aceita"
            context = {}
            context['user'] = solicitation.owner
            context['domain'] = get_current_site(request).domain
            context['protocol'] = 'https' if request.is_secure() else 'http'
            context['donation'] = donation
            context['solicitation'] = solicitation
            send_mail_template(subject, "emails/notification_accept_solicitation_email.html", context, [solicitation.owner.email])

            #Feedback usuário
            list_solicitations = []
            queryset = Solicitation.objects.filter(donation__id=donation.pk)
            for obj in queryset:
                obj.update_status()
                list_solicitations.append(obj)
            serializer = SolicitationSerializer(list_solicitations, many=True)
            data['solicitations'] = serializer.data
            data['message'] = 'Solicitação aceita com sucesso!'
            return Response(data, status=status.HTTP_200_OK)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
Ejemplo n.º 7
0
    def cmd_message(self, content, for_user=None, group_invite=None):
        payload = content.get('payload')

        if type(payload) is dict:
            message_text = payload.get('message')
            pendingId = payload.get('pendingId', None)
            conversation_pk = payload.get('conversation_id', None)
            attachments = payload.get('attachment', None)
            if attachments:
                file_uries = attachments.get('file')
                file_names = attachments.get('name')
                file_sizes = attachments.get('size')
        else:
            message_text = payload
            pendingId = None
            conversation_pk = None
            attachments = None

        accepted_uuid = self.message.channel_session.get(
            'accepted_messages_uuid', list())

        if pendingId and pendingId in accepted_uuid:
            logging.info('Drop duplicated message %r', content)
            return

        if not for_user:
            conversation = self.get_conversation(conversation_pk)
        else:
            conversation = self._get_or_create_conversation(for_user)

        message = Message.objects.create(text=message_text,
                                         author=self.message.user,
                                         conversation=conversation,
                                         group_invite=group_invite)
        if pendingId:
            accepted_uuid.append(pendingId)
            self.message.channel_session[
                'accepted_messages_uuid'] = accepted_uuid
            self.message.channel_session.save()

        if attachments:
            for i in range(len(file_uries)):
                format, imgstr = file_uries[i].split(';base64,')
                ext = format.split('/')[-1]
                data = ContentFile(base64.b64decode(imgstr),
                                   name='attach.' + ext)

                attachment = Attachment.objects.create(message=message,
                                                       file=data,
                                                       file_name=file_names[i],
                                                       file_size=file_sizes[i])

        response = {
            'type': 'newMessage',
            'payload': self._create_message_data_dict(message),
            'context': content.get('context'),
        }
        if pendingId:
            response['payload']['pendingId'] = pendingId

        if not for_user:
            for participant in conversation.participants.filter(
                    status=Participant.PARTICIPANT_ACCEPTED):
                self.group_send(str(participant.user.id), response)

                if participant.user.online(
                ) != User.STATUS_ONLINE and participant.user.id != message.author.id:
                    send_push_notification(message, participant.user)
        else:
            self.group_send(str(for_user.id), response)

            if for_user.online(
            ) != User.STATUS_ONLINE and for_user.id != message.author.id:
                send_push_notification(message, for_user)