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