Metadata-Version: 2.4
Name: gdaps
Version: 0.18.0
Summary: Generic plugin environment, perfectly fitting into the Django ecosystem
Author-email: Christian González <office@nerdocs.at>
License-Expression: BSD-3-Clause
Project-URL: Home, https://gdaps.readthedocs.org
Project-URL: Source, https://gitlab.com/nerdocs/gdaps
Project-URL: Documentation, https://gdaps.readthedocs.org
Project-URL: Tracker, https://gitlab.com/nerdocs/gdaps/issues
Keywords: django,plugins
Classifier: Development Status :: 3 - Alpha
Classifier: Environment :: Web Environment
Classifier: Framework :: Django :: 3.2
Classifier: Intended Audience :: Developers
Classifier: Natural Language :: English
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: JavaScript
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.11
Classifier: Topic :: Internet :: WWW/HTTP
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI
Requires-Python: >=3.12
Description-Content-Type: text/markdown
License-File: LICENSE.md
Requires-Dist: django>=5.2
Requires-Dist: semantic-version>=2.9
Requires-Dist: cryptography>=46.0.7
Dynamic: license-file


The GDAPS library allows Django to make real "pluggable" apps.

A standard Django "app" is *reusable* (if done correctly), but is not *pluggable*,
like being distributed and "plugged" into a Django main application without modifications. GDAPS is filling this gap.

The reason you want to use GDAPS is: **you want to create an application that should be extended via plugins**. GDAPS consists of a few bells and twistles where Django lacks "automagic":

* Apps are automatically found using setuptools' entry points
* Apps can provide their own URLs (they are included and merged into urlpatterns automatically)
* Apps can define ``Interfaces``, that other GDAPS apps then can implement
* Apps can provide template hooks that can be filled with plugins' content


## Limitations

* GDAPS interfaces cannot inherit classes that import models (like `PermissionRequiredMixin`), as the declaration is too early in the Django setup process, and apps aren't loaded at that time.


## Contribute

You can support me in various ways.

* Test the code and write bug reports.
* Write code
* Suggest ideas (as bug report)


## Credits

I was majorly influenced by other plugin systems when writing this code, big thanks to them:

* Marty Alchin's [Simple plugin framework](http://martyalchin.com/2008/jan/10/simple-plugin-framework/)
* The [PyUtilib](https://github.com/PyUtilib/pyutilib) library
* [The Pretix ecosystem](https://pretix.eu/)
* [Yapsy](http://yapsy.sourceforge.net/)
* [Django-Rest-Framework](https://www.django-rest-framework.org/)
* [Graphene-Django](http://docs.graphene-python.org/projects/django/en/latest/)

## License

GDAPS is licensed under the **BSD License**, see [License](LICENSE.md).

