1
0
mirror of https://github.com/etesync/server synced 2024-11-22 00:38: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:
Tom Hacohen 2022-05-16 22:02:02 +03:00 committed by GitHub
commit c7d1de31a1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
92 changed files with 87 additions and 56 deletions

4
.gitignore vendored
View File

@ -14,3 +14,7 @@ __pycache__
/etebase_server_settings.py /etebase_server_settings.py
/secret.txt /secret.txt
/build
/dist
/*.egg-info

View File

@ -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

View File

@ -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()

View File

@ -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"

View File

@ -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",

View File

@ -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=[

View File

@ -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=[

View File

@ -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):

View File

@ -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"

View File

@ -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):

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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")

View File

@ -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:

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -2,4 +2,5 @@ from django.apps import AppConfig
class MyauthConfig(AppConfig): class MyauthConfig(AppConfig):
name = "myauth" name = "etebase_server.myauth"
label = "myauth"

View File

@ -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()

View File

@ -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",
), ),
), ),

View File

@ -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",
), ),
), ),

View File

@ -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"

View File

@ -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
View 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/*'],
}
)