diff --git a/api/migrations/0001_initial.py b/api/migrations/0001_initial.py
deleted file mode 100644
index 4297bfd..0000000
--- a/api/migrations/0001_initial.py
+++ /dev/null
@@ -1,108 +0,0 @@
-# Generated by Django 4.2.6 on 2023-10-26 18:34
-
-from django.db import migrations, models
-import django.db.models.deletion
-
-
-class Migration(migrations.Migration):
-
- initial = True
-
- dependencies = [
- ]
-
- operations = [
- migrations.CreateModel(
- name='SDECategory',
- fields=[
- ('id', models.IntegerField(primary_key=True, serialize=False)),
- ('name', models.CharField()),
- ('published', models.BooleanField()),
- ],
- ),
- migrations.CreateModel(
- name='SDEGroup',
- fields=[
- ('id', models.IntegerField(primary_key=True, serialize=False)),
- ('name', models.CharField()),
- ('published', models.BooleanField()),
- ('useBasePrice', models.BooleanField()),
- ('fittableNonSingleton', models.BooleanField()),
- ('anchored', models.BooleanField()),
- ('anchorable', models.BooleanField()),
- ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='groups', to='api.sdecategory')),
- ],
- ),
- migrations.CreateModel(
- name='SDEIcon',
- fields=[
- ('id', models.IntegerField(primary_key=True, serialize=False)),
- ('iconFile', models.CharField()),
- ('description', models.CharField()),
- ],
- ),
- migrations.CreateModel(
- name='SDEMarektGroup',
- fields=[
- ('id', models.IntegerField(primary_key=True, serialize=False)),
- ('name', models.CharField()),
- ('description', models.CharField(default='')),
- ('hasTypes', models.BooleanField()),
- ('icon', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='api.sdeicon')),
- ('parent_marketgroup', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='child_marketgroups', to='api.sdemarektgroup')),
- ],
- ),
- migrations.CreateModel(
- name='SDEMetaGroup',
- fields=[
- ('id', models.IntegerField(primary_key=True, serialize=False)),
- ('name', models.CharField()),
- ('iconSuffix', models.CharField()),
- ('icon', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='metagroups', to='api.sdeicon')),
- ],
- ),
- migrations.CreateModel(
- name='SDEType',
- fields=[
- ('id', models.IntegerField(primary_key=True, serialize=False)),
- ('name', models.CharField()),
- ('description', models.CharField()),
- ('published', models.BooleanField()),
- ('basePrice', models.FloatField()),
- ('volume', models.FloatField()),
- ('portionSize', models.IntegerField()),
- ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='types', to='api.sdegroup')),
- ('icon', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='types', to='api.sdeicon')),
- ('marketgroup', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='types', to='api.sdemarektgroup')),
- ],
- ),
- migrations.CreateModel(
- name='SDETypeMaterial',
- fields=[
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
- ('quantity', models.IntegerField()),
- ('material_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='typematerials_of', to='api.sdetype')),
- ('type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='typematerials', to='api.sdetype')),
- ],
- ),
- migrations.AddField(
- model_name='sdetype',
- name='materials',
- field=models.ManyToManyField(related_name='material_of', through='api.SDETypeMaterial', to='api.sdetype'),
- ),
- migrations.AddField(
- model_name='sdetype',
- name='metagroup',
- field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='types', to='api.sdemetagroup'),
- ),
- migrations.AddField(
- model_name='sdegroup',
- name='icon',
- field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='groups', to='api.sdeicon'),
- ),
- migrations.AddField(
- model_name='sdecategory',
- name='icon',
- field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='categories', to='api.sdeicon'),
- ),
- ]
diff --git a/api/models.py b/api/models.py
index fa6a91e..d60611a 100644
--- a/api/models.py
+++ b/api/models.py
@@ -1,4 +1,2 @@
-from django.db import models
-from .models_esi import *
-from .models_sde import *
+# models
\ No newline at end of file
diff --git a/api/models_esi.py b/api/models_esi.py
deleted file mode 100644
index beeb308..0000000
--- a/api/models_esi.py
+++ /dev/null
@@ -1,2 +0,0 @@
-from django.db import models
-
diff --git a/api/templates/redoc.html b/api/templates/redoc.html
new file mode 100644
index 0000000..c02bbf9
--- /dev/null
+++ b/api/templates/redoc.html
@@ -0,0 +1,21 @@
+
+
+
+ ReDoc
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/api/templates/swagger-ui.html b/api/templates/swagger-ui.html
new file mode 100644
index 0000000..2977649
--- /dev/null
+++ b/api/templates/swagger-ui.html
@@ -0,0 +1,28 @@
+
+
+
+ Swagger
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/api/urls.py b/api/urls.py
new file mode 100644
index 0000000..c8711f0
--- /dev/null
+++ b/api/urls.py
@@ -0,0 +1,7 @@
+from . import views
+from django.urls import include, path
+from rest_framework import routers
+
+router = routers.DefaultRouter()
+router.register(r'users', views.UserViewSet)
+router.register(r'groups', views.GroupViewSet)
diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml
index 90c594f..54b52c5 100644
--- a/docker-compose.dev.yml
+++ b/docker-compose.dev.yml
@@ -11,6 +11,7 @@ services:
volumes:
- ./mabras:/app/mabras
- ./api:/app/api
+ - ./sde:/app/sde
- ./manage.py:/app/manage.py
command: sh -c "python manage.py makemigrations && python manage.py migrate"
depends_on:
@@ -27,8 +28,9 @@ services:
volumes:
- ./mabras:/app/mabras
- ./api:/app/api
+ - ./sde:/app/sde
- ./manage.py:/app/manage.py
- - ./static_eve:/app/static_eve
+# - ./static_eve:/app/static_eve
command: ["uvicorn", "mabras.asgi:application", "--host", "0.0.0.0", "--port", "8000", "--reload"]
depends_on:
redis:
diff --git a/mabras/settings.py b/mabras/settings.py
index 81b72fd..4437214 100644
--- a/mabras/settings.py
+++ b/mabras/settings.py
@@ -44,6 +44,7 @@ REST_FRAMEWORK = {
INSTALLED_APPS = [
'api',
+ 'sde',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
diff --git a/mabras/urls.py b/mabras/urls.py
index 38db0c3..e89d4e4 100644
--- a/mabras/urls.py
+++ b/mabras/urls.py
@@ -14,25 +14,30 @@ Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
-from django.contrib import admin
from django.urls import include, path
from rest_framework import routers
-from api import views, views_sde
-
-router = routers.DefaultRouter()
-router.register(r'users', views.UserViewSet)
-router.register(r'groups', views.GroupViewSet)
-router.register(r'sde/icons', views_sde.SDEIconViewSet)
-router.register(r'sde/categories', views_sde.SDECategoryViewSet)
-router.register(r'sde/groups', views_sde.SDEGroupViewSet)
-router.register(r'sde/marketgroups', views_sde.SDEMarketGroupViewSet)
-router.register(r'sde/metagroups', views_sde.SDEMetaGroupViewSet)
-router.register(r'sde/types', views_sde.SDETypeViewSet)
-router.register(r'sde/typematerials', views_sde.SDETypeMaterialViewSet)
+from rest_framework.schemas import get_schema_view
+from django.views.generic import TemplateView
+from sde.urls import router as sde_router
+from api.urls import router as api_router
# Wire up our API using automatic URL routing.
# Additionally, we include login URLs for the browsable API.
urlpatterns = [
- path('', include(router.urls)),
- path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
-]
\ No newline at end of file
+ path('', include(api_router.urls)),
+ path('sde/', include(sde_router.urls)),
+ path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
+ path('openapi/', get_schema_view(
+ title="Mabras",
+ description="API for EvEal",
+ version="0.0.9"
+ ), name='openapi-schema'),
+ path('swagger-ui/', TemplateView.as_view(
+ template_name='swagger-ui.html',
+ extra_context={'schema_url': 'openapi-schema'}
+ ), name='swagger-ui'),
+ path('redoc/', TemplateView.as_view(
+ template_name='redoc.html',
+ extra_context={'schema_url': 'openapi-schema'}
+ ), name='redoc'),
+]
diff --git a/requirements.txt b/requirements.txt
index b87e5c7..97a7883 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -6,3 +6,5 @@ uvicorn[standard]
psycopg[binary]
redis
esy
+pyyaml
+uritemplate
diff --git a/api/management/__init__.py b/sde/__init__.py
similarity index 100%
rename from api/management/__init__.py
rename to sde/__init__.py
diff --git a/sde/apps.py b/sde/apps.py
new file mode 100644
index 0000000..7ab8d8d
--- /dev/null
+++ b/sde/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class SdeConfig(AppConfig):
+ default_auto_field = 'django.db.models.BigAutoField'
+ name = 'sde'
diff --git a/api/management/commands/__init__.py b/sde/management/__init__.py
similarity index 100%
rename from api/management/commands/__init__.py
rename to sde/management/__init__.py
diff --git a/sde/management/commands/__init__.py b/sde/management/commands/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/api/management/commands/import_sde.py b/sde/management/commands/import_sde.py
similarity index 99%
rename from api/management/commands/import_sde.py
rename to sde/management/commands/import_sde.py
index 1fecf3b..1582bb2 100644
--- a/api/management/commands/import_sde.py
+++ b/sde/management/commands/import_sde.py
@@ -1,5 +1,5 @@
from django.core.management.base import BaseCommand, CommandError
-from api.models import *
+from sde.models import *
import yaml
class Command(BaseCommand):
diff --git a/sde/migrations/__init__.py b/sde/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/api/models_sde.py b/sde/models.py
similarity index 100%
rename from api/models_sde.py
rename to sde/models.py
diff --git a/api/serializers_sde.py b/sde/serializers.py
similarity index 66%
rename from api/serializers_sde.py
rename to sde/serializers.py
index cef88e0..d0563b7 100644
--- a/api/serializers_sde.py
+++ b/sde/serializers.py
@@ -1,52 +1,54 @@
-from api.models_sde import *
+from sde.models import *
from rest_framework import serializers
-class SDEIconSerializer(serializers.HyperlinkedModelSerializer):
+class SDEIconSerializer(serializers.ModelSerializer):
class Meta:
model = SDEIcon
# fields = ['id', 'iconFile', 'description']
fields = "__all__"
-class SDECategorySerializer(serializers.HyperlinkedModelSerializer):
+class SDECategorySerializer(serializers.ModelSerializer):
class Meta:
model = SDECategory
# fields = ['id', 'icon', 'name', 'published']
fields = "__all__"
-class SDEGroupSerializer(serializers.HyperlinkedModelSerializer):
+class SDEGroupSerializer(serializers.ModelSerializer):
class Meta:
model = SDEGroup
# fields = ['id', 'category', 'name', 'published', 'useBasePrice', 'fittableNonSingleton', 'anchored', 'anchorable', 'icon']
fields = "__all__"
-class SDEMarektGroupSerializer(serializers.HyperlinkedModelSerializer):
+class SDEMarektGroupSerializer(serializers.ModelSerializer):
class Meta:
model = SDEMarektGroup
# fields = ['id', 'icon', 'name', 'description', 'hasTypes', 'parent_marketgroup']
fields = "__all__"
-class SDEMetaGroupSerializer(serializers.HyperlinkedModelSerializer):
+class SDEMetaGroupSerializer(serializers.ModelSerializer):
class Meta:
model = SDEMetaGroup
# fields = ['id', 'icon', 'name', 'iconSuffix']
fields = "__all__"
-class SDETypeSerializer(serializers.HyperlinkedModelSerializer):
+class SDETypeMaterialSerializer(serializers.ModelSerializer):
+ class Meta:
+ model = SDETypeMaterial
+ # fields = ['type', 'material', 'quantity']
+ # fields = "__all__"
+ exclude = ['id', 'type']
+
+
+class SDETypeSerializer(serializers.ModelSerializer):
+ typematerials = SDETypeMaterialSerializer(many=True, read_only=True)
class Meta:
model = SDEType
# fields = ['id', 'group', 'marketgroup', 'metagroup', 'name', 'description', 'published', 'basePrice', 'icon', 'volume', 'portionSize', 'materials']
fields = "__all__"
-
-class SDETypeMaterialSerializer(serializers.HyperlinkedModelSerializer):
- class Meta:
- model = SDETypeMaterial
- # fields = ['type', 'material', 'quantity']
- fields = "__all__"
-
diff --git a/sde/urls.py b/sde/urls.py
new file mode 100644
index 0000000..905d28b
--- /dev/null
+++ b/sde/urls.py
@@ -0,0 +1,12 @@
+from . import views
+from django.urls import include, path
+from rest_framework import routers
+
+router = routers.DefaultRouter()
+router.register(r'icons', views.SDEIconViewSet)
+router.register(r'categories', views.SDECategoryViewSet)
+router.register(r'groups', views.SDEGroupViewSet)
+router.register(r'marketgroups', views.SDEMarketGroupViewSet)
+router.register(r'metagroups', views.SDEMetaGroupViewSet)
+router.register(r'types', views.SDETypeViewSet)
+router.register(r'typematerials', views.SDETypeMaterialViewSet)
diff --git a/api/views_sde.py b/sde/views.py
similarity index 71%
rename from api/views_sde.py
rename to sde/views.py
index 64654e7..e831353 100644
--- a/api/views_sde.py
+++ b/sde/views.py
@@ -1,45 +1,44 @@
-from api.models_sde import *
-from api.serializers_sde import *
+from sde.serializers import *
from rest_framework import viewsets
-class SDEIconViewSet(viewsets.ModelViewSet):
+class SDEIconViewSet(viewsets.ReadOnlyModelViewSet):
queryset = SDEIcon.objects.all()
serializer_class = SDEIconSerializer
# permission_classes = [permissions.IsAuthenticated]
-class SDECategoryViewSet(viewsets.ModelViewSet):
+class SDECategoryViewSet(viewsets.ReadOnlyModelViewSet):
queryset = SDECategory.objects.all()
serializer_class = SDECategorySerializer
# permission_classes = [permissions.IsAuthenticated]
-class SDEGroupViewSet(viewsets.ModelViewSet):
+class SDEGroupViewSet(viewsets.ReadOnlyModelViewSet):
queryset = SDEGroup.objects.all()
serializer_class = SDEGroupSerializer
# permission_classes = [permissions.IsAuthenticated]
-class SDEMarketGroupViewSet(viewsets.ModelViewSet):
+class SDEMarketGroupViewSet(viewsets.ReadOnlyModelViewSet):
queryset = SDEMarektGroup.objects.all()
serializer_class = SDEMarektGroupSerializer
# permission_classes = [permissions.IsAuthenticated]
-class SDEMetaGroupViewSet(viewsets.ModelViewSet):
+class SDEMetaGroupViewSet(viewsets.ReadOnlyModelViewSet):
queryset = SDEMetaGroup.objects.all()
serializer_class = SDEMetaGroupSerializer
# permission_classes = [permissions.IsAuthenticated]
-class SDETypeViewSet(viewsets.ModelViewSet):
+class SDETypeViewSet(viewsets.ReadOnlyModelViewSet):
queryset = SDEType.objects.all()
serializer_class = SDETypeSerializer
# permission_classes = [permissions.IsAuthenticated]
-class SDETypeMaterialViewSet(viewsets.ModelViewSet):
+class SDETypeMaterialViewSet(viewsets.ReadOnlyModelViewSet):
queryset = SDETypeMaterial.objects.all()
serializer_class = SDETypeMaterialSerializer
# permission_classes = [permissions.IsAuthenticated]