mirror of
https://github.com/creyD/creyPY.git
synced 2026-04-12 19:30:30 +02:00
Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
da66e116c3 | ||
| c09df1341f | |||
| 88000f9cf4 | |||
| 92a33489ac | |||
| 9da4cbcb8e | |||
| 52307f6028 | |||
| 8019b566f2 | |||
| 83726f517c | |||
| abe84bcfcb | |||
|
|
2d6de99585 | ||
|
|
573f59349f | ||
|
|
32bf089456 | ||
|
|
d75fede3d1 | ||
|
|
f8b781b3e7 | ||
|
|
93c7f6f6cb |
@@ -5,7 +5,9 @@ from sqlalchemy.orm import sessionmaker
|
||||
|
||||
from .common import SQLALCHEMY_DATABASE_URL, name
|
||||
|
||||
async_engine = create_async_engine(SQLALCHEMY_DATABASE_URL + name, pool_pre_ping=True)
|
||||
async_engine = create_async_engine(
|
||||
SQLALCHEMY_DATABASE_URL + name, pool_pre_ping=True, connect_args={"sslmode": "require"}
|
||||
)
|
||||
|
||||
AsyncSessionLocal = sessionmaker(
|
||||
bind=async_engine,
|
||||
|
||||
@@ -6,7 +6,9 @@ from sqlalchemy.orm.session import Session
|
||||
|
||||
from .common import SQLALCHEMY_DATABASE_URL, name
|
||||
|
||||
engine = create_engine(SQLALCHEMY_DATABASE_URL + name, pool_pre_ping=True)
|
||||
engine = create_engine(
|
||||
SQLALCHEMY_DATABASE_URL + name, pool_pre_ping=True, connect_args={"sslmode": "require"}
|
||||
)
|
||||
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
|
||||
from sqlalchemy import Column, DateTime, String
|
||||
from sqlalchemy.dialects.postgresql import UUID
|
||||
@@ -14,15 +13,30 @@ class Base:
|
||||
# Primary key as uuid
|
||||
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
||||
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
||||
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
||||
updated_at = Column(
|
||||
DateTime(timezone=True),
|
||||
server_default=func.now(),
|
||||
onupdate=func.now(),
|
||||
)
|
||||
created_by_id = Column(String)
|
||||
|
||||
__name__: str
|
||||
|
||||
# TODO: Add default representation string
|
||||
# TODO: Add automated foreign key resolution
|
||||
|
||||
# Generate __tablename__ automatically
|
||||
@declared_attr
|
||||
def __tablename__(cls) -> str:
|
||||
return cls.__name__.lower()
|
||||
|
||||
def __str__(self) -> str:
|
||||
# if the object has a name, title or similar attribute, return it
|
||||
if hasattr(self, "name"):
|
||||
return str(self.name) # type: ignore
|
||||
|
||||
# if the object has a title attribute, return it
|
||||
if hasattr(self, "title"):
|
||||
return str(self.title) # type: ignore
|
||||
|
||||
# otherwise return the object's id
|
||||
return str(self.id)
|
||||
|
||||
@@ -41,7 +41,7 @@ class GenericClient(TestClient):
|
||||
re = self.c.post(
|
||||
url,
|
||||
files={"file": file},
|
||||
headers=self.default_headers | {"Content-Type": "application/json"},
|
||||
headers=self.default_headers,
|
||||
*args,
|
||||
**kwargs,
|
||||
)
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
import json
|
||||
from httpx import AsyncClient, ASGITransport
|
||||
|
||||
from httpx import ASGITransport, AsyncClient
|
||||
|
||||
|
||||
class AsyncGenericClient:
|
||||
def __init__(self, app):
|
||||
def __init__(self, app, headers={}):
|
||||
self.c = AsyncClient(
|
||||
transport=ASGITransport(app=app), base_url="http://testserver", follow_redirects=True
|
||||
)
|
||||
self.default_headers = {}
|
||||
self.default_headers = headers
|
||||
|
||||
async def get(self, url: str, r_code: int = 200, parse_json=True):
|
||||
re = await self.c.get(url, headers=self.default_headers)
|
||||
@@ -35,7 +36,8 @@ class AsyncGenericClient:
|
||||
)
|
||||
if re.status_code != r_code:
|
||||
print(re.content)
|
||||
assert r_code == re.status_code
|
||||
if not raw_response:
|
||||
assert r_code == re.status_code
|
||||
return re.json() if not raw_response else re
|
||||
|
||||
async def post_file(
|
||||
@@ -44,7 +46,7 @@ class AsyncGenericClient:
|
||||
re = await self.c.post(
|
||||
url,
|
||||
files={"file": file},
|
||||
headers=self.default_headers | {"Content-Type": "application/json"},
|
||||
headers=self.default_headers,
|
||||
*args,
|
||||
**kwargs,
|
||||
)
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
from .auth0 import * # noqa
|
||||
from .stripe import * # noqa
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
from .exceptions import * # noqa
|
||||
from .manage import * # noqa
|
||||
from .testing import * # noqa
|
||||
from .utils import * # noqa
|
||||
|
||||
93
creyPY/services/auth0/testing.py
Normal file
93
creyPY/services/auth0/testing.py
Normal file
@@ -0,0 +1,93 @@
|
||||
USER_OBJ = {
|
||||
"auth0|testing": {
|
||||
"created_at": "2023-08-15T13:25:31.507Z",
|
||||
"email": "test@test.org",
|
||||
"email_verified": True,
|
||||
"identities": [
|
||||
{
|
||||
"connection": "Username-Password-Authentication",
|
||||
"provider": "auth0",
|
||||
"user_id": "testing",
|
||||
"isSocial": False,
|
||||
}
|
||||
],
|
||||
"name": "Test Tester",
|
||||
"nickname": "testing",
|
||||
"picture": "https://avatars.githubusercontent.com/u/15138480?v=4",
|
||||
"updated_at": "2024-01-17T12:36:37.300Z",
|
||||
"user_id": "auth0|testing",
|
||||
"user_metadata": {},
|
||||
"last_password_reset": "2024-01-17T11:42:08.761Z",
|
||||
"last_ip": "127.0.0.1",
|
||||
"last_login": "2024-01-17T11:43:09.620Z",
|
||||
"logins_count": 1,
|
||||
},
|
||||
"auth0|new_user": {
|
||||
"created_at": "2023-08-15T13:25:31.507Z",
|
||||
"email": "test2@test.org",
|
||||
"email_verified": True,
|
||||
"identities": [
|
||||
{
|
||||
"connection": "Username-Password-Authentication",
|
||||
"provider": "auth0",
|
||||
"user_id": "testing",
|
||||
"isSocial": False,
|
||||
}
|
||||
],
|
||||
"name": "Test Tester 2",
|
||||
"nickname": "testing 2",
|
||||
"picture": "https://avatars.githubusercontent.com/u/15138481?v=4",
|
||||
"updated_at": "2024-01-17T12:36:37.303Z",
|
||||
"user_id": "auth0|new_user",
|
||||
"user_metadata": {},
|
||||
"last_password_reset": "2024-01-17T11:42:08.759Z",
|
||||
"last_ip": "127.0.0.1",
|
||||
"last_login": "2024-01-17T11:43:09.618Z",
|
||||
"logins_count": 1,
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
def get_user_auth0(sub, *args, **kwargs) -> dict:
|
||||
return USER_OBJ[sub]
|
||||
|
||||
|
||||
def patch_user_auth0(input_obj: dict, sub, *args, **kwargs) -> dict:
|
||||
USER_OBJ[sub].update(input_obj)
|
||||
return get_user_auth0(sub)
|
||||
|
||||
|
||||
def get_user_auth0_metadata(sub, *args, **kwargs) -> dict:
|
||||
return USER_OBJ[sub]["user_metadata"]
|
||||
|
||||
|
||||
def check_company_auth0(*args, **kwargs) -> bool:
|
||||
return True
|
||||
|
||||
|
||||
def auth0_sub_to_profile(sub: str) -> dict:
|
||||
return {
|
||||
"email": USER_OBJ[sub]["email"],
|
||||
"name": USER_OBJ[sub]["name"],
|
||||
"picture": USER_OBJ[sub]["picture"],
|
||||
"company_ids": USER_OBJ[sub]["user_metadata"]["company_ids"],
|
||||
}
|
||||
|
||||
|
||||
def auth0_sub_to_public(sub: str) -> dict:
|
||||
return {
|
||||
"email": USER_OBJ[sub]["email"],
|
||||
"name": USER_OBJ[sub]["name"],
|
||||
"picture": USER_OBJ[sub]["picture"],
|
||||
}
|
||||
|
||||
|
||||
def patch_user_auth0_metadata(input_obj: dict, sub, *args, **kwargs) -> dict:
|
||||
USER_OBJ[sub]["user_metadata"].update(input_obj)
|
||||
return get_user_auth0_metadata(sub)
|
||||
|
||||
|
||||
def set_company_id(sub: str, company_id: str):
|
||||
if sub not in USER_OBJ:
|
||||
USER_OBJ[sub] = {}
|
||||
USER_OBJ[sub]["user_metadata"] = {"company_ids": [company_id]}
|
||||
1
creyPY/services/stripe/__init__.py
Normal file
1
creyPY/services/stripe/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from .testing import * # noqa
|
||||
23
creyPY/services/stripe/testing.py
Normal file
23
creyPY/services/stripe/testing.py
Normal file
@@ -0,0 +1,23 @@
|
||||
class ItemReturn:
|
||||
quantity = 1
|
||||
|
||||
|
||||
class SubscriptionItem:
|
||||
def retrieve(self, id: str = ""):
|
||||
return ItemReturn
|
||||
|
||||
def modify(self, id: str, quantity: int):
|
||||
return ItemReturn
|
||||
|
||||
|
||||
class StripeAPI:
|
||||
def __init__(self, key: str):
|
||||
pass
|
||||
|
||||
@property
|
||||
def SubscriptionItem(self):
|
||||
return SubscriptionItem
|
||||
|
||||
|
||||
def get_stripe_api():
|
||||
return StripeAPI("test")
|
||||
11
creyPY/services/stripe/utils.py
Normal file
11
creyPY/services/stripe/utils.py
Normal file
@@ -0,0 +1,11 @@
|
||||
import os
|
||||
|
||||
import stripe
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv()
|
||||
|
||||
|
||||
def get_stripe_api():
|
||||
stripe.api_key = os.getenv("STRIPE_API_KEY", "")
|
||||
return stripe
|
||||
1
requirements.stripe.txt
Normal file
1
requirements.stripe.txt
Normal file
@@ -0,0 +1 @@
|
||||
stripe==10.12.0 # Stripe
|
||||
8
setup.py
8
setup.py
@@ -14,6 +14,9 @@ with open("requirements.pg.txt") as f:
|
||||
with open("requirements.auth0.txt") as f:
|
||||
auth0_requirements = f.read().splitlines()
|
||||
|
||||
with open("requirements.stripe.txt") as f:
|
||||
stripe_requirements = f.read().splitlines()
|
||||
|
||||
|
||||
def get_latest_git_tag() -> str:
|
||||
try:
|
||||
@@ -36,7 +39,7 @@ setup(
|
||||
long_description=open("README.md").read(),
|
||||
long_description_content_type="text/markdown",
|
||||
author="Conrad Großer",
|
||||
author_email="conrad@noah.tech",
|
||||
author_email="code@grosser.group",
|
||||
packages=find_packages(),
|
||||
url="https://github.com/creyD/creyPY",
|
||||
license="MIT",
|
||||
@@ -46,7 +49,8 @@ setup(
|
||||
"build": build_requirements,
|
||||
"postgres": pg_requirements,
|
||||
"auth0": auth0_requirements,
|
||||
"all": build_requirements + pg_requirements + auth0_requirements,
|
||||
"stripe": stripe_requirements,
|
||||
"all": build_requirements + pg_requirements + auth0_requirements + stripe_requirements,
|
||||
},
|
||||
keywords=[
|
||||
"creyPY",
|
||||
|
||||
Reference in New Issue
Block a user