Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 37 additions & 0 deletions buzz/api/payments/test_payments.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import frappe
from frappe.tests import IntegrationTestCase

from buzz.api.payments import get_event_payment_gateways


class TestGetEventPaymentGateways(IntegrationTestCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.event = str(frappe.get_doc("Buzz Event", {"route": "test-route"}).name)

def setUp(self):
frappe.set_user("Administrator")
gateway = {"doctype": "Payment Gateway", "gateway": f"Test Gateway {frappe.generate_hash(6)}"}
self.gateway = frappe.get_doc(gateway).insert().name
self.set_gateways([])

def tearDown(self):
frappe.db.rollback()
frappe.clear_document_cache("Buzz Event", self.event)

def set_gateways(self, gateways: list[str]):
event = frappe.get_doc("Buzz Event", self.event)
event.payment_gateways = []
for gateway in gateways:
event.append("payment_gateways", {"payment_gateway": gateway})
event.save(ignore_permissions=True)
frappe.clear_document_cache("Buzz Event", self.event)

def test_configured_gateways_are_returned(self):
self.set_gateways([self.gateway])

self.assertEqual(get_event_payment_gateways(self.event), [self.gateway])

def test_no_gateways_configured(self):
self.assertEqual(get_event_payment_gateways(self.event), [])
121 changes: 9 additions & 112 deletions buzz/api/sponsorships/__init__.py
Original file line number Diff line number Diff line change
@@ -1,127 +1,24 @@
import frappe

from buzz.payments import get_payment_link_for_sponsorship
from buzz.api.sponsorships.schemas import SponsorshipDetailsResponse, SponsorshipListItem
from buzz.api.sponsorships.services import SponsorshipService, list_user_enquiries


@frappe.whitelist()
def get_sponsorship_details(enquiry_id: str) -> dict:
enquiry = frappe.get_doc("Sponsorship Enquiry", enquiry_id)

if enquiry.owner != frappe.session.user and not frappe.has_permission(
"Sponsorship Enquiry", "read", enquiry
):
frappe.throw(frappe._("Not permitted to view this sponsorship enquiry"))

tier_title = ""
if enquiry.tier:
tier_title = frappe.db.get_value("Sponsorship Tier", enquiry.tier, "title") or enquiry.tier

event_details = {}
if enquiry.event:
event = frappe.get_cached_doc("Buzz Event", enquiry.event)
event_details = {
"title": event.title,
"short_description": getattr(event, "short_description", ""),
"about": getattr(event, "about", ""),
"start_date": event.start_date,
"end_date": getattr(event, "end_date", ""),
"venue": getattr(event, "venue", ""),
"route": getattr(event, "route", ""),
}

sponsor_details = None
sponsors = frappe.db.get_all(
"Event Sponsor",
filters={"enquiry": enquiry_id},
fields=["name", "company_name", "company_logo", "creation", "event", "tier"],
limit=1,
)

if sponsors:
sponsor_details = sponsors[0]
if sponsor_details.get("tier"):
sponsor_tier_title = frappe.db.get_value("Sponsorship Tier", sponsor_details["tier"], "title")
sponsor_details["tier_title"] = sponsor_tier_title or sponsor_details["tier"]

return {
"enquiry": {
"name": enquiry.name,
"company_name": enquiry.company_name,
"company_logo": enquiry.company_logo,
"event": enquiry.event,
"tier": enquiry.tier,
"tier_title": tier_title,
"status": enquiry.status,
"creation": enquiry.creation,
"owner": enquiry.owner,
},
"event_details": event_details,
"sponsor_details": sponsor_details,
"has_sponsor": bool(sponsor_details),
}
def get_sponsorship_details(enquiry_id: str) -> SponsorshipDetailsResponse:
return SponsorshipService(enquiry_id).details()


@frappe.whitelist()
def get_user_sponsorship_inquiries() -> list:
inquiries = frappe.db.get_all(
"Sponsorship Enquiry",
filters={"owner": frappe.session.user},
fields=["name", "company_name", "event", "tier", "status", "creation"],
order_by="creation desc",
)

for inquiry in inquiries:
if inquiry.event:
event_title = frappe.db.get_value("Buzz Event", inquiry.event, "title")
inquiry["event_title"] = event_title

if inquiry.tier:
tier_title = frappe.db.get_value("Sponsorship Tier", inquiry.tier, "title")
inquiry["tier_title"] = tier_title or inquiry.tier
else:
inquiry["tier_title"] = ""

inquiry_names = [inquiry.name for inquiry in inquiries]
if inquiry_names:
sponsors = frappe.db.get_all(
"Event Sponsor",
filters={"enquiry": ["in", inquiry_names]},
fields=["enquiry"],
)
sponsored_inquiries = {sponsor.enquiry for sponsor in sponsors}

for inquiry in inquiries:
inquiry["has_sponsor"] = inquiry.name in sponsored_inquiries
else:
for inquiry in inquiries:
inquiry["has_sponsor"] = False

return inquiries
def get_user_sponsorship_inquiries() -> list[SponsorshipListItem]:
return list_user_enquiries()


@frappe.whitelist()
def create_sponsorship_payment_link(enquiry_id: str, tier_id: str, payment_gateway: str | None = None) -> str:
enquiry = frappe.get_doc("Sponsorship Enquiry", enquiry_id)
if enquiry.owner != frappe.session.user:
frappe.throw(frappe._("Not permitted to create payment for this enquiry"))

redirect_url = f"/b/account/sponsorships/{enquiry_id}?success=true"
return get_payment_link_for_sponsorship(
enquiry_id, tier_id, redirect_url, payment_gateway=payment_gateway
)
return SponsorshipService(enquiry_id).payment_link(tier_id, payment_gateway)


@frappe.whitelist()
def withdraw_sponsorship_enquiry(enquiry_id: str):
enquiry = frappe.get_cached_doc("Sponsorship Enquiry", enquiry_id)
if enquiry.owner != frappe.session.user:
frappe.throw(frappe._("Not permitted to withdraw this enquiry"))

if enquiry.status == "Paid":
frappe.throw(frappe._("Cannot withdraw a paid sponsorship enquiry"))

if enquiry.status == "Withdrawn":
frappe.throw(frappe._("This sponsorship enquiry has already been withdrawn"))

enquiry.status = "Withdrawn"
enquiry.save(ignore_permissions=True)
def withdraw_sponsorship_enquiry(enquiry_id: str) -> None:
SponsorshipService(enquiry_id).withdraw()
25 changes: 25 additions & 0 deletions buzz/api/sponsorships/exceptions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from frappe import _lt

from buzz.api.exceptions import Conflict, NotPermitted


class EnquiryNotAccessible(NotPermitted):
message = _lt("You are not permitted to view this sponsorship enquiry.")


class PaymentNotPermitted(NotPermitted):
message = _lt("You are not permitted to pay for this sponsorship enquiry.")


class WithdrawalNotPermitted(NotPermitted):
message = _lt("You are not permitted to withdraw this sponsorship enquiry.")


class EnquiryAlreadyPaid(Conflict):
title = _lt("Already Paid")
message = _lt("A paid sponsorship enquiry cannot be withdrawn.")


class EnquiryAlreadyWithdrawn(Conflict):
title = _lt("Already Withdrawn")
message = _lt("This sponsorship enquiry has already been withdrawn.")
54 changes: 54 additions & 0 deletions buzz/api/sponsorships/schemas.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
from datetime import date, datetime

from buzz.api.schemas import APIResponse


class EnquirySummary(APIResponse):
name: str
company_name: str
company_logo: str | None
event: str
tier: str | None
tier_title: str
status: str
creation: datetime
owner: str


class EventSummary(APIResponse):
title: str
short_description: str | None
about: str | None
start_date: date
end_date: date | None
venue: str | None
route: str | None


class SponsorSummary(APIResponse):
name: str
company_name: str
company_logo: str | None
creation: datetime
event: str
tier: str
tier_title: str


class SponsorshipDetailsResponse(APIResponse):
enquiry: EnquirySummary
event_details: EventSummary
sponsor_details: SponsorSummary | None
has_sponsor: bool


class SponsorshipListItem(APIResponse):
name: str
company_name: str
event: str
tier: str | None
status: str
creation: datetime
event_title: str | None
tier_title: str
has_sponsor: bool
Loading
Loading