Browse Source

Merge pull request #194 from pinry/feature/plugin-system

Feature: Add naive plugin support for pinry
pull/207/head
Ji Qu 4 years ago
committed by GitHub
parent
commit
fa0c0722fa
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 113 additions and 0 deletions
  1. +20
    -0
      docs/src/plugin-system.md
  2. +1
    -0
      mkdocs.yml
  3. +1
    -0
      pinry/settings/base.py
  4. +4
    -0
      pinry/settings/local_settings.example.py
  5. +0
    -0
      pinry_plugins/__init__.py
  6. +0
    -0
      pinry_plugins/admin.py
  7. +9
    -0
      pinry_plugins/apps.py
  8. +0
    -0
      pinry_plugins/batteries/__init__.py
  9. +10
    -0
      pinry_plugins/batteries/plugin_example.py
  10. +5
    -0
      pinry_plugins/builder/__init__.py
  11. +63
    -0
      pinry_plugins/builder/_loader.py
  12. +0
    -0
      pinry_plugins/migrations/__init__.py
  13. +0
    -0
      pinry_plugins/models.py
  14. +0
    -0
      pinry_plugins/tests.py
  15. +0
    -0
      pinry_plugins/views.py

+ 20
- 0
docs/src/plugin-system.md View File

@@ -0,0 +1,20 @@
# New plugin system for Pinry

New plugin system is under development.

Now you could access it via project example plugin file `pinry_plugins/batteries/plugin_example.py`.

You could create a simple plugin which has a class which owns methods named:

+ process_image_pre_creation
+ process_thumbnail_pre_creation
And, add the plugin class to local_settings.py as:

```
ENABLED_PLUGINS = [
'pinry_plugins.batteries.plugin_example.Plugin',
]
```

Now the plugin will work like a charm!

+ 1
- 0
mkdocs.yml View File

@@ -19,6 +19,7 @@ nav:
- Theories: 'theories.md'
- Install with Docker: 'install-with-docker.md'
- Development: 'development.md'
- PluginSystem: 'plugin-system.md'
- Docs: 'docs.md'
- Passwords: 'passwords.md'
- Assets: 'assets.md'


+ 1
- 0
pinry/settings/base.py View File

@@ -21,6 +21,7 @@ INSTALLED_APPS = [
'django_images',
'core',
'users',
'pinry_plugins.apps.PinryPluginsConfig',
]

ROOT_URLCONF = 'pinry.urls'


+ 4
- 0
pinry/settings/local_settings.example.py View File

@@ -42,3 +42,7 @@ IMAGE_SIZES = {

# Whether people can view pins without login
PUBLIC = True

ENABLED_PLUGINS = [
'pinry_plugins.batteries.plugin_example.Plugin',
]

+ 0
- 0
pinry_plugins/__init__.py View File


+ 0
- 0
pinry_plugins/admin.py View File


+ 9
- 0
pinry_plugins/apps.py View File

@@ -0,0 +1,9 @@
from django.apps import AppConfig


class PinryPluginsConfig(AppConfig):
name = 'pinry_plugins'

def ready(self):
from pinry_plugins import builder # noqa
builder.init()

+ 0
- 0
pinry_plugins/batteries/__init__.py View File


+ 10
- 0
pinry_plugins/batteries/plugin_example.py View File

@@ -0,0 +1,10 @@
from core.models import Image
from django_images.models import Thumbnail


class Plugin:
def process_image_pre_creation(self, django_settings, image_instance: Image):
pass

def process_thumbnail_pre_creation(self, django_settings, thumbnail_instance: Thumbnail):
pass

+ 5
- 0
pinry_plugins/builder/__init__.py View File

@@ -0,0 +1,5 @@
from . import _loader


def init():
_loader.init()

+ 63
- 0
pinry_plugins/builder/_loader.py View File

@@ -0,0 +1,63 @@
import logging

from django.dispatch import receiver
from django.utils.module_loading import import_string
from django.conf import settings
from django.db import models

from core.models import Image
from django_images.models import Thumbnail

_plugins = getattr(settings, "ENABLED_PLUGINS", [])
_plugin_instances = []


def _load_plugins():
for plugin_path in _plugins:
plugin_cls = import_string(plugin_path)
_plugin_instances.append(plugin_cls())


@receiver(models.signals.pre_save, sender=Image)
def process_image_pre_creation(sender, instance: Image, **kwargs):
# FIXME(winkidney): May have issue on determining if it
# is created or not
if instance.pk is not None:
return
for plugin in _plugin_instances:
process_fn = getattr(plugin, "process_image_pre_creation")
try:
process_fn(
django_settings=settings,
image_instance=instance,
)
except Exception:
logging.exception(
"Error occurs while trying to access plugin's pin_pre_save "
"for plugin %s" % plugin
)


@receiver(models.signals.pre_save, sender=Thumbnail)
def process_thumbnail_pre_creation(sender, instance: Thumbnail, **kwargs):
# FIXME(winkidney): May have issue on determining if it
# is created or not
if instance.pk is not None:
return

for plugin in _plugin_instances:
process_fn = getattr(plugin, "process_thumbnail_pre_creation")
try:
process_fn(
django_settings=settings,
thumbnail_instance=instance,
)
except Exception:
logging.exception(
"Error occurs while trying to access plugin's process_thumbnail_pre_creation "
"for plugin %s" % plugin
)


def init():
_load_plugins()

+ 0
- 0
pinry_plugins/migrations/__init__.py View File


+ 0
- 0
pinry_plugins/models.py View File


+ 0
- 0
pinry_plugins/tests.py View File


+ 0
- 0
pinry_plugins/views.py View File


Loading…
Cancel
Save