예제 #1
0
 def update(self, instance, validated_data):
     old_file_name = instance.file_object.name
     updated_instance = super().update(instance, validated_data)
     # force to delete old file;
     add_post_transaction_success_operation(
         instance.file_object.storage.delete, old_file_name)
     return updated_instance
def remove_stripe_customer_handler(sender, instance, **kwargs):
    if instance.customer_id:
        add_post_transaction_success_operation(
            remove_stripe_customer.delay,
            instance.admin_id,
            instance.customer_id
        )
def create_stripe_customer_handler(sender, instance, created, **kwargs):
    if created and not instance.customer_id:
        add_post_transaction_success_operation(
            create_stripe_customer.delay,
            instance.pk,
            email=instance.admin.email
        )
예제 #4
0
    def post(self, request, *args, **kwargs):
        """Log Admin in if right email and password are provided.
        Returns data about user and `account_key`.
        """

        serializer = self.get_serializer(data=request.data)
        if serializer.is_valid():
            email = serializer.validated_data['email']
            password = serializer.validated_data['password']

            try:
                admin = Admin.objects.select_for_update().get(email=email)

                if admin.check_password(password):
                    admin_data = AdminFullSerializer(admin).data
                    admin_data['account_key'] = admin.key

                    admin.last_login = timezone.now()
                    admin.update_last_access(save=False)
                    admin.save(update_fields=('last_login', 'noticed_at',
                                              'last_access'))
                    add_post_transaction_success_operation(
                        NotifyAboutLogIn.delay, admin.id, email, 'password')
                    return Response(admin_data, status=status.HTTP_200_OK)

                NotifyAboutLogInFailure.delay(admin.id, email, 'password')
                raise WrongPassword()

            except Admin.DoesNotExist:
                raise AdminNotFound()

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
def charge_succeeded(event, **kwargs):
    reference, processed = process_charge(event, Invoice.STATUS_CHOICES.PAYMENT_SUCCEEDED)
    if processed:
        add_post_transaction_success_operation(
            NotifyAboutPaymentReceived.delay,
            reference,
            event.created_at.strftime(settings.ANALYTICS_DATE_FORMAT))
예제 #6
0
    def post(self, request, *args, **kwargs):
        """Create admin.

        Requires:
        email,
        password,
        invitation_key - optional invitation key
        """

        if not settings.REGISTRATION_ENABLED:
            if not request.user.is_authenticated or not request.user.is_superuser:
                raise RegistrationDisabled()

        serializer = self.get_serializer(data=request.data)

        if serializer.is_valid():
            admin = serializer.save()
            admin_data = AdminFullSerializer(admin).data
            admin_data['account_key'] = admin.key

            context = self.get_task_context(admin, request.data)
            add_post_transaction_success_operation(
                NotifyAboutAdminSignup.delay, admin.id, admin.email,
                admin.created_at.strftime(settings.DATETIME_FORMAT), **context)
            return Response(admin_data, status=status.HTTP_201_CREATED)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
예제 #7
0
def hosting_post_save_handler(sender, instance, created, using, **kwargs):
    syncano_instance_pk = get_current_instance().pk
    new_cname = Hosting.find_cname(instance.domains)
    if created:
        old_cname = None
    else:
        old_cname = Hosting.find_cname(instance.old_value('domains'))

    if new_cname != old_cname:
        with transaction.atomic():
            syncano_instance = Instance.objects.select_for_update().get(pk=syncano_instance_pk)
            if new_cname is not None:
                add_domains_to_syncano_instance(syncano_instance, domains=[new_cname])
            if old_cname is not None:
                remove_domains_from_syncano_instance(syncano_instance, domains=[old_cname])
            syncano_instance.save(update_fields=['domains'])

    if instance.ssl_status == Hosting.SSL_STATUSES.CHECKING:
        add_post_transaction_success_operation(
            HostingAddSecureCustomDomainTask.delay,
            using=using,
            hosting_pk=instance.id,
            domain=instance.get_cname(),
            instance_pk=syncano_instance_pk,
        )
