Skip to main content

django-service-objects Latest Version

Build Status Python Support License

Service objects for Django

What?

This is a small library providing a Service base class to derive your service objects from. What are service objects? You can read more about the whys and hows in this blog post, but for the most part, it encapsulates your business logic, decoupling it from your views and model methods. Put your business logic in service objects.

Installation guide

Install from pypi:

pip install django-service-objects

Add service_objects to your INSTALLED_APPS:

# settings.py

INSTALLED_APPS = (
    ...
    'service_objects',
    ...
)

Example

Let's say you want to register new users. You could make a CreateUser service.

from service_objects.services import Service

class CreateUser(Service):
    email = forms.EmailField()
    password = forms.CharField(max_length=255)
    subscribe_to_newsletter = forms.BooleanField(required=False)

    def process(self):
        email = self.cleaned_data['email']
        password = self.cleaned_data['password']
        subscribe_to_newsletter = self.cleaned_data['subscribe_to_newsletter']

        user = User.objects.create_user(
            username=email, email=email, password=password)

        if subscribe_to_newsletter:
            newsletter = Newsletter.objects.get()
            newsletter.subscribers.add(user)
            newsletter.save()
            
        WelcomeEmail.send(user, is_subscribed=subsribe_to_newsletter)

        return user

Notice that it's basically a Django form but with a process method. This method gets called when you call execute() on the process. If your inputs are invalid, it raises InvalidInputsError.

Here's how you use it:

CreateUser.execute({
    'email': 'kvothe@edemaruh.com',
    'password': 'doorsofstone',
    'subscribe_to_newsletter': True,
})

Now you can use it anywhere.

In your views

# views.py

# Function Based View
def create_user_view(request):
    form = NewUserForm()
    if request.method == 'POST':
        form = NewUserForm(request.POST)

        if form.is_valid():
            try:
                CreateUser.execute(request.POST)
                return redirect('/success/')
            except Exception:
                form.add_error(None, 'Something went wrong')

    return render(request, 'registration/new-user.html', {'form': form})


# Class Based View
class CreateUserView(ServiceView):
    form_class = NewUserForm
    service_class = CreateUser
    template_name = 'registration/new-user.html'
    success_url = '/success/'

A management command

# management/commands/create_user.py

class Command(BaseCommand):
    help = "Creates a new user"

    def add_arguments(self, parser):
        parser.add_argument('email')
        parser.add_argument('password')

    def handle(self, *args, **options):
        user = CreateUser.execute(options)
        self.stdout.write(f'New user created : {user.email}')

In your tests

class CreateUserTest(TestCase):

    def test_create_user(self):
        inputs = {
            'email': 'kvothe@edemaruh.com',
            'password': 'do0r$0f$stone42',
            'subscribe_to_newsletter': True,
        }

        CreateUser.execute(inputs)

        user = User.objects.get()
        self.assertEqual(user.email, inputs['email'])

        newsletter = Newsletter.objects.get()
        self.assertIn(user, newsletter.subscribers.all())

And anywhere you want. You can even execute services inside other services. The possibilities are endless!

Documentation

Docs can be found on readthedocs.

If you have any questions about service objects, you can tweet me @mixxorz.

Release files for django-service-objects 0.4.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-service-objects 0.4.0
File Size Uploaded
django-service-objects-0.4.0.tar.gz 6.6 kB Details

Release files / django-service-objects-0.4.0.tar.gz

Download URL django-service-objects-0.4.0.tar.gz
Size 6.6 kB
Tags Source
SHA-256 checksum
How to use checksums
4970c5aee725566f91aae95dd78da151a242edaae3e0c332a51688de059d5763
BLAKE2b-256 checksum
How to use checksums
1e36205b648b6b00ef5e3d860f2a59910f5355ce7ea93200e379d374892ff3dd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No

Release history Release notifications | RSS feed

0.7.1

2 release files

0.7.0

1 release file

0.6.0

1 release file

0.5.0

1 release file

This release

0.4.0 This release

1 release file

0.3.1

1 release file

0.3.0

1 release file

0.2.0

1 release file

0.1.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page