Services API
Eventyay provides a comprehensive services layer in app/eventyay/base/services/ that handles common operations across all components.
Order Services
Located in eventyay.base.services.orders:
Creating Orders
1from eventyay.base.services.orders import OrderCreator
2
3creator = OrderCreator(event=event)
4order = creator.create(
5 positions=[
6 {'product': product, 'variation': variation, 'count': 2}
7 ],
8 email='customer@example.com',
9 locale='en',
10 sales_channel='web'
11)
Modifying Orders
1from eventyay.base.services.orders import OrderModifier
2
3modifier = OrderModifier(order=order)
4modifier.add_position(product=product, variation=variation)
5modifier.remove_position(position_id=123)
6modifier.save()
Canceling Orders
from eventyay.base.services.orders import OrderCanceler
canceler = OrderCanceler(order=order)
canceler.cancel()
Email Services
Located in eventyay.base.services.mail:
Sending Event Emails
1from eventyay.base.services.mail import SendMailService
2
3service = SendMailService(event=event)
4service.send_mail(
5 subject='Welcome!',
6 message='Thank you for your order',
7 recipient_list=['customer@example.com'],
8 order=order # Optional, for tracking
9)
Using Email Templates
1from eventyay.base.models import MailTemplate
2from eventyay.base.services.mail import TemplateMailService
3
4template = MailTemplate.objects.get(event=event, identifier='order_placed')
5service = TemplateMailService(template=template)
6service.send(
7 order=order,
8 context={'custom_var': 'value'}
9)
Invoice Services
Located in eventyay.base.services.invoices:
Generating Invoices
from eventyay.base.services.invoices import InvoiceGenerator
generator = InvoiceGenerator(order=order)
invoice = generator.generate()
Regenerating Invoices
from eventyay.base.services.invoices import InvoiceRegenerator
regenerator = InvoiceRegenerator(invoice=invoice)
regenerator.regenerate()
Ticket Services
Located in eventyay.base.services.tickets:
Generating Tickets
from eventyay.base.services.tickets import TicketGenerator
generator = TicketGenerator(event=event)
pdf_data = generator.generate(order_position=position)
Check-in Services
Located in eventyay.base.services.checkin:
Performing Check-ins
1from eventyay.base.services.checkin import CheckinService
2
3service = CheckinService(checkin_list=checkin_list)
4result = service.checkin(
5 secret='TICKET_SECRET',
6 force=False,
7 ignore_unpaid=False
8)
9
10if result['status'] == 'ok':
11 print(f"Checked in: {result['position']}")
Payment Services
Located in eventyay.base.services.payments:
Processing Payments
1from eventyay.base.services.payments import PaymentProcessor
2
3processor = PaymentProcessor(order=order, payment_provider='stripe')
4payment = processor.create_payment(amount=order.total)
5
6# After payment confirmation
7processor.confirm_payment(payment=payment)
Refunding Payments
1from eventyay.base.services.payments import RefundService
2
3service = RefundService(order=order)
4refund = service.create_refund(
5 payment=payment,
6 amount=50.00,
7 provider='stripe'
8)
Cart Services
Located in eventyay.base.services.cart:
Managing Carts
1from eventyay.base.services.cart import CartManager
2
3manager = CartManager(event=event, session=request.session)
4
5# Add to cart
6manager.add_product(
7 product=product,
8 variation=variation,
9 count=2
10)
11
12# Get cart contents
13cart_positions = manager.get_cart()
14
15# Clear cart
16manager.clear()
Quota Services
Located in eventyay.base.services.quotas:
Checking Availability
1from eventyay.base.services.quotas import QuotaAvailability
2
3checker = QuotaAvailability(event=event)
4
5# Check if product is available
6available, left = checker.check_product(product=product, count=2)
7
8if available:
9 print(f"{left} tickets remaining")
Talk Component Services
Submission Services
Located in eventyay.submission.services:
1from eventyay.submission.services import SubmissionService
2
3service = SubmissionService(event=event)
4
5# Create submission
6submission = service.create_submission(
7 title='My Talk',
8 description='Description',
9 speaker=speaker_profile,
10 submission_type=submission_type
11)
12
13# Accept submission
14service.accept_submission(submission=submission)
Schedule Services
Located in eventyay.schedule.services:
1from eventyay.schedule.services import ScheduleService
2
3service = ScheduleService(event=event)
4
5# Create schedule
6schedule = service.create_schedule(version='1.0')
7
8# Add talk to schedule
9service.add_talk_slot(
10 schedule=schedule,
11 submission=submission,
12 start=datetime(2025, 3, 15, 10, 0),
13 room=room
14)
15
16# Publish schedule
17service.publish_schedule(schedule=schedule)
Video Component Services
Room Services
Located in eventyay.features.live.services:
1from eventyay.features.live.services import RoomService
2
3service = RoomService(event=event)
4
5# Create virtual room
6room = service.create_room(
7 name='Main Hall',
8 description='Main conference room',
9 capacity=500
10)
11
12# Add user to room
13service.add_user_to_room(room=room, user=user)
Streaming Services
1from eventyay.features.live.services import StreamingService
2
3service = StreamingService(room=room)
4
5# Start stream
6stream = service.start_stream(
7 provider='bbb', # BigBlueButton
8 moderator=user
9)
10
11# Get join URL
12join_url = service.get_join_url(stream=stream, user=user)
Service Best Practices
Use services, not direct model manipulation: Services handle business logic, validation, and side effects.
Pass explicit parameters: Don’t rely on global state or request objects within services.
Handle errors gracefully: Services may raise specific exceptions - catch and handle them appropriately.
Use transactions: When modifying multiple objects, wrap service calls in database transactions.
Keep services stateless: Services should not maintain state between calls.
Example: Complete Order Flow
1from django.db import transaction
2from eventyay.base.services.orders import OrderCreator
3from eventyay.base.services.mail import SendMailService
4from eventyay.base.services.invoices import InvoiceGenerator
5
6with transaction.atomic():
7 # Create order
8 creator = OrderCreator(event=event)
9 order = creator.create(
10 positions=[{'product': product, 'count': 1}],
11 email='customer@example.com',
12 locale='en'
13 )
14
15 # Generate invoice
16 invoice_gen = InvoiceGenerator(order=order)
17 invoice = invoice_gen.generate()
18
19 # Send confirmation email
20 mail_service = SendMailService(event=event)
21 mail_service.send_mail(
22 subject=f'Order {order.code}',
23 message='Your order has been confirmed',
24 recipient_list=[order.email],
25 order=order
26 )
See Also
Talk Component Models - Talk component models documentation
Video Component Models - Video component models documentation
Unified Component Models - Base models documentation
Signals Reference - Signals reference
Creating a plugin - Creating plugins