def socket_environment_post_save_handler(sender, instance, created, using, **kwargs):
    if instance.is_live:
        if instance.has_changed('zip_file') and instance.old_value('zip_file'):
            instance.old_value('zip_file').delete(save=False)

        if instance.status == SocketEnvironment.STATUSES.PROCESSING:
            add_post_transaction_success_operation(SocketEnvironmentProcessorTask.delay,
                                                   using=using,
                                                   instance_pk=get_current_instance().pk,
                                                   environment_pk=instance.pk)
예제 #9
0
    def send_activation_email(self, token_generator):
        from apps.analytics.tasks import NotifyAboutResendAdminActivationEmail

        token = token_generator.make_token(self)
        uid = urlsafe_base64_encode(force_bytes(self.pk)).decode()
        context = {
            'admin_id': self.id,
            'uid': uid,
            'token': token,
        }
        add_post_transaction_success_operation(
            NotifyAboutResendAdminActivationEmail.delay, **context)
예제 #10
0
def livemodel_post_soft_delete_handler(sender, instance, using, **kwargs):
    sender_meta = sender._meta
    instance_pk = None
    if is_model_in_tenant_apps(sender):
        instance_pk = get_current_instance().pk

    # queue actual cleanup job
    add_post_transaction_success_operation(DeleteLiveObjectTask.delay,
                                           using=using,
                                           model_class_name='%s.%s' % (sender_meta.app_label, sender_meta.model_name),
                                           object_pk=instance.pk,
                                           instance_pk=instance_pk)
예제 #11
0
def launch_trigger(instance, serializer_class, event, signal, changes=None, **context):
    instance_pk = get_current_instance().pk

    if Trigger.match(instance_pk, event, signal):
        data = serializer_class(instance, excluded_fields=('links',), context=context).data
        if changes is not None:
            changes = changes.intersection(set(data.keys()))

        add_post_transaction_success_operation(HandleTriggerEventTask.delay,
                                               using=router.db_for_write(instance.__class__),
                                               instance_pk=instance_pk,
                                               event=event,
                                               signal=signal,
                                               data=data,
                                               changes=list(changes) if changes else None)
예제 #12
0
    def perform_create(self, serializer):
        instance = self.request.instance
        admin = None
        try:
            admin = Admin.objects.get(email=serializer.validated_data['email'])
            if instance.owner == admin or AdminInstanceRole.objects.filter(admin=admin, instance=instance).exists():
                raise InstanceRoleAlreadyExists()
        except Admin.DoesNotExist:
            pass

        invitation = Invitation.objects.select_for_update().filter(instance=instance,
                                                                   email=serializer.validated_data['email']).first()

        if invitation:
            if invitation.state not in [Invitation.STATE_CHOICES.DECLINED, Invitation.STATE_CHOICES.ACCEPTED]:
                raise InvitationAlreadyExists()
            invitation.delete()

        invitation = serializer.save(admin=admin, inviter=self.request.user, instance=instance)
        add_post_transaction_success_operation(NotifyAboutInvitation.delay, invitation_id=invitation.id)
예제 #13
0
    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)

        if serializer.is_valid():
            admin = serializer.admin
            admin.is_active = True
            admin.last_login = timezone.now()
            admin.save(update_fields=(
                'last_login',
                'is_active',
            ))

            add_post_transaction_success_operation(
                NotifyAboutAdminActivation.delay,
                admin_id=admin.id,
                email=admin.email,
                **serializer.data)

            admin_data = AdminFullSerializer(admin).data
            admin_data['account_key'] = admin.key
            return Response(admin_data, status=status.HTTP_200_OK)

        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
