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

  1. Use services, not direct model manipulation: Services handle business logic, validation, and side effects.

  2. Pass explicit parameters: Don’t rely on global state or request objects within services.

  3. Handle errors gracefully: Services may raise specific exceptions - catch and handle them appropriately.

  4. Use transactions: When modifying multiple objects, wrap service calls in database transactions.

  5. 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