mirror of
https://github.com/etesync/server
synced 2024-11-22 08:48:07 +00:00
Merge: Create python package #140
This is quite a big one, so it probably makes sense to review it commit-by-commit (there shouldn't be any overlap). Summarized: - The `etebase_fastapi` module was moved to `etebase_server.fastapi` - The `myauth` module was moved to `etebase_server.myauth` - The `django_etebase` module was moved to `etebase_server.django` - The `templates/` directory was moved into `etebase_server/` - A `setup.py` was added to allow packaging the `etebase_server` module as a python package.
This commit is contained in:
commit
c7d1de31a1
4
.gitignore
vendored
4
.gitignore
vendored
@ -14,3 +14,7 @@ __pycache__
|
|||||||
|
|
||||||
/etebase_server_settings.py
|
/etebase_server_settings.py
|
||||||
/secret.txt
|
/secret.txt
|
||||||
|
|
||||||
|
/build
|
||||||
|
/dist
|
||||||
|
/*.egg-info
|
||||||
|
@ -151,7 +151,7 @@ Instead of having to create Django users manually when signup up Etebase users,
|
|||||||
For example, this makes sense when putting an Etebase server in production.
|
For example, this makes sense when putting an Etebase server in production.
|
||||||
However, this does come with the added risk that everybody with access to your server will be able to sign up.
|
However, this does come with the added risk that everybody with access to your server will be able to sign up.
|
||||||
|
|
||||||
In order to set it up, comment out the line `ETEBASE_CREATE_USER_FUNC = "django_etebase.utils.create_user_blocked"` in `server/settings.py` and restart your Etebase server.
|
In order to set it up, comment out the line `ETEBASE_CREATE_USER_FUNC = "etebase_server.django.utils.create_user_blocked"` in `server/settings.py` and restart your Etebase server.
|
||||||
|
|
||||||
# License
|
# License
|
||||||
|
|
||||||
|
@ -7,7 +7,7 @@ django_application = get_asgi_application()
|
|||||||
|
|
||||||
|
|
||||||
def create_application():
|
def create_application():
|
||||||
from etebase_fastapi.main import create_application
|
from etebase_server.fastapi.main import create_application
|
||||||
|
|
||||||
app = create_application()
|
app = create_application()
|
||||||
|
|
||||||
|
@ -2,4 +2,5 @@ from django.apps import AppConfig
|
|||||||
|
|
||||||
|
|
||||||
class DjangoEtebaseConfig(AppConfig):
|
class DjangoEtebaseConfig(AppConfig):
|
||||||
name = "django_etebase"
|
name = "etebase_server.django"
|
||||||
|
label = "django_etebase"
|
@ -4,7 +4,7 @@ from django.conf import settings
|
|||||||
import django.core.validators
|
import django.core.validators
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import django.db.models.deletion
|
import django.db.models.deletion
|
||||||
import django_etebase.models
|
from etebase_server.django.models import chunk_directory_path
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
@ -85,7 +85,7 @@ class Migration(migrations.Migration):
|
|||||||
),
|
),
|
||||||
(
|
(
|
||||||
"chunkFile",
|
"chunkFile",
|
||||||
models.FileField(max_length=150, unique=True, upload_to=django_etebase.models.chunk_directory_path),
|
models.FileField(max_length=150, unique=True, upload_to=chunk_directory_path),
|
||||||
),
|
),
|
||||||
(
|
(
|
||||||
"item",
|
"item",
|
@ -3,7 +3,7 @@
|
|||||||
import django.core.validators
|
import django.core.validators
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import django.db.models.deletion
|
import django.db.models.deletion
|
||||||
import django_etebase.models
|
from etebase_server.django.models import generate_stoken_uid
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
@ -21,7 +21,7 @@ class Migration(migrations.Migration):
|
|||||||
"uid",
|
"uid",
|
||||||
models.CharField(
|
models.CharField(
|
||||||
db_index=True,
|
db_index=True,
|
||||||
default=django_etebase.models.generate_stoken_uid,
|
default=generate_stoken_uid,
|
||||||
max_length=43,
|
max_length=43,
|
||||||
unique=True,
|
unique=True,
|
||||||
validators=[
|
validators=[
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
import django.core.validators
|
import django.core.validators
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import django_etebase.models
|
from etebase_server.django.models import generate_stoken_uid
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
@ -62,7 +62,7 @@ class Migration(migrations.Migration):
|
|||||||
name="uid",
|
name="uid",
|
||||||
field=models.CharField(
|
field=models.CharField(
|
||||||
db_index=True,
|
db_index=True,
|
||||||
default=django_etebase.models.generate_stoken_uid,
|
default=generate_stoken_uid,
|
||||||
max_length=43,
|
max_length=43,
|
||||||
unique=True,
|
unique=True,
|
||||||
validators=[
|
validators=[
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
from django.db import migrations
|
from django.db import migrations
|
||||||
|
|
||||||
from django_etebase.models import AccessLevels
|
from etebase_server.django.models import AccessLevels
|
||||||
|
|
||||||
|
|
||||||
def change_access_level_to_int(apps, schema_editor):
|
def change_access_level_to_int(apps, schema_editor):
|
@ -2,4 +2,4 @@ from django.apps import AppConfig
|
|||||||
|
|
||||||
|
|
||||||
class TokenAuthConfig(AppConfig):
|
class TokenAuthConfig(AppConfig):
|
||||||
name = "django_etebase.token_auth"
|
name = "etebase_server.django.token_auth"
|
@ -3,7 +3,7 @@
|
|||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import django.db.models.deletion
|
import django.db.models.deletion
|
||||||
from django_etebase.token_auth import models as token_auth_models
|
from etebase_server.django.token_auth import models as token_auth_models
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
@ -1,7 +1,7 @@
|
|||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.utils.crypto import get_random_string
|
from django.utils.crypto import get_random_string
|
||||||
from myauth.models import get_typed_user_model
|
from etebase_server.myauth.models import get_typed_user_model
|
||||||
|
|
||||||
User = get_typed_user_model()
|
User = get_typed_user_model()
|
||||||
|
|
@ -3,7 +3,7 @@ from dataclasses import dataclass
|
|||||||
|
|
||||||
from django.db.models import QuerySet
|
from django.db.models import QuerySet
|
||||||
from django.core.exceptions import PermissionDenied
|
from django.core.exceptions import PermissionDenied
|
||||||
from myauth.models import UserType, get_typed_user_model
|
from etebase_server.myauth.models import UserType, get_typed_user_model
|
||||||
|
|
||||||
from . import app_settings
|
from . import app_settings
|
||||||
|
|
@ -6,9 +6,9 @@ from fastapi.security import APIKeyHeader
|
|||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.db.models import QuerySet
|
from django.db.models import QuerySet
|
||||||
|
|
||||||
from django_etebase import models
|
from etebase_server.django import models
|
||||||
from django_etebase.token_auth.models import AuthToken, get_default_expiry
|
from etebase_server.django.token_auth.models import AuthToken, get_default_expiry
|
||||||
from myauth.models import UserType, get_typed_user_model
|
from etebase_server.myauth.models import UserType, get_typed_user_model
|
||||||
from .exceptions import AuthenticationFailed
|
from .exceptions import AuthenticationFailed
|
||||||
from .utils import get_object_or_404
|
from .utils import get_object_or_404
|
||||||
from .db_hack import django_db_cleanup_decorator
|
from .db_hack import django_db_cleanup_decorator
|
@ -6,7 +6,7 @@ from fastapi.middleware.cors import CORSMiddleware
|
|||||||
from fastapi.middleware.trustedhost import TrustedHostMiddleware
|
from fastapi.middleware.trustedhost import TrustedHostMiddleware
|
||||||
from fastapi.staticfiles import StaticFiles
|
from fastapi.staticfiles import StaticFiles
|
||||||
|
|
||||||
from django_etebase import app_settings
|
from etebase_server.django import app_settings
|
||||||
|
|
||||||
from .exceptions import CustomHttpException
|
from .exceptions import CustomHttpException
|
||||||
from .msgpack import MsgpackResponse
|
from .msgpack import MsgpackResponse
|
||||||
@ -43,7 +43,7 @@ def create_application(prefix="", middlewares=[]):
|
|||||||
app.include_router(websocket_router, prefix=f"{BASE_PATH}/ws", tags=["websocket"])
|
app.include_router(websocket_router, prefix=f"{BASE_PATH}/ws", tags=["websocket"])
|
||||||
|
|
||||||
if settings.DEBUG:
|
if settings.DEBUG:
|
||||||
from etebase_fastapi.routers.test_reset_view import test_reset_view_router
|
from .routers.test_reset_view import test_reset_view_router
|
||||||
|
|
||||||
app.include_router(test_reset_view_router, prefix=f"{BASE_PATH}/test/authentication")
|
app.include_router(test_reset_view_router, prefix=f"{BASE_PATH}/test/authentication")
|
||||||
|
|
@ -1,7 +1,7 @@
|
|||||||
import typing as t
|
import typing as t
|
||||||
import aioredis
|
import aioredis
|
||||||
|
|
||||||
from django_etebase import app_settings
|
from etebase_server.django import app_settings
|
||||||
|
|
||||||
|
|
||||||
class RedisWrapper:
|
class RedisWrapper:
|
@ -14,12 +14,12 @@ from django.db import transaction
|
|||||||
from django.utils.functional import cached_property
|
from django.utils.functional import cached_property
|
||||||
from fastapi import APIRouter, Depends, status, Request
|
from fastapi import APIRouter, Depends, status, Request
|
||||||
|
|
||||||
from django_etebase import app_settings, models
|
from etebase_server.django import app_settings, models
|
||||||
from django_etebase.token_auth.models import AuthToken
|
from etebase_server.django.token_auth.models import AuthToken
|
||||||
from django_etebase.models import UserInfo
|
from etebase_server.django.models import UserInfo
|
||||||
from django_etebase.signals import user_signed_up
|
from etebase_server.django.signals import user_signed_up
|
||||||
from django_etebase.utils import create_user, get_user_queryset, CallbackContext
|
from etebase_server.django.utils import create_user, get_user_queryset, CallbackContext
|
||||||
from myauth.models import UserType, get_typed_user_model
|
from etebase_server.myauth.models import UserType, get_typed_user_model
|
||||||
from ..exceptions import AuthenticationFailed, transform_validation_error, HttpError
|
from ..exceptions import AuthenticationFailed, transform_validation_error, HttpError
|
||||||
from ..msgpack import MsgpackRoute
|
from ..msgpack import MsgpackRoute
|
||||||
from ..utils import BaseModel, permission_responses, msgpack_encode, msgpack_decode, get_user_username_email_kwargs
|
from ..utils import BaseModel, permission_responses, msgpack_encode, msgpack_decode, get_user_username_email_kwargs
|
@ -7,8 +7,8 @@ from django.db import transaction, IntegrityError
|
|||||||
from django.db.models import Q, QuerySet
|
from django.db.models import Q, QuerySet
|
||||||
from fastapi import APIRouter, Depends, status, Request, BackgroundTasks
|
from fastapi import APIRouter, Depends, status, Request, BackgroundTasks
|
||||||
|
|
||||||
from django_etebase import models
|
from etebase_server.django import models
|
||||||
from myauth.models import UserType
|
from etebase_server.myauth.models import UserType
|
||||||
from .authentication import get_authenticated_user
|
from .authentication import get_authenticated_user
|
||||||
from .websocket import get_ticket, TicketRequest, TicketOut
|
from .websocket import get_ticket, TicketRequest, TicketOut
|
||||||
from ..exceptions import HttpError, transform_validation_error, PermissionDenied, ValidationError
|
from ..exceptions import HttpError, transform_validation_error, PermissionDenied, ValidationError
|
@ -4,9 +4,9 @@ from django.db import transaction, IntegrityError
|
|||||||
from django.db.models import QuerySet
|
from django.db.models import QuerySet
|
||||||
from fastapi import APIRouter, Depends, status, Request
|
from fastapi import APIRouter, Depends, status, Request
|
||||||
|
|
||||||
from django_etebase import models
|
from etebase_server.django import models
|
||||||
from django_etebase.utils import get_user_queryset, CallbackContext
|
from etebase_server.django.utils import get_user_queryset, CallbackContext
|
||||||
from myauth.models import UserType, get_typed_user_model
|
from etebase_server.myauth.models import UserType, get_typed_user_model
|
||||||
from .authentication import get_authenticated_user
|
from .authentication import get_authenticated_user
|
||||||
from ..exceptions import HttpError, PermissionDenied
|
from ..exceptions import HttpError, PermissionDenied
|
||||||
from ..msgpack import MsgpackRoute
|
from ..msgpack import MsgpackRoute
|
@ -4,8 +4,8 @@ from django.db import transaction
|
|||||||
from django.db.models import QuerySet
|
from django.db.models import QuerySet
|
||||||
from fastapi import APIRouter, Depends, status
|
from fastapi import APIRouter, Depends, status
|
||||||
|
|
||||||
from django_etebase import models
|
from etebase_server.django import models
|
||||||
from myauth.models import UserType, get_typed_user_model
|
from etebase_server.myauth.models import UserType, get_typed_user_model
|
||||||
from .authentication import get_authenticated_user
|
from .authentication import get_authenticated_user
|
||||||
from ..msgpack import MsgpackRoute
|
from ..msgpack import MsgpackRoute
|
||||||
from ..utils import get_object_or_404, BaseModel, permission_responses, PERMISSIONS_READ, PERMISSIONS_READWRITE
|
from ..utils import get_object_or_404, BaseModel, permission_responses, PERMISSIONS_READ, PERMISSIONS_READWRITE
|
@ -3,11 +3,11 @@ from django.db import transaction
|
|||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
from fastapi import APIRouter, Request, status
|
from fastapi import APIRouter, Request, status
|
||||||
|
|
||||||
from django_etebase.utils import get_user_queryset, CallbackContext
|
from etebase_server.django.utils import get_user_queryset, CallbackContext
|
||||||
from .authentication import SignupIn, signup_save
|
from .authentication import SignupIn, signup_save
|
||||||
from ..msgpack import MsgpackRoute
|
from ..msgpack import MsgpackRoute
|
||||||
from ..exceptions import HttpError
|
from ..exceptions import HttpError
|
||||||
from myauth.models import get_typed_user_model
|
from etebase_server.myauth.models import get_typed_user_model
|
||||||
|
|
||||||
test_reset_view_router = APIRouter(route_class=MsgpackRoute, tags=["test helpers"])
|
test_reset_view_router = APIRouter(route_class=MsgpackRoute, tags=["test helpers"])
|
||||||
User = get_typed_user_model()
|
User = get_typed_user_model()
|
@ -8,9 +8,9 @@ from fastapi import APIRouter, Depends, WebSocket, WebSocketDisconnect, status
|
|||||||
import nacl.encoding
|
import nacl.encoding
|
||||||
import nacl.utils
|
import nacl.utils
|
||||||
|
|
||||||
from django_etebase import models
|
from etebase_server.django import models
|
||||||
from django_etebase.utils import CallbackContext, get_user_queryset
|
from etebase_server.django.utils import CallbackContext, get_user_queryset
|
||||||
from myauth.models import UserType, get_typed_user_model
|
from etebase_server.myauth.models import UserType, get_typed_user_model
|
||||||
|
|
||||||
from ..dependencies import get_collection_queryset, get_item_queryset
|
from ..dependencies import get_collection_queryset, get_item_queryset
|
||||||
from ..exceptions import NotSupported
|
from ..exceptions import NotSupported
|
@ -3,7 +3,7 @@ import typing as t
|
|||||||
from django.db.models import QuerySet
|
from django.db.models import QuerySet
|
||||||
from fastapi import status
|
from fastapi import status
|
||||||
|
|
||||||
from django_etebase.models import Stoken
|
from etebase_server.django.models import Stoken
|
||||||
|
|
||||||
from .exceptions import HttpError
|
from .exceptions import HttpError
|
||||||
|
|
@ -10,9 +10,9 @@ from pydantic import BaseModel as PyBaseModel
|
|||||||
from django.db.models import Model, QuerySet
|
from django.db.models import Model, QuerySet
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
|
|
||||||
from django_etebase import app_settings
|
from etebase_server.django import app_settings
|
||||||
from django_etebase.models import AccessLevels
|
from etebase_server.django.models import AccessLevels
|
||||||
from myauth.models import UserType, get_typed_user_model
|
from etebase_server.myauth.models import UserType, get_typed_user_model
|
||||||
|
|
||||||
from .exceptions import HttpError, HttpErrorOut
|
from .exceptions import HttpError, HttpErrorOut
|
||||||
|
|
@ -2,4 +2,5 @@ from django.apps import AppConfig
|
|||||||
|
|
||||||
|
|
||||||
class MyauthConfig(AppConfig):
|
class MyauthConfig(AppConfig):
|
||||||
name = "myauth"
|
name = "etebase_server.myauth"
|
||||||
|
label = "myauth"
|
@ -1,6 +1,6 @@
|
|||||||
from django import forms
|
from django import forms
|
||||||
from django.contrib.auth.forms import UsernameField
|
from django.contrib.auth.forms import UsernameField
|
||||||
from myauth.models import get_typed_user_model
|
from etebase_server.myauth.models import get_typed_user_model
|
||||||
|
|
||||||
User = get_typed_user_model()
|
User = get_typed_user_model()
|
||||||
|
|
@ -1,7 +1,7 @@
|
|||||||
# Generated by Django 3.0.3 on 2020-05-15 08:01
|
# Generated by Django 3.0.3 on 2020-05-15 08:01
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import myauth.models
|
import etebase_server.myauth.models as myauth_models
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
@ -19,7 +19,7 @@ class Migration(migrations.Migration):
|
|||||||
help_text="Required. 150 characters or fewer. Letters, digits and ./+/-/_ only.",
|
help_text="Required. 150 characters or fewer. Letters, digits and ./+/-/_ only.",
|
||||||
max_length=150,
|
max_length=150,
|
||||||
unique=True,
|
unique=True,
|
||||||
validators=[myauth.models.UnicodeUsernameValidator()],
|
validators=[myauth_models.UnicodeUsernameValidator()],
|
||||||
verbose_name="username",
|
verbose_name="username",
|
||||||
),
|
),
|
||||||
),
|
),
|
@ -1,7 +1,7 @@
|
|||||||
# Generated by Django 3.1.1 on 2020-11-19 08:10
|
# Generated by Django 3.1.1 on 2020-11-19 08:10
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import myauth.models
|
import etebase_server.myauth.models as myauth_models
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
@ -14,7 +14,7 @@ class Migration(migrations.Migration):
|
|||||||
migrations.AlterModelManagers(
|
migrations.AlterModelManagers(
|
||||||
name="user",
|
name="user",
|
||||||
managers=[
|
managers=[
|
||||||
("objects", myauth.models.UserManager()),
|
("objects", myauth_models.UserManager()),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.AlterField(
|
migrations.AlterField(
|
||||||
@ -30,7 +30,7 @@ class Migration(migrations.Migration):
|
|||||||
help_text="Required. 150 characters or fewer. Letters, digits and ./-/_ only.",
|
help_text="Required. 150 characters or fewer. Letters, digits and ./-/_ only.",
|
||||||
max_length=150,
|
max_length=150,
|
||||||
unique=True,
|
unique=True,
|
||||||
validators=[myauth.models.UnicodeUsernameValidator()],
|
validators=[myauth_models.UnicodeUsernameValidator()],
|
||||||
verbose_name="username",
|
verbose_name="username",
|
||||||
),
|
),
|
||||||
),
|
),
|
@ -15,7 +15,8 @@ import configparser
|
|||||||
from .utils import get_secret_from_file
|
from .utils import get_secret_from_file
|
||||||
|
|
||||||
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
||||||
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
SOURCE_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
BASE_DIR = os.path.dirname(SOURCE_DIR)
|
||||||
|
|
||||||
AUTH_USER_MODEL = "myauth.User"
|
AUTH_USER_MODEL = "myauth.User"
|
||||||
|
|
||||||
@ -54,9 +55,9 @@ INSTALLED_APPS = [
|
|||||||
"django.contrib.sessions",
|
"django.contrib.sessions",
|
||||||
"django.contrib.messages",
|
"django.contrib.messages",
|
||||||
"django.contrib.staticfiles",
|
"django.contrib.staticfiles",
|
||||||
"myauth.apps.MyauthConfig",
|
"etebase_server.myauth.apps.MyauthConfig",
|
||||||
"django_etebase.apps.DjangoEtebaseConfig",
|
"etebase_server.django.apps.DjangoEtebaseConfig",
|
||||||
"django_etebase.token_auth.apps.TokenAuthConfig",
|
"etebase_server.django.token_auth.apps.TokenAuthConfig",
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
@ -74,7 +75,7 @@ ROOT_URLCONF = "etebase_server.urls"
|
|||||||
TEMPLATES = [
|
TEMPLATES = [
|
||||||
{
|
{
|
||||||
"BACKEND": "django.template.backends.django.DjangoTemplates",
|
"BACKEND": "django.template.backends.django.DjangoTemplates",
|
||||||
"DIRS": [os.path.join(BASE_DIR, "templates")],
|
"DIRS": [os.path.join(SOURCE_DIR, "templates")],
|
||||||
"APP_DIRS": True,
|
"APP_DIRS": True,
|
||||||
"OPTIONS": {
|
"OPTIONS": {
|
||||||
"context_processors": [
|
"context_processors": [
|
||||||
@ -167,7 +168,7 @@ if any(os.path.isfile(x) for x in config_locations):
|
|||||||
if "database-options" in config:
|
if "database-options" in config:
|
||||||
DATABASES["default"]["OPTIONS"] = config["database-options"]
|
DATABASES["default"]["OPTIONS"] = config["database-options"]
|
||||||
|
|
||||||
ETEBASE_CREATE_USER_FUNC = "django_etebase.utils.create_user_blocked"
|
ETEBASE_CREATE_USER_FUNC = "etebase_server.django.utils.create_user_blocked"
|
||||||
|
|
||||||
# Efficient file streaming (for large files)
|
# Efficient file streaming (for large files)
|
||||||
SENDFILE_BACKEND = "etebase_fastapi.sendfile.backends.simple"
|
SENDFILE_BACKEND = "etebase_fastapi.sendfile.backends.simple"
|
||||||
|
@ -1,2 +1,6 @@
|
|||||||
[tool.black]
|
[tool.black]
|
||||||
line-length = 120
|
line-length = 120
|
||||||
|
|
||||||
|
[build-system]
|
||||||
|
requires = ["setuptools>=42"]
|
||||||
|
build-backend = "setuptools.build_meta"
|
||||||
|
20
setup.py
Normal file
20
setup.py
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
from setuptools import find_packages, setup
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name='etebase_server',
|
||||||
|
version='0.8.3',
|
||||||
|
description='An Etebase (EteSync 2.0) server',
|
||||||
|
url='https://www.etebase.com/',
|
||||||
|
classifiers=[
|
||||||
|
'Development Status :: 5 - Production/Stable',
|
||||||
|
'Framework :: Django',
|
||||||
|
'Framework :: FastAPI',
|
||||||
|
'Intended Audience :: System Administrators',
|
||||||
|
'License :: OSI Approved :: GNU Affero General Public License v3',
|
||||||
|
],
|
||||||
|
packages=find_packages(include=['etebase_server', 'etebase_server.*']),
|
||||||
|
install_requires=list(open('requirements.in/base.txt')),
|
||||||
|
package_data={
|
||||||
|
'etebase_server': ['templates/*'],
|
||||||
|
}
|
||||||
|
)
|
Loading…
Reference in New Issue
Block a user