Skip to content
Open
Show file tree
Hide file tree
Changes from 8 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions myauth/migrations/0037_plugin_description.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Generated by Django 3.1.4 on 2022-06-29 09:35

from django.db import migrations, models

def add_default_author(apps, schema_editor):
Plugin = apps.get_model("myauth", "Plugin")
for plugin in Plugin.objects.all():
plugin.author = plugin.team.name
plugin.save()

class Migration(migrations.Migration):

dependencies = [
('myauth', '0036_usage'),
]

operations = [
migrations.AddField(
model_name='plugin',
name='description',
field=models.CharField(blank=True, max_length=500),
),
migrations.AddField(
model_name='plugin',
name='author',
field=models.CharField(max_length=50, blank=True, null=True),
),
migrations.RunPython(add_default_author),
migrations.AlterField(
model_name='plugin',
name='author',
field=models.CharField(max_length=50),
),
]
33 changes: 33 additions & 0 deletions myauth/migrations/0038_auto_20220706_1130.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Generated by Django 3.1.4 on 2022-07-06 11:30

from django.db import migrations, models
import django.db.models.deletion


def add_default_origin(apps, schema_editor):
Plugin = apps.get_model("myauth", "Plugin")
for plugin in Plugin.objects.all():
plugin.origin_id = plugin.id
plugin.save()


class Migration(migrations.Migration):

dependencies = [
("myauth", "0037_plugin_description"),
]

operations = [
migrations.RemoveField(
model_name="plugin",
name="author",
),
migrations.AddField(
model_name="plugin",
name="origin",
field=models.ForeignKey(
blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to="myauth.plugin"
),
),
migrations.RunPython(add_default_origin),
]
28 changes: 28 additions & 0 deletions myauth/migrations/0039_auto_20220707_1016.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Generated by Django 3.1.4 on 2022-07-07 10:16

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("myauth", "0038_auto_20220706_1130"),
]

operations = [
migrations.AddField(
model_name="plugin",
name="is_public",
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name="trustedservice",
name="encrypted_access_key",
field=models.CharField(blank=True, max_length=100, null=True),
),
migrations.AddField(
model_name="trustedservice",
name="public_key",
field=models.CharField(blank=True, max_length=100, null=True),
),
]
18 changes: 18 additions & 0 deletions myauth/migrations/0040_auto_20220714_1157.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 3.1.4 on 2022-07-14 11:57

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('myauth', '0039_auto_20220707_1016'),
]

operations = [
migrations.AlterField(
model_name='plugin',
name='is_public',
field=models.BooleanField(blank=True, default=False, null=True),
),
]
12 changes: 8 additions & 4 deletions myauth/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -163,20 +163,24 @@ class Plugin(models.Model):
TYPE = (("Javascript", "Javascript"), ("Python", "Python"), ("AI", "AI"))

id: int
team = models.ForeignKey(Team, on_delete=models.CASCADE)
type = models.CharField(max_length=20, choices=TYPE)
team = models.ForeignKey(Team, on_delete=models.CASCADE) # cannot be edited by user
type = models.CharField(max_length=20, choices=TYPE) # cannot be edited by user
url = models.URLField(blank=False, null=False, max_length=200) # cannot be edited by user
origin = models.ForeignKey("self", blank=True, null=True, on_delete=models.CASCADE) # cannot be edited by user
name = models.CharField(blank=False, null=False, max_length=50)
url = models.URLField(blank=False, null=False, max_length=200)
description = models.CharField(blank=True, null=False, max_length=500)
products = models.CharField(max_length=20, choices=PRODUCTS)
enabled = models.BooleanField(null=False, default=False)
collections = models.ManyToManyField(Collection, blank=True)
is_public = models.BooleanField(blank=True, null=True, default=False)


class TrustedService(models.Model):

id: int
user = models.ForeignKey(User, on_delete=models.CASCADE)
plugin = models.OneToOneField(Plugin, on_delete=models.CASCADE)
public_key = models.CharField(max_length=100, blank=True, null=True)
encrypted_access_key = models.CharField(max_length=100, blank=True, null=True)


class Usage(models.Model):
Expand Down
77 changes: 77 additions & 0 deletions server/api/helpers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
from loguru import logger
from typing import List
from myauth.models import Plugin, TrustedService
from .schemas import PluginSchema
from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.core.validators import URLValidator
from django_etebase.models import Collection


def process_collection_uids(model, collection_uids):
if collection_uids is not None:
model.collections.clear()
for uid in collection_uids:
try:
collection = Collection.objects.get(uid=uid)
model.collections.add(collection)

except ObjectDoesNotExist:
logger.error(f"Project {uid} does not exist.")
model.save()


def process_plugins(plugins: List[Plugin]) -> List[Plugin]:
for p in plugins:
if p is not None:
p.author = get_author(p)
p.collection_uids = p.collections.values_list("uid", flat=True)
if p.type == "Python" or p.type == "AI":
ts = TrustedService.objects.get(plugin_id=p.id)
p.username = ts.user.username
p.public_key = ts.public_key
p.encrypted_access_key = ts.encrypted_access_key
return plugins


def add_plugin(payload: PluginSchema, team_id: int) -> Plugin:
is_origin = payload.origin_id is None
plugin = Plugin.objects.create(
team_id=team_id,
name=payload.name,
type=payload.type,
description=payload.description,
url=payload.url,
products=payload.products,
enabled=payload.enabled if is_origin else True,
is_public=payload.is_public if is_origin else None,
)
plugin.origin_id = plugin.id if payload.origin_id is None else payload.origin_id
plugin.save()

process_collection_uids(plugin, payload.collection_uids)
return plugin


def edit_plugin(plugin: Plugin, payload: PluginSchema) -> None:
plugin.name = payload.name
plugin.description = payload.description
plugin.products = payload.products
plugin.enabled = payload.enabled
plugin.is_public = payload.is_public
plugin.save()

process_collection_uids(plugin, payload.collection_uids)


def get_author(plugin: Plugin) -> str:
return plugin.team.name if plugin.origin is None else plugin.origin.team.name


def is_valid_url(url):
validator = URLValidator()
try:
validator(url)
return True
except ValidationError as e:
logger.warning(f"Received ValidationError: {e}")
return False
Loading