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