예제 #14
0
    def post(self, request, backend):
        """Log Admin using social credentials.

        Available backends are now:
        `facebook`
        `google-oauth2`
        `github`
        """
        serializer = self.get_serializer(data=request.data)
        if not serializer.is_valid():
            raise WrongTokenCredentials()

        # Use access token to get info about the user
        helper = AdminSocialHelper()
        admin, was_created = helper.register_by_access_token(
            serializer.data['access_token'], backend)

        if admin is None:
            raise WrongTokenCredentials()

        if was_created:
            context = self.get_task_context(admin, backend, request.data)
            add_post_transaction_success_operation(
                NotifyAboutAdminSignup.delay, admin.id, admin.email,
                admin.created_at.strftime(settings.DATETIME_FORMAT), **context)

        admin_data = AdminFullSerializer(admin).data
        admin_data['account_key'] = admin.key
        admin_data['created'] = was_created

        admin.last_login = timezone.now()
        admin.update_last_access(save=False)
        admin.save(update_fields=('last_login', 'noticed_at', 'last_access'))
        add_post_transaction_success_operation(NotifyAboutLogIn.delay,
                                               admin.id, admin.email, backend)
        return Response(admin_data, status=status.HTTP_200_OK)
예제 #15
0
    def notify_about_aggregate(self, instance_name, group):
        task_kwargs = {}

        for obj in group:
            if not obj.value:
                continue

            task_kwargs['admin_id'] = obj.admin_id
            if obj.source == HourAggregate.SOURCES.API_CALL:
                task_kwargs['api_calls'] = obj.value
                task_class = NotifyAboutApiCalls
            else:
                task_kwargs['codebox_runs'] = obj.value
                task_class = NotifyAboutCodeBoxSeconds
            add_post_transaction_success_operation(task_class.delay,
                                                   admin_id=obj.admin_id,
                                                   instance_name=instance_name,
                                                   value=obj.value)

        if task_kwargs:
            add_post_transaction_success_operation(
                NotifyAboutApiAndCodeBoxSeconds.delay,
                instance_name=instance_name,
                **task_kwargs)
예제 #16
0
def cleanup_data_klass_ref(klass, save=False, using=None):
    # If klass is no longer managed by any socket, delete it.
    if 'managed_by' in klass.refs and not klass.refs['managed_by']:
        if klass.is_locked:
            add_post_transaction_success_operation(
                KlassOperationQueue.delay,
                using=using,
                instance_pk=get_current_instance().pk,
                klass_pk=klass.pk,
                op='delete')
        else:
            klass.delete()
        return

    if klass.is_locked:
        add_post_transaction_success_operation(
            KlassOperationQueue.delay,
            using=using,
            instance_pk=get_current_instance().pk,
            klass_pk=klass.pk,
            op='cleanup_refs')
        return

    klass.cleanup_refs(save=save)
예제 #17
0
 def delete(self, name):
     add_post_transaction_success_operation(super().delete,
                                            name,
                                            using=self._get_current_db())
def charge_failed(event, **kwargs):
    # Invoice is not required for payment failed as it may not be existing anymore (e.g. when it was a temporary
    # invoice created during creation of subscription)
    reference, processed = process_charge(event, Invoice.STATUS_CHOICES.PAYMENT_FAILED, required=False)
    if processed:
        add_post_transaction_success_operation(NotifyAboutPaymentFailure.delay, reference)
def notify_about_pricing_plan_change(sender, instance, created, **kwargs):
    add_post_transaction_success_operation(NotifyAboutPlanChange.delay,
                                           subscription_pk=instance.pk)
예제 #20
0
def klass_post_save_handler(sender, instance, using, **kwargs):
    if instance.index_changes:
        add_post_transaction_success_operation(IndexKlassTask.delay,
                                               using=using,
                                               instance_pk=get_current_instance().pk)
예제 #21
0
def klass_post_delete_handler(sender, instance, using, **kwargs):
    add_post_transaction_success_operation(DeleteKlassIndexesTask.delay,
                                           using=using,
                                           instance_pk=get_current_instance().pk,
                                           klass_pk=instance.pk)
예제 #22
0
 def resend(self, *args, **kwargs):
     invitation = self.get_object()
     if invitation.state == Invitation.STATE_CHOICES.NEW:
         add_post_transaction_success_operation(NotifyAboutInvitation.delay, invitation_id=invitation.id)
     return Response(status=status.HTTP_204_NO_CONTENT)