예제 #1
0
    def handle(self, *args, **kwargs):
        email = kwargs.get("email")
        all_publishers = kwargs.get("all")
        self.stdout.write("Processing payouts. \n")
        for publisher in Publisher.objects.all():
            data = generate_publisher_payout_data(publisher)
            report = data.get("due_report")
            url = data.get("due_report_url")
            if not report:
                if not all_publishers:
                    # Skip publishers without due money
                    continue
                report = data.get("current_report")
                url = data.get("current_report_url")

            due_balance = report["total"]["revenue_share"]
            ctr = report["total"]["ctr"]

            if due_balance > float(50):
                self.stdout.write("###########" + "\n")
                self.stdout.write(str(publisher) + "\n")
                self.stdout.write(
                    "total={:.2f}".format(due_balance)
                    + " ctr={:.3f}".format(ctr)
                    + " first={}".format(data.get("first"))
                    + "\n"
                )
                self.stdout.write(url + "\n")
                self.stdout.write("###########" + "\n" + "\n")
                if email:
                    payouts_url = generate_absolute_url(
                        "publisher_payouts", kwargs={"publisher_slug": publisher.slug}
                    )
                    settings_url = generate_absolute_url(
                        "publisher_settings", kwargs={"publisher_slug": publisher.slug}
                    )
                    self.stdout.write(
                        Template(email_template).render(
                            Context(
                                dict(
                                    report=report,
                                    url=url,
                                    payouts_url=payouts_url,
                                    settings_url=settings_url,
                                    **data,
                                )
                            )
                        )
                    )
예제 #2
0
    def handle(self, *args, **kwargs):
        # pylint: disable=too-many-statements,too-many-branches
        print_email = kwargs.get("email")
        send_email = kwargs.get("send")
        create_payout = kwargs.get("payout")
        all_publishers = kwargs.get("all")
        publisher_slug = kwargs.get("publisher")

        self.stdout.write("Processing payouts. \n")

        queryset = Publisher.objects.all()
        if publisher_slug:
            queryset = queryset.filter(slug__contains=publisher_slug)

        for publisher in queryset:
            data = generate_publisher_payout_data(publisher)
            report = data.get("due_report")
            report_url = data.get("due_report_url")
            if not report:
                if not all_publishers:
                    self.stdout.write(
                        f"Skipping for no due report: {publisher.slug}\n")
                    # Skip publishers without due money
                    continue
                report = data.get("current_report")
                report_url = data.get("current_report_url")

            due_balance = report["total"]["revenue_share"]
            due_str = "{:.2f}".format(due_balance)
            ctr = report["total"]["ctr"]

            if due_balance < float(50) and not all_publishers:
                self.stdout.write(
                    f"Skipping for low balance: {publisher.slug} owed {due_str}\n"
                )
                continue

            self.stdout.write("\n\n###########\n")
            self.stdout.write(str(publisher) + "\n")
            self.stdout.write("total={:.2f}".format(due_balance) +
                              " ctr={:.3f}".format(ctr) +
                              " first={}".format(data.get("first")) + "\n")
            self.stdout.write(report_url + "\n")
            self.stdout.write("###########\n\n")

            if print_email or send_email:
                payouts_url = generate_absolute_url(
                    "publisher_payouts",
                    kwargs={"publisher_slug": publisher.slug})
                settings_url = generate_absolute_url(
                    "publisher_settings",
                    kwargs={"publisher_slug": publisher.slug})
                context = dict(
                    report=report,
                    report_url=report_url,
                    payouts_url=payouts_url,
                    settings_url=settings_url,
                    publisher=publisher,
                    **data,
                )
                if ctr < 0.08:
                    self.stdout.write("Include CTR callout?\n")
                    ctr_proceed = input("y/n?: ")
                    if ctr_proceed:
                        context["ctr"] = ctr

                email_html = (Template(email_template).render(
                    Context(context)).replace("\n\n", "\n"))

            if print_email:
                self.stdout.write(email_html)

            if send_email:
                token = getattr(settings, "FRONT_TOKEN")
                channel = getattr(settings, "FRONT_CHANNEL")
                author = getattr(settings, "FRONT_AUTHOR")

                if not token or not channel:
                    self.stdout.write("No front token, not sending email\n")
                    return

                headers = {
                    "Authorization": f"Bearer {token}",
                    "Content-Type": "application/json",
                }

                payload = {
                    # "to": ['*****@*****.**'], # For testing
                    "to": [user.email for user in publisher.user_set.all()],
                    "sender_name": "EthicalAds by Read the Docs",
                    "subject": f"EthicalAds Payout - {publisher.name}",
                    "options": {
                        "archive": False
                    },
                    "body": email_html,
                }
                if author:
                    payload["author_id"] = author

                url = f"https://api2.frontapp.com/channels/{channel}/messages"

                self.stdout.write("Send email?\n")
                self.stdout.write(f"{payload['to']}: {payload['subject']}\n")
                proceed = input("y/n?: ")
                if not proceed == "y":
                    self.stdout.write("Skipping email.\n")
                else:
                    requests.request("POST",
                                     url,
                                     json=payload,
                                     headers=headers)
                    # pprint(response.json())

            if create_payout:
                self.stdout.write("Create Payout?\n")

                if publisher.payout_method:
                    if publisher.stripe_connected_account_id:
                        self.stdout.write(
                            f"Stripe: https://dashboard.stripe.com/connect/accounts/{publisher.stripe_connected_account_id}\n"
                        )
                    if publisher.open_collective_name:
                        self.stdout.write(
                            f"Open Collective: https://opencollective.com/{publisher.open_collective_name}\n"
                        )
                    if publisher.paypal_email:
                        self.stdout.write(
                            f"Paypal: {publisher.paypal_email}\n")
                    self.stdout.write(due_str)
                    self.stdout.write(
                        f"EthicalAds Payout - {publisher.name}\n")

                payout_proceed = input("y/n?: ")
                if not payout_proceed == "y":
                    self.stdout.write("Skipping payout\n")
                else:
                    publisher.payouts.create(
                        date=datetime.datetime.utcnow(),
                        method=publisher.payout_method,
                        amount=due_balance,
                        note=report_url,
                    )