Skip to main content

A Django app that speeds up and simplifies implementing a GraphQL endpoint!

Project description

A red g with a grapple hook

Wagtail Grapple

A library to build GraphQL endpoints easily so you can grapple your Wagtail data from anywhere!

Explore the docs »

View Demo · Report Bug · Request Feature

Table of Contents

About The Project

GraphQL Preview Demo

There is a range of GraphQL packages for Python and specifically Django. However, getting these packages to work out of the box with an existing infrastructure without errors isn't as easy to come by.

The purpose of Grapple is to be able to build GraphQL endpoints on a model by model basis as quickly as possible. The setup and configuration have been designed to be as simple but also provide the best features; No complex serializers need to be written - just add a graphql_fields list to your model and away you go (although if you want to go deeper you can!).

Features:

  • Easily create GraphQL types by adding a small annotation in your models.
  • Supports traditional Wagtail models:
    • Pages (including Streamfield & Orderables)
    • Snippets
    • Images
    • Documents
    • Settings
    • Search (on all models)
  • Custom Image & Document model support
  • Advanced headless preview functionality built using GraphQL Subscriptions to enable Page previews on any device!
  • Gatsby Image support (both base64 and SVG tracing)! :fire:

Built With

This library is an abstraction upon and relies heavily on Graphene & Graphene Django. We also use Django Channels and the Potrace image library.

Getting Started

Getting Grapple installed is designed to be as simple as possible!

Prerequisites

Django  >= 2.2, <3.1 (<2.3 if using channels)
wagtail >= 2.5, <2.11

Installation

pip install wagtail_grapple

Add the following to the installed_apps list in your Wagtail settings file:

installed_apps = [
    ...
    "grapple",
    "graphene_django",
    ...
]

For GraphQL Subscriptions with Django Channels, run pip install wagtail_grapple[channels] and add channels to installed apps:

installed_apps = [
    ...
    "grapple",
    "graphene_django",
    "channels",
    ...
]

Add the following to the bottom of the same settings file, where each key is the app you want to this library to scan and the value is the prefix you want to give to GraphQL types (you can usually leave this blank):

# Grapple Config:
GRAPHENE = {"SCHEMA": "grapple.schema.schema"}
GRAPPLE_APPS = {
    "home": ""
}

Add the GraphQL URLs to your urls.py:

from grapple import urls as grapple_urls
...
urlpatterns = [
    ...
    url(r"", include(grapple_urls)),
    ...
]

Done! Now you can proceed onto configuring your models to generate GraphQL types that adopt their structure :tada: Your GraphQL endpoint is available at http://localhost:8000/graphql/

Usage

Here is a GraphQL model configuration for the default page from the Wagtail docs:

...
from grapple.models import (
    GraphQLString,
    GraphQLStreamfield,
)

class BlogPage(Page):
    author = models.CharField(max_length=255)
    date = models.DateField("Post date")
    body = StreamField(
        [
            ("heading", blocks.CharBlock(classname="full title")),
            ("paragraph", blocks.RichTextBlock()),
            ("image", ImageChooserBlock()),
        ]
    )

    content_panels = Page.content_panels + [
        FieldPanel("author"),
        FieldPanel("date"),
        StreamFieldPanel("body"),
    ]

    # Note these fields below:
    graphql_fields = [
        GraphQLString("heading"),
        GraphQLString("date"),
        GraphQLString("author"),
        GraphQLStreamfield("body"),
    ]

For more examples, please refer to the Documentation

Contributing

Contributions are what make the open source community such an amazing place to be learn, inspire, and create. Any contributions you make are greatly appreciated.

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature)
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

Local development

  • In the python environment of your choice, navigate to /examples
  • Run pip install -r requirements.txt
  • Delete the db.sqlite3 file and run ./manage.py migrate
  • Run server ./manage.py runserver

Compatibility

Wagtail Grapple supports:

  • Django 2.2.x, 3.0.x
  • Python 3.6, 3.7 and 3.8
  • Wagtail >= 2.5, < 2.11

License

Distributed under the MIT License. See LICENSE for more information.

Contact

Nathan Horrigan

Project Link: https://github.com/GrappleGQL/wagtail-grapple

Inspired by

Contributors ✨

Thanks goes to these wonderful people (emoji key):


Nathan Horrigan

💻 🐛 📖 🚇 🚧

Cameron Lamb

💻 🐛 📖 🚇 🚧

Dan Braghis

💻 🐛 📖 🚇 🚧

Rui Saraiva

💻 🐛 📖 🚇 🚧

Tibor

💻 🐛 📖

timmysmalls

💻 🐛

Tom Dyson

💻 📖

fabienheureux

💻 🐛 📖

This project follows the all-contributors specification. Contributions of any kind welcome!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

wagtail-grapple-0.7.0.tar.gz (30.3 kB view details)

Uploaded Source

Built Distribution

wagtail_grapple-0.7.0-py2.py3-none-any.whl (32.5 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file wagtail-grapple-0.7.0.tar.gz.

File metadata

  • Download URL: wagtail-grapple-0.7.0.tar.gz
  • Upload date:
  • Size: 30.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.24.0 setuptools/42.0.1 requests-toolbelt/0.9.1 tqdm/4.40.0 CPython/3.7.3

File hashes

Hashes for wagtail-grapple-0.7.0.tar.gz
Algorithm Hash digest
SHA256 f59beee8a248f992df64644a38b6423c01008cdf34634a2c69d50874d0f9afd3
MD5 a61849bf3cfa3d0475ae37aa13c9cc5e
BLAKE2b-256 c48faa33c6afbb29b835ea87b28fec51eca15e1803e33f34b66a8ba8015bc563

See more details on using hashes here.

Provenance

File details

Details for the file wagtail_grapple-0.7.0-py2.py3-none-any.whl.

File metadata

  • Download URL: wagtail_grapple-0.7.0-py2.py3-none-any.whl
  • Upload date:
  • Size: 32.5 kB
  • Tags: Python 2, Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.1.1 pkginfo/1.5.0.1 requests/2.24.0 setuptools/42.0.1 requests-toolbelt/0.9.1 tqdm/4.40.0 CPython/3.7.3

File hashes

Hashes for wagtail_grapple-0.7.0-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 9783a04f79a405eb83b2ccb45d68cbe0ce5abcb1c012c6c25c5e7eb265954cc7
MD5 29275239dd49c2da5aac31ade2c006a5
BLAKE2b-256 88c65a5b2448010b63753338a561ba131b49521f82fd5d428eb8fd2eb927271f

See more details on using hashes here.

Provenance

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page