From 07610f448c08a369eaf17bff12ec162e7015129e Mon Sep 17 00:00:00 2001 From: schroeder5 <s.schroeder@fz-juelich.de> Date: Fri, 29 May 2020 20:05:40 +0200 Subject: [PATCH] created ONE toardb app, also adapted pytests for toardb app (still very last test will throw an error for teardown; inserted example for url percent encoding --- production_tests.sh | 8 ++--- {auth_user => toardb}/__init__.py | 0 {auth_user => toardb/auth_user}/README.md | 0 {contacts => toardb/auth_user}/__init__.py | 0 {auth_user => toardb/auth_user}/auth_user.py | 0 .../auth_user}/fixtures/auth.json | 0 .../auth_user}/fixtures/authtoken.json | 0 {auth_user => toardb/auth_user}/models.py | 0 {auth_user => toardb/auth_user}/schemas.py | 0 {data => toardb/contacts}/__init__.py | 0 {contacts => toardb/contacts}/contacts.py | 23 +++++++------ {contacts => toardb/contacts}/crud.py | 0 .../contacts}/fixtures/organisations.json | 0 .../contacts}/fixtures/persons.json | 0 {contacts => toardb/contacts}/models.py | 0 .../contacts}/models_organisation.py | 0 .../contacts}/models_person.py | 0 {contacts => toardb/contacts}/schemas.py | 0 {contacts => toardb/contacts}/test_base.py | 5 +-- .../contacts}/test_contacts.py | 4 +-- {stationmeta => toardb/data}/__init__.py | 0 {data => toardb/data}/crud.py | 10 +++--- {data => toardb/data}/data.py | 12 +++---- {data => toardb/data}/models.py | 0 {data => toardb/data}/schemas.py | 0 .../stationmeta}/__init__.py | 0 {stationmeta => toardb/stationmeta}/crud.py | 0 .../fixtures/stationmeta_core.json | 0 {stationmeta => toardb/stationmeta}/models.py | 0 .../stationmeta}/models_annotation.py | 2 +- .../stationmeta}/models_aux.py | 0 .../stationmeta}/models_core.py | 2 +- .../stationmeta}/models_global.py | 0 .../stationmeta}/models_global_services.py | 0 .../stationmeta}/models_role.py | 2 +- .../stationmeta}/pydantic_toar_testing.py | 0 .../stationmeta}/schemas.py | 0 .../stationmeta}/stationmeta.py | 12 +++---- .../stationmeta}/test_base.py | 9 ++--- .../stationmeta}/test_stationmeta.py | 12 +++---- {utils => toardb/timeseries}/__init__.py | 0 {timeseries => toardb/timeseries}/crud.py | 1 - .../timeseries}/fixtures/timeseries.json | 0 {timeseries => toardb/timeseries}/models.py | 0 .../timeseries}/models_annotation.py | 2 +- .../timeseries}/models_core.py | 4 +-- .../timeseries}/models_programme.py | 0 .../timeseries}/models_role.py | 2 +- .../timeseries}/pydantic_toar_testing.py | 0 {timeseries => toardb/timeseries}/schemas.py | 0 .../timeseries}/test_base.py | 13 ++++---- .../timeseries}/test_timeseries.py | 22 ++++++------- .../timeseries}/timeseries.py | 15 +++++---- toardb/toardb.py | 33 +++++++++++++++++++ {variables => toardb/utils}/__init__.py | 0 {utils => toardb/utils}/database.py | 0 toardb/variables/__init__.py | 0 {variables => toardb/variables}/crud.py | 0 .../variables}/fixtures/variables.json | 0 {variables => toardb/variables}/models.py | 0 {variables => toardb/variables}/schemas.py | 0 {variables => toardb/variables}/test_base.py | 5 +-- .../variables}/test_variables.py | 2 +- {variables => toardb/variables}/variables.py | 16 ++++----- 64 files changed, 125 insertions(+), 91 deletions(-) rename {auth_user => toardb}/__init__.py (100%) rename {auth_user => toardb/auth_user}/README.md (100%) rename {contacts => toardb/auth_user}/__init__.py (100%) rename {auth_user => toardb/auth_user}/auth_user.py (100%) rename {auth_user => toardb/auth_user}/fixtures/auth.json (100%) rename {auth_user => toardb/auth_user}/fixtures/authtoken.json (100%) rename {auth_user => toardb/auth_user}/models.py (100%) rename {auth_user => toardb/auth_user}/schemas.py (100%) rename {data => toardb/contacts}/__init__.py (100%) rename {contacts => toardb/contacts}/contacts.py (77%) rename {contacts => toardb/contacts}/crud.py (100%) rename {contacts => toardb/contacts}/fixtures/organisations.json (100%) rename {contacts => toardb/contacts}/fixtures/persons.json (100%) rename {contacts => toardb/contacts}/models.py (100%) rename {contacts => toardb/contacts}/models_organisation.py (100%) rename {contacts => toardb/contacts}/models_person.py (100%) rename {contacts => toardb/contacts}/schemas.py (100%) rename {contacts => toardb/contacts}/test_base.py (95%) rename {contacts => toardb/contacts}/test_contacts.py (98%) rename {stationmeta => toardb/data}/__init__.py (100%) rename {data => toardb/data}/crud.py (91%) rename {data => toardb/data}/data.py (82%) rename {data => toardb/data}/models.py (100%) rename {data => toardb/data}/schemas.py (100%) rename {timeseries => toardb/stationmeta}/__init__.py (100%) rename {stationmeta => toardb/stationmeta}/crud.py (100%) rename {stationmeta => toardb/stationmeta}/fixtures/stationmeta_core.json (100%) rename {stationmeta => toardb/stationmeta}/models.py (100%) rename {stationmeta => toardb/stationmeta}/models_annotation.py (98%) rename {stationmeta => toardb/stationmeta}/models_aux.py (100%) rename {stationmeta => toardb/stationmeta}/models_core.py (99%) rename {stationmeta => toardb/stationmeta}/models_global.py (100%) rename {stationmeta => toardb/stationmeta}/models_global_services.py (100%) rename {stationmeta => toardb/stationmeta}/models_role.py (98%) rename {stationmeta => toardb/stationmeta}/pydantic_toar_testing.py (100%) rename {stationmeta => toardb/stationmeta}/schemas.py (100%) rename {stationmeta => toardb/stationmeta}/stationmeta.py (87%) rename {stationmeta => toardb/stationmeta}/test_base.py (94%) rename {stationmeta => toardb/stationmeta}/test_stationmeta.py (96%) rename {utils => toardb/timeseries}/__init__.py (100%) rename {timeseries => toardb/timeseries}/crud.py (98%) rename {timeseries => toardb/timeseries}/fixtures/timeseries.json (100%) rename {timeseries => toardb/timeseries}/models.py (100%) rename {timeseries => toardb/timeseries}/models_annotation.py (98%) rename {timeseries => toardb/timeseries}/models_core.py (98%) rename {timeseries => toardb/timeseries}/models_programme.py (100%) rename {timeseries => toardb/timeseries}/models_role.py (98%) rename {timeseries => toardb/timeseries}/pydantic_toar_testing.py (100%) rename {timeseries => toardb/timeseries}/schemas.py (100%) rename {timeseries => toardb/timeseries}/test_base.py (94%) rename {timeseries => toardb/timeseries}/test_timeseries.py (93%) rename {timeseries => toardb/timeseries}/timeseries.py (69%) create mode 100644 toardb/toardb.py rename {variables => toardb/utils}/__init__.py (100%) rename {utils => toardb/utils}/database.py (100%) create mode 100644 toardb/variables/__init__.py rename {variables => toardb/variables}/crud.py (100%) rename {variables => toardb/variables}/fixtures/variables.json (100%) rename {variables => toardb/variables}/models.py (100%) rename {variables => toardb/variables}/schemas.py (100%) rename {variables => toardb/variables}/test_base.py (95%) rename {variables => toardb/variables}/test_variables.py (99%) rename {variables => toardb/variables}/variables.py (74%) diff --git a/production_tests.sh b/production_tests.sh index f3655a6..54493ab 100755 --- a/production_tests.sh +++ b/production_tests.sh @@ -1,13 +1,12 @@ #!/bin/bash +# for running: uvicorn toardb.toardb:app --reload -# for running: uvicorn variables.variables:app --reload curl http://127.0.0.1:8000/variables/?limit=3 curl http://127.0.0.1:8000/variables/id/2 curl http://127.0.0.1:8000/variables/id/99 curl http://127.0.0.1:8000/variables/CO curl -X POST -H "Content-Type:application/json" -d '{"name": "sabinene", "longname": "sabinene", "displayname": "Sabinene", "cf_standardname": "mole_fraction_of_sabinene_in_air", "units": "nmol mol-1", "chemical_formula": "C10H16"}' http://127.0.0.1:8000/variables/ -# for running: uvicorn contacts.contacts:app --reload curl http://127.0.0.1:8000/contacts/organisations/ curl http://127.0.0.1:8000/contacts/organisations/id/2 curl http://127.0.0.1:8000/contacts/organisations/id/99 @@ -16,15 +15,14 @@ curl -X POST -H "Content-Type:application/json" -d '{"organisation": {"name": "F curl http://127.0.0.1:8000/contacts/persons/ curl http://127.0.0.1:8000/contacts/persons/id/3 curl http://127.0.0.1:8000/contacts/persons/id/99 -curl "http://127.0.0.1:8000/contacts/persons/Sabine Schröder" +curl "http://127.0.0.1:8000/contacts/persons/Ute%20Dauert" +curl "http://127.0.0.1:8000/contacts/persons/Sabine%20Schr%C3%B6der" curl -X POST -H "Content-Type:application/json" -d '{"person": {"name": "Martin Schultz", "email": "m.schultz@fz-juelich.de", "phone": "+49-2461-61-96870", "isprivate": true}}' http://127.0.0.1:8000/contacts/persons/ -# for running: uvicorn stationmeta.stationmeta:app --reload curl http://127.0.0.1:8000/stationmeta_core/ curl http://127.0.0.1:8000/stationmeta_core/China11 curl -X POST -H "Content-Type:application/json" -d '{"stationmeta_core": {"codes":["ttt3","ttt4"],"name":"Test_China","coordinates":{"lat":36.256,"lng":17.106,"alt":1534.0},"country":"China","state":"Shandong Sheng","coordinate_validation_status":0,"coordinate_validation_date":"2020-03-11T12:22:18.047974+01:00","type_of_environment":0,"type_of_area":0,"category":"","timezone":"", "coordinate_validator_id": 1, "additional_metadata":"{}"}}' "http://127.0.0.1:8000/stationmeta_core/" -# for running: uvicorn timeseries.timeseries:app --reload curl http://127.0.0.1:8000/timeseries/ curl http://127.0.0.1:8000/timeseries/2 curl -X POST -H "Content-Type:application/json" -d '{"timeseries": {"label": "CMA2", "order": 1, "access_rights": 0, "sampling_frequency": 0, "aggregation": 0, "data_start_date": "2003-09-07T15:30:00+02:00", "data_end_date": "2016-12-31T14:30:00+01:00", "measurement_method": "UV absorption", "sampling_height": 7.0, "date_added": "2020-05-15T15:30:00+02:00", "date_modified": "2020-05-16T09:30:00+02:00", "station_id": 2, "variable_id": 7, "additional_metadata":"{}"}}' http://127.0.0.1:8000/timeseries/ diff --git a/auth_user/__init__.py b/toardb/__init__.py similarity index 100% rename from auth_user/__init__.py rename to toardb/__init__.py diff --git a/auth_user/README.md b/toardb/auth_user/README.md similarity index 100% rename from auth_user/README.md rename to toardb/auth_user/README.md diff --git a/contacts/__init__.py b/toardb/auth_user/__init__.py similarity index 100% rename from contacts/__init__.py rename to toardb/auth_user/__init__.py diff --git a/auth_user/auth_user.py b/toardb/auth_user/auth_user.py similarity index 100% rename from auth_user/auth_user.py rename to toardb/auth_user/auth_user.py diff --git a/auth_user/fixtures/auth.json b/toardb/auth_user/fixtures/auth.json similarity index 100% rename from auth_user/fixtures/auth.json rename to toardb/auth_user/fixtures/auth.json diff --git a/auth_user/fixtures/authtoken.json b/toardb/auth_user/fixtures/authtoken.json similarity index 100% rename from auth_user/fixtures/authtoken.json rename to toardb/auth_user/fixtures/authtoken.json diff --git a/auth_user/models.py b/toardb/auth_user/models.py similarity index 100% rename from auth_user/models.py rename to toardb/auth_user/models.py diff --git a/auth_user/schemas.py b/toardb/auth_user/schemas.py similarity index 100% rename from auth_user/schemas.py rename to toardb/auth_user/schemas.py diff --git a/data/__init__.py b/toardb/contacts/__init__.py similarity index 100% rename from data/__init__.py rename to toardb/contacts/__init__.py diff --git a/contacts/contacts.py b/toardb/contacts/contacts.py similarity index 77% rename from contacts/contacts.py rename to toardb/contacts/contacts.py index 8b632bd..9f578a8 100644 --- a/contacts/contacts.py +++ b/toardb/contacts/contacts.py @@ -3,12 +3,12 @@ Simple API for contacts management """ from typing import List -from fastapi import FastAPI, Depends, HTTPException, Body +from fastapi import APIRouter, Depends, HTTPException, Body from sqlalchemy.orm import Session from . import crud, schemas -from utils.database import ToarDbSession +from toardb.utils.database import ToarDbSession -app = FastAPI() +router = APIRouter() # Dependency def get_db(): @@ -22,20 +22,20 @@ def get_db(): # plain views to post and get contacts #get all entries of table persons -@app.get('/contacts/persons/', response_model=List[schemas.Person]) +@router.get('/contacts/persons/', response_model=List[schemas.Person]) def get_all_persons(skip: int = 0, limit: int = None, db: Session = Depends(get_db)): persons = crud.get_all_persons(db, skip=skip, limit=limit) return persons #get all metadata of one person -@app.get('/contacts/persons/id/{person_id}', response_model=schemas.Person) +@router.get('/contacts/persons/id/{person_id}', response_model=schemas.Person) def get_person(person_id: int, db: Session = Depends(get_db)): db_person = crud.get_person(db, person_id=person_id) if db_person is None: raise HTTPException(status_code=404, detail="Person not found.") return db_person -@app.get('/contacts/persons/{name}', response_model=schemas.Person) +@router.get('/contacts/persons/{name}', response_model=schemas.Person) def get_person(name: str, db: Session = Depends(get_db)): db_person = crud.get_person_by_name(db, name=name) if db_person is None: @@ -47,7 +47,7 @@ def get_person(name: str, db: Session = Depends(get_db)): # # -@app.post('/contacts/persons/', response_model=schemas.Person) +@router.post('/contacts/persons/', response_model=schemas.Person) def create_person(person: schemas.PersonCreate = Body(..., embed = True), db: Session = Depends(get_db)): db_person = crud.get_person_by_name(db, name=person.name) if db_person: @@ -58,20 +58,20 @@ def create_person(person: schemas.PersonCreate = Body(..., embed = True), db: Se # plain views to post and get organisations #get all entries of table organisations -@app.get('/contacts/organisations/', response_model=List[schemas.Organisation]) +@router.get('/contacts/organisations/', response_model=List[schemas.Organisation]) def get_all_organisations(skip: int = 0, limit: int = None, db: Session = Depends(get_db)): organisations = crud.get_all_organisations(db, skip=skip, limit=limit) return organisations #get all metadata of one organisation -@app.get('/contacts/organisations/id/{organisation_id}', response_model=schemas.Organisation) +@router.get('/contacts/organisations/id/{organisation_id}', response_model=schemas.Organisation) def get_organisation(organisation_id: int, db: Session = Depends(get_db)): db_organisation = crud.get_organisation (db, organisation_id=organisation_id) if db_organisation is None: raise HTTPException(status_code=404, detail="Organisation not found.") return db_organisation -@app.get('/contacts/organisations/{name}', response_model=schemas.Organisation) +@router.get('/contacts/organisations/{name}', response_model=schemas.Organisation) def get_organisation(name: str, db: Session = Depends(get_db)): db_organisation = crud.get_organisation_by_name(db, name=name) if db_organisation is None: @@ -84,9 +84,8 @@ def get_organisation(name: str, db: Session = Depends(get_db)): # # -@app.post('/contacts/organisations/', response_model=schemas.Organisation) +@router.post('/contacts/organisations/', response_model=schemas.Organisation) def create_organisation(organisation: schemas.OrganisationCreate = Body(..., embed = True), db: Session = Depends(get_db)): - print("in contacts.py: ", organisation) db_organisation = crud.get_organisation_by_name(db, name=organisation.name) if db_organisation: raise HTTPException(status_code=400, detail="Organisation already registered.") diff --git a/contacts/crud.py b/toardb/contacts/crud.py similarity index 100% rename from contacts/crud.py rename to toardb/contacts/crud.py diff --git a/contacts/fixtures/organisations.json b/toardb/contacts/fixtures/organisations.json similarity index 100% rename from contacts/fixtures/organisations.json rename to toardb/contacts/fixtures/organisations.json diff --git a/contacts/fixtures/persons.json b/toardb/contacts/fixtures/persons.json similarity index 100% rename from contacts/fixtures/persons.json rename to toardb/contacts/fixtures/persons.json diff --git a/contacts/models.py b/toardb/contacts/models.py similarity index 100% rename from contacts/models.py rename to toardb/contacts/models.py diff --git a/contacts/models_organisation.py b/toardb/contacts/models_organisation.py similarity index 100% rename from contacts/models_organisation.py rename to toardb/contacts/models_organisation.py diff --git a/contacts/models_person.py b/toardb/contacts/models_person.py similarity index 100% rename from contacts/models_person.py rename to toardb/contacts/models_person.py diff --git a/contacts/schemas.py b/toardb/contacts/schemas.py similarity index 100% rename from contacts/schemas.py rename to toardb/contacts/schemas.py diff --git a/contacts/test_base.py b/toardb/contacts/test_base.py similarity index 95% rename from contacts/test_base.py rename to toardb/contacts/test_base.py index 377af35..70113f7 100644 --- a/contacts/test_base.py +++ b/toardb/contacts/test_base.py @@ -7,9 +7,10 @@ from sqlalchemy.engine import Engine as Database from sqlalchemy.orm import Session from sqlalchemy_utils import database_exists, create_database, drop_database -from utils.database import DATABASE_URL +from toardb.utils.database import DATABASE_URL from .models import Base -from .contacts import app, get_db +from toardb.toardb import app +from toardb.contacts.contacts import get_db url = str(DATABASE_URL+ "_test") _db_conn = create_engine(url) diff --git a/contacts/test_contacts.py b/toardb/contacts/test_contacts.py similarity index 98% rename from contacts/test_contacts.py rename to toardb/contacts/test_contacts.py index 840b584..162883b 100644 --- a/contacts/test_contacts.py +++ b/toardb/contacts/test_contacts.py @@ -29,7 +29,7 @@ class TestApps: fake_conn.commit() fake_cur.execute("ALTER SEQUENCE organisations_id_seq RESTART WITH 1") fake_conn.commit() - infilename = "contacts/fixtures/persons.json" + infilename = "toardb/contacts/fixtures/persons.json" with open(infilename) as f: metajson=json.load(f) for entry in metajson: @@ -37,7 +37,7 @@ class TestApps: db.add(new_person) db.commit() db.refresh(new_person) - infilename = "contacts/fixtures/organisations.json" + infilename = "toardb/contacts/fixtures/organisations.json" with open(infilename) as f: metajson=json.load(f) for entry in metajson: diff --git a/stationmeta/__init__.py b/toardb/data/__init__.py similarity index 100% rename from stationmeta/__init__.py rename to toardb/data/__init__.py diff --git a/data/crud.py b/toardb/data/crud.py similarity index 91% rename from data/crud.py rename to toardb/data/crud.py index b4e4954..8158dcd 100644 --- a/data/crud.py +++ b/toardb/data/crud.py @@ -10,14 +10,14 @@ from sqlalchemy.engine import Engine from fastapi import File, UploadFile from fastapi.responses import JSONResponse from . import models, schemas -from variables import models as variables_models -from stationmeta import models as stationmeta_models -from stationmeta.crud import get_stationmeta_core -from timeseries.crud import get_timeseries_by_unique_constraints +from toardb.variables import models as variables_models +from toardb.stationmeta import models as stationmeta_models +from toardb.stationmeta.crud import get_stationmeta_core +from toardb.timeseries.crud import get_timeseries_by_unique_constraints import datetime as dt import pandas as pd from io import StringIO -from utils.database import engine +from toardb.utils.database import engine def get_data(db: Session, timeseries_id: int): return db.query(models.Data).filter(models.Data.timeseries_id == timeseries_id).all() diff --git a/data/data.py b/toardb/data/data.py similarity index 82% rename from data/data.py rename to toardb/data/data.py index 4f972fd..c042383 100644 --- a/data/data.py +++ b/toardb/data/data.py @@ -3,13 +3,13 @@ Simple test API for data management """ from typing import List -from fastapi import FastAPI, Depends, HTTPException, \ +from fastapi import APIRouter, Depends, HTTPException, \ File, UploadFile from sqlalchemy.orm import Session from . import crud, schemas -from utils.database import ToarDbSession +from toardb.utils.database import ToarDbSession -app = FastAPI() +router = APIRouter() # Dependency def get_db(): @@ -24,13 +24,13 @@ def get_db(): # plain views to post and get data #get all data of table data -@app.get('/data/', response_model=List[schemas.Data]) +@router.get('/data/', response_model=List[schemas.Data]) def get_all_data(skip: int = 0, limit: int = None, db: Session = Depends(get_db)): data = crud.get_all_data(db, skip=skip, limit=limit) return data #get all data of one timeseries -@app.get('/data/{timeseries_id}', response_model=List[schemas.Data]) +@router.get('/data/{timeseries_id}', response_model=List[schemas.Data]) def get_data(timeseries_id: int, db: Session = Depends(get_db)): db_data = crud.get_data(db, timeseries_id=timeseries_id) if db_data is None: @@ -42,7 +42,7 @@ def get_data(timeseries_id: int, db: Session = Depends(get_db)): # - get all data of one special timestamp and timeseries # - ... -@app.post('/data/', response_model=schemas.DataCreate) +@router.post('/data/', response_model=schemas.DataCreate) async def create_data(file: UploadFile = File(...), db: Session = Depends(get_db)): # # the next three lines are automatically done by database management, # # but we do want helpful error messages! diff --git a/data/models.py b/toardb/data/models.py similarity index 100% rename from data/models.py rename to toardb/data/models.py diff --git a/data/schemas.py b/toardb/data/schemas.py similarity index 100% rename from data/schemas.py rename to toardb/data/schemas.py diff --git a/timeseries/__init__.py b/toardb/stationmeta/__init__.py similarity index 100% rename from timeseries/__init__.py rename to toardb/stationmeta/__init__.py diff --git a/stationmeta/crud.py b/toardb/stationmeta/crud.py similarity index 100% rename from stationmeta/crud.py rename to toardb/stationmeta/crud.py diff --git a/stationmeta/fixtures/stationmeta_core.json b/toardb/stationmeta/fixtures/stationmeta_core.json similarity index 100% rename from stationmeta/fixtures/stationmeta_core.json rename to toardb/stationmeta/fixtures/stationmeta_core.json diff --git a/stationmeta/models.py b/toardb/stationmeta/models.py similarity index 100% rename from stationmeta/models.py rename to toardb/stationmeta/models.py diff --git a/stationmeta/models_annotation.py b/toardb/stationmeta/models_annotation.py similarity index 98% rename from stationmeta/models_annotation.py rename to toardb/stationmeta/models_annotation.py index 7c78215..40cb5fc 100644 --- a/stationmeta/models_annotation.py +++ b/toardb/stationmeta/models_annotation.py @@ -7,7 +7,7 @@ from sqlalchemy import Column, DateTime, Float, ForeignKey, Integer, text, Strin Text, Boolean, CheckConstraint #from sqlalchemy.orm import relationship from sqlalchemy.ext.declarative import declarative_base -from auth_user.models import AuthUser +from toardb.auth_user.models import AuthUser from .models_core import StationmetaCore Base = declarative_base() diff --git a/stationmeta/models_aux.py b/toardb/stationmeta/models_aux.py similarity index 100% rename from stationmeta/models_aux.py rename to toardb/stationmeta/models_aux.py diff --git a/stationmeta/models_core.py b/toardb/stationmeta/models_core.py similarity index 99% rename from stationmeta/models_core.py rename to toardb/stationmeta/models_core.py index c8059d3..e275996 100644 --- a/stationmeta/models_core.py +++ b/toardb/stationmeta/models_core.py @@ -10,7 +10,7 @@ from sqlalchemy.orm import relationship from sqlalchemy.dialects.postgresql import JSONB, ARRAY from sqlalchemy.ext.declarative import declarative_base from shapely import wkt -from auth_user.models import AuthUser +from toardb.auth_user.models import AuthUser Base = declarative_base() metadata = Base.metadata diff --git a/stationmeta/models_global.py b/toardb/stationmeta/models_global.py similarity index 100% rename from stationmeta/models_global.py rename to toardb/stationmeta/models_global.py diff --git a/stationmeta/models_global_services.py b/toardb/stationmeta/models_global_services.py similarity index 100% rename from stationmeta/models_global_services.py rename to toardb/stationmeta/models_global_services.py diff --git a/stationmeta/models_role.py b/toardb/stationmeta/models_role.py similarity index 98% rename from stationmeta/models_role.py rename to toardb/stationmeta/models_role.py index d872d24..f7dc21e 100644 --- a/stationmeta/models_role.py +++ b/toardb/stationmeta/models_role.py @@ -7,7 +7,7 @@ from sqlalchemy import Column, ForeignKey, Integer, text, \ CheckConstraint, UniqueConstraint #from sqlalchemy.orm import relationship from sqlalchemy.ext.declarative import declarative_base -from contacts.models import Person +from toardb.contacts.models import Person from .models_core import StationmetaCore Base = declarative_base() diff --git a/stationmeta/pydantic_toar_testing.py b/toardb/stationmeta/pydantic_toar_testing.py similarity index 100% rename from stationmeta/pydantic_toar_testing.py rename to toardb/stationmeta/pydantic_toar_testing.py diff --git a/stationmeta/schemas.py b/toardb/stationmeta/schemas.py similarity index 100% rename from stationmeta/schemas.py rename to toardb/stationmeta/schemas.py diff --git a/stationmeta/stationmeta.py b/toardb/stationmeta/stationmeta.py similarity index 87% rename from stationmeta/stationmeta.py rename to toardb/stationmeta/stationmeta.py index a5ed0e6..6367f09 100644 --- a/stationmeta/stationmeta.py +++ b/toardb/stationmeta/stationmeta.py @@ -3,13 +3,13 @@ Simple test API for stationmeta management """ from typing import List -from fastapi import FastAPI, Depends, HTTPException, Body +from fastapi import APIRouter, Depends, HTTPException, Body from sqlalchemy.orm import Session, sessionmaker from . import crud, schemas from sqlalchemy import create_engine -from utils.database import DATABASE_URL +from toardb.utils.database import DATABASE_URL -app = FastAPI() +router = APIRouter() # Dependency #def get_db(): @@ -38,13 +38,13 @@ async def get_db(): # plain views to post and get stationmeta #get all entries of table stationmeta -@app.get('/stationmeta_core/', response_model=List[schemas.StationmetaCore]) +@router.get('/stationmeta_core/', response_model=List[schemas.StationmetaCore]) def get_all_stationmeta_core(skip: int = 0, limit: int = None, db: Session = Depends(get_db)): stationmeta_core = crud.get_all_stationmeta_core(db, skip=skip, limit=limit) return stationmeta_core #get all core metadata of one station -@app.get('/stationmeta_core/{station_code}', response_model=schemas.StationmetaCore) +@router.get('/stationmeta_core/{station_code}', response_model=schemas.StationmetaCore) def get_stationmeta_core(station_code: str, db: Session = Depends(get_db)): db_stationmeta_core = crud.get_stationmeta_core(db, station_code=station_code) if db_stationmeta_core is None: @@ -56,7 +56,7 @@ def get_stationmeta_core(station_code: str, db: Session = Depends(get_db)): # - get stationmeta_aux # - ... -@app.post('/stationmeta_core/', response_model=schemas.StationmetaCore) +@router.post('/stationmeta_core/', response_model=schemas.StationmetaCore) #curl -X POST -H "Content-Type:application/json" -d '{"stationmeta_core": {"codes":["ttt3","ttt4"],"name":"Test_China","coordinates":{"lat":36.256,"lng":17.106,"alt":1534.0},"country":"China","state":"Shandong Sheng","coordinate_validation_status":0,"coordinate_validation_date":"2020-03-11T12:22:18.047974+01:00","type_of_environment":0,"type_of_area":0,"category":"","timezone":"", "coordinate_validator_id": 1, "additional_metadata":"{}"}}' "http://127.0.0.1:8000/stationmeta_core/" # The following command was not working as long as the upload via Body was defined. # See bug report: https://github.com/tiangolo/fastapi/issues/300 diff --git a/stationmeta/test_base.py b/toardb/stationmeta/test_base.py similarity index 94% rename from stationmeta/test_base.py rename to toardb/stationmeta/test_base.py index 2871a87..bd411c7 100644 --- a/stationmeta/test_base.py +++ b/toardb/stationmeta/test_base.py @@ -7,11 +7,12 @@ from sqlalchemy.engine import Engine as Database from sqlalchemy.orm import Session from sqlalchemy_utils import database_exists, create_database, drop_database -from utils.database import DATABASE_URL +from toardb.utils.database import DATABASE_URL from .models import Base -from auth_user.models import Base as AuthUserBase -from contacts.models import Base as ContactBase -from .stationmeta import app, get_db +from toardb.auth_user.models import Base as AuthUserBase +from toardb.contacts.models import Base as ContactBase +from toardb.toardb import app +from toardb.stationmeta.stationmeta import get_db url = str(DATABASE_URL+ "_test") _db_conn = create_engine(url) diff --git a/stationmeta/test_stationmeta.py b/toardb/stationmeta/test_stationmeta.py similarity index 96% rename from stationmeta/test_stationmeta.py rename to toardb/stationmeta/test_stationmeta.py index 64bec38..b7b9a18 100644 --- a/stationmeta/test_stationmeta.py +++ b/toardb/stationmeta/test_stationmeta.py @@ -1,8 +1,8 @@ import pytest import json from .models import StationmetaCore -from auth_user.models import AuthUser -from contacts.models import Person, Organisation +from toardb.auth_user.models import AuthUser +from toardb.contacts.models import Person, Organisation from .schemas import get_geom_from_coordinates, Coordinates # Required imports 'create_test_database' from .test_base import ( @@ -50,7 +50,7 @@ class TestApps: fake_conn.commit() fake_cur.execute("ALTER SEQUENCE organisations_id_seq RESTART WITH 1") fake_conn.commit() - infilename = "auth_user/fixtures/auth.json" + infilename = "toardb/auth_user/fixtures/auth.json" with open(infilename) as f: metajson=json.load(f) for entry in metajson: @@ -58,7 +58,7 @@ class TestApps: db.add(new_auth_user) db.commit() db.refresh(new_auth_user) - infilename = "contacts/fixtures/persons.json" + infilename = "toardb/contacts/fixtures/persons.json" with open(infilename) as f: metajson=json.load(f) for entry in metajson: @@ -66,7 +66,7 @@ class TestApps: db.add(new_person) db.commit() db.refresh(new_person) - infilename = "contacts/fixtures/organisations.json" + infilename = "toardb/contacts/fixtures/organisations.json" with open(infilename) as f: metajson=json.load(f) for entry in metajson: @@ -74,7 +74,7 @@ class TestApps: db.add(new_organisation) db.commit() db.refresh(new_organisation) - infilename = "stationmeta/fixtures/stationmeta_core.json" + infilename = "toardb/stationmeta/fixtures/stationmeta_core.json" with open(infilename) as f: metajson=json.load(f) for entry in metajson: diff --git a/utils/__init__.py b/toardb/timeseries/__init__.py similarity index 100% rename from utils/__init__.py rename to toardb/timeseries/__init__.py diff --git a/timeseries/crud.py b/toardb/timeseries/crud.py similarity index 98% rename from timeseries/crud.py rename to toardb/timeseries/crud.py index 9b2eaa7..7abde34 100644 --- a/timeseries/crud.py +++ b/toardb/timeseries/crud.py @@ -43,7 +43,6 @@ def create_timeseries(db: Session, timeseries: TimeseriesCreate): # in upload command, we have now: "additional_metadata": "{}" # but return from this method gives: "additional_metadata": {} # ==> there is a mismatch between model(JSONB) and schema(JSON) - print("in crud: ",db_timeseries) db_timeseries.additional_metadata = str(db_timeseries.additional_metadata) db.add(db_timeseries) result = db.commit() diff --git a/timeseries/fixtures/timeseries.json b/toardb/timeseries/fixtures/timeseries.json similarity index 100% rename from timeseries/fixtures/timeseries.json rename to toardb/timeseries/fixtures/timeseries.json diff --git a/timeseries/models.py b/toardb/timeseries/models.py similarity index 100% rename from timeseries/models.py rename to toardb/timeseries/models.py diff --git a/timeseries/models_annotation.py b/toardb/timeseries/models_annotation.py similarity index 98% rename from timeseries/models_annotation.py rename to toardb/timeseries/models_annotation.py index 2e61ab7..058c9e6 100644 --- a/timeseries/models_annotation.py +++ b/toardb/timeseries/models_annotation.py @@ -7,7 +7,7 @@ from sqlalchemy import Column, DateTime, Float, ForeignKey, Integer, text, Strin Text, Boolean, CheckConstraint #from sqlalchemy.orm import relationship from sqlalchemy.ext.declarative import declarative_base -from auth_user.models import AuthUser +from toardb.auth_user.models import AuthUser from .models_core import Timeseries Base = declarative_base() diff --git a/timeseries/models_core.py b/toardb/timeseries/models_core.py similarity index 98% rename from timeseries/models_core.py rename to toardb/timeseries/models_core.py index 1298ad7..f713009 100644 --- a/timeseries/models_core.py +++ b/toardb/timeseries/models_core.py @@ -4,8 +4,8 @@ from sqlalchemy import Column, DateTime, Float, ForeignKey, Integer, text, Strin #from sqlalchemy.orm import relationship from sqlalchemy.dialects.postgresql import JSONB from sqlalchemy.ext.declarative import declarative_base -from stationmeta.models import StationmetaCore -from variables.models import Variable +from toardb.stationmeta.models import StationmetaCore +from toardb.variables.models import Variable Base = declarative_base() metadata = Base.metadata diff --git a/timeseries/models_programme.py b/toardb/timeseries/models_programme.py similarity index 100% rename from timeseries/models_programme.py rename to toardb/timeseries/models_programme.py diff --git a/timeseries/models_role.py b/toardb/timeseries/models_role.py similarity index 98% rename from timeseries/models_role.py rename to toardb/timeseries/models_role.py index 9e3191e..65c2327 100644 --- a/timeseries/models_role.py +++ b/toardb/timeseries/models_role.py @@ -7,7 +7,7 @@ from sqlalchemy import Column, ForeignKey, Integer, text, \ CheckConstraint, UniqueConstraint #from sqlalchemy.orm import relationship from sqlalchemy.ext.declarative import declarative_base -from contacts.models import Person +from toardb.contacts.models import Person from .models_core import Timeseries Base = declarative_base() diff --git a/timeseries/pydantic_toar_testing.py b/toardb/timeseries/pydantic_toar_testing.py similarity index 100% rename from timeseries/pydantic_toar_testing.py rename to toardb/timeseries/pydantic_toar_testing.py diff --git a/timeseries/schemas.py b/toardb/timeseries/schemas.py similarity index 100% rename from timeseries/schemas.py rename to toardb/timeseries/schemas.py diff --git a/timeseries/test_base.py b/toardb/timeseries/test_base.py similarity index 94% rename from timeseries/test_base.py rename to toardb/timeseries/test_base.py index 8a76e31..259b2b3 100644 --- a/timeseries/test_base.py +++ b/toardb/timeseries/test_base.py @@ -7,13 +7,14 @@ from sqlalchemy.engine import Engine as Database from sqlalchemy.orm import Session from sqlalchemy_utils import database_exists, create_database, drop_database -from utils.database import DATABASE_URL +from toardb.utils.database import DATABASE_URL from .models import Base -from variables.models import Base as VariableBase -from stationmeta.models import Base as StationmetaBase -from auth_user.models import Base as AuthUserBase -from contacts.models import Base as ContactBase -from .timeseries import app, get_db +from toardb.variables.models import Base as VariableBase +from toardb.stationmeta.models import Base as StationmetaBase +from toardb.auth_user.models import Base as AuthUserBase +from toardb.contacts.models import Base as ContactBase +from toardb.toardb import app +from toardb.timeseries.timeseries import get_db url = str(DATABASE_URL+ "_test") _db_conn = create_engine(url) diff --git a/timeseries/test_timeseries.py b/toardb/timeseries/test_timeseries.py similarity index 93% rename from timeseries/test_timeseries.py rename to toardb/timeseries/test_timeseries.py index f15df0a..0c1dd03 100644 --- a/timeseries/test_timeseries.py +++ b/toardb/timeseries/test_timeseries.py @@ -1,11 +1,11 @@ import pytest import json from .models import Timeseries -from stationmeta.models import StationmetaCore -from stationmeta.schemas import get_geom_from_coordinates, Coordinates -from variables.models import Variable -from contacts.models import Person, Organisation -from auth_user.models import AuthUser +from toardb.stationmeta.models import StationmetaCore +from toardb.stationmeta.schemas import get_geom_from_coordinates, Coordinates +from toardb.variables.models import Variable +from toardb.contacts.models import Person, Organisation +from toardb.auth_user.models import AuthUser # Required imports 'create_test_database' from .test_base import ( client, @@ -60,7 +60,7 @@ class TestApps: fake_conn.commit() fake_cur.execute("ALTER SEQUENCE timeseries_id_seq RESTART WITH 1") fake_conn.commit() - infilename = "auth_user/fixtures/auth.json" + infilename = "toardb/auth_user/fixtures/auth.json" with open(infilename) as f: metajson=json.load(f) for entry in metajson: @@ -68,7 +68,7 @@ class TestApps: db.add(new_auth_user) db.commit() db.refresh(new_auth_user) - infilename = "contacts/fixtures/persons.json" + infilename = "toardb/contacts/fixtures/persons.json" with open(infilename) as f: metajson=json.load(f) for entry in metajson: @@ -76,7 +76,7 @@ class TestApps: db.add(new_person) db.commit() db.refresh(new_person) - infilename = "contacts/fixtures/organisations.json" + infilename = "toardb/contacts/fixtures/organisations.json" with open(infilename) as f: metajson=json.load(f) for entry in metajson: @@ -84,7 +84,7 @@ class TestApps: db.add(new_organisation) db.commit() db.refresh(new_organisation) - infilename = "variables/fixtures/variables.json" + infilename = "toardb/variables/fixtures/variables.json" with open(infilename) as f: metajson=json.load(f) for entry in metajson: @@ -92,7 +92,7 @@ class TestApps: db.add(new_variable) db.commit() db.refresh(new_variable) - infilename = "stationmeta/fixtures/stationmeta_core.json" + infilename = "toardb/stationmeta/fixtures/stationmeta_core.json" with open(infilename) as f: metajson=json.load(f) for entry in metajson: @@ -108,7 +108,7 @@ class TestApps: db.add(new_stationmeta_core) db.commit() db.refresh(new_stationmeta_core) - infilename = "timeseries/fixtures/timeseries.json" + infilename = "toardb/timeseries/fixtures/timeseries.json" with open(infilename) as f: metajson=json.load(f) for entry in metajson: diff --git a/timeseries/timeseries.py b/toardb/timeseries/timeseries.py similarity index 69% rename from timeseries/timeseries.py rename to toardb/timeseries/timeseries.py index 9ce91d9..8c0fa82 100644 --- a/timeseries/timeseries.py +++ b/toardb/timeseries/timeseries.py @@ -3,12 +3,12 @@ Simple test API for timeseries management """ from typing import List -from fastapi import FastAPI, Depends, HTTPException, Body +from fastapi import APIRouter, Depends, HTTPException, Body from sqlalchemy.orm import Session from . import crud, schemas -from utils.database import ToarDbSession +from toardb.utils.database import ToarDbSession -app = FastAPI() +router = APIRouter() # Dependency def get_db(): @@ -23,13 +23,13 @@ def get_db(): # plain views to post and get timeseries #get all entries of table timeseries -@app.get('/timeseries/', response_model=List[schemas.Timeseries]) +@router.get('/timeseries/', response_model=List[schemas.Timeseries]) def get_all_timeseries(skip: int = 0, limit: int = None, db: Session = Depends(get_db)): timeseries = crud.get_all_timeseries(db, skip=skip, limit=limit) return timeseries #get all metadata of one timeseries -@app.get('/timeseries/{timeseries_id}', response_model=schemas.Timeseries) +@router.get('/timeseries/{timeseries_id}', response_model=schemas.Timeseries) def get_timeseries(timeseries_id: int, db: Session = Depends(get_db)): db_timeseries = crud.get_timeseries(db, timeseries_id=timeseries_id) if db_timeseries is None: @@ -42,9 +42,10 @@ def get_timeseries(timeseries_id: int, db: Session = Depends(get_db)): # # still to be tested: -@app.post('/timeseries/', response_model=schemas.Timeseries) +@router.post('/timeseries/', response_model=schemas.Timeseries) def create_timeseries(timeseries: schemas.TimeseriesCreate = Body(..., embed = True), db: Session = Depends(get_db)): - db_timeseries = crud.get_timeseries(db, timeseries_id=timeseries.id) + db_timeseries = crud.get_timeseries_by_unique_constraints(db, station_id=timeseries.station_id, + variable_id=timeseries.variable_id, label=timeseries.label) if db_timeseries: raise HTTPException(status_code=400, detail="Timeseries already registered.") return crud.create_timeseries(db=db, timeseries=timeseries) diff --git a/toardb/toardb.py b/toardb/toardb.py new file mode 100644 index 0000000..95d30c7 --- /dev/null +++ b/toardb/toardb.py @@ -0,0 +1,33 @@ +""" +Simple test API for variable management +""" + +from typing import List +from fastapi import FastAPI, Depends, HTTPException, APIRouter +from sqlalchemy.orm import Session + +from toardb.utils.database import ToarDbSession + +from toardb.variables import variables +from toardb.contacts import contacts +from toardb.stationmeta import stationmeta +from toardb.timeseries import timeseries +from toardb.data import data + + +app = FastAPI() + +# Dependency +def get_db(): + try: + db = ToarDbSession() + yield db + finally: + db.close() + +app.include_router(variables.router) +app.include_router(contacts.router) +app.include_router(stationmeta.router) +app.include_router(timeseries.router) +app.include_router(data.router) + diff --git a/variables/__init__.py b/toardb/utils/__init__.py similarity index 100% rename from variables/__init__.py rename to toardb/utils/__init__.py diff --git a/utils/database.py b/toardb/utils/database.py similarity index 100% rename from utils/database.py rename to toardb/utils/database.py diff --git a/toardb/variables/__init__.py b/toardb/variables/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/variables/crud.py b/toardb/variables/crud.py similarity index 100% rename from variables/crud.py rename to toardb/variables/crud.py diff --git a/variables/fixtures/variables.json b/toardb/variables/fixtures/variables.json similarity index 100% rename from variables/fixtures/variables.json rename to toardb/variables/fixtures/variables.json diff --git a/variables/models.py b/toardb/variables/models.py similarity index 100% rename from variables/models.py rename to toardb/variables/models.py diff --git a/variables/schemas.py b/toardb/variables/schemas.py similarity index 100% rename from variables/schemas.py rename to toardb/variables/schemas.py diff --git a/variables/test_base.py b/toardb/variables/test_base.py similarity index 95% rename from variables/test_base.py rename to toardb/variables/test_base.py index 71ac0fd..a8b05f1 100644 --- a/variables/test_base.py +++ b/toardb/variables/test_base.py @@ -7,9 +7,10 @@ from sqlalchemy.engine import Engine as Database from sqlalchemy.orm import Session from sqlalchemy_utils import database_exists, create_database, drop_database -from utils.database import DATABASE_URL +from toardb.utils.database import DATABASE_URL from .models import Base -from .variables import app, get_db +from toardb.toardb import app +from toardb.variables.variables import get_db url = str(DATABASE_URL+ "_test") _db_conn = create_engine(url) diff --git a/variables/test_variables.py b/toardb/variables/test_variables.py similarity index 99% rename from variables/test_variables.py rename to toardb/variables/test_variables.py index 1a7027a..c58b2d0 100644 --- a/variables/test_variables.py +++ b/toardb/variables/test_variables.py @@ -27,7 +27,7 @@ class TestApps: fake_cur = fake_conn.cursor() fake_cur.execute("ALTER SEQUENCE variables_id_seq RESTART WITH 1") fake_conn.commit() - infilename = "variables/fixtures/variables.json" + infilename = "toardb/variables/fixtures/variables.json" with open(infilename) as f: metajson=json.load(f) for entry in metajson: diff --git a/variables/variables.py b/toardb/variables/variables.py similarity index 74% rename from variables/variables.py rename to toardb/variables/variables.py index 6067934..dbc633c 100644 --- a/variables/variables.py +++ b/toardb/variables/variables.py @@ -3,12 +3,12 @@ Simple test API for variable management """ from typing import List -from fastapi import FastAPI, Depends, HTTPException +from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session -from variables import crud, schemas -from utils.database import ToarDbSession +from toardb.variables import crud, schemas +from toardb.utils.database import ToarDbSession -app = FastAPI() +router= APIRouter() # Dependency def get_db(): @@ -20,26 +20,26 @@ def get_db(): # plain views to post and get variables -@app.post('/variables/', response_model=schemas.Variable) +@router.post('/variables/', response_model=schemas.Variable) def create_variable(variable: schemas.VariableCreate, db: Session = Depends(get_db)): db_variable = crud.get_variable_by_name(db, name=variable.name) if db_variable: raise HTTPException(status_code=400, detail="Variable already registered.") return crud.create_variable(db=db, variable=variable) -@app.get('/variables/', response_model=List[schemas.Variable]) +@router.get('/variables/', response_model=List[schemas.Variable]) def get_variables(skip: int = 0, limit: int = None, db: Session = Depends(get_db)): variables = crud.get_variables(db, skip=skip, limit=limit) return variables -@app.get('/variables/{name}', response_model=schemas.Variable) +@router.get('/variables/{name}', response_model=schemas.Variable) def get_variable(name: str, db: Session = Depends(get_db)): db_variable = crud.get_variable_by_name(db, name=name) if db_variable is None: raise HTTPException(status_code=404, detail="Variable not found.") return db_variable -@app.get('/variables/id/{variable_id}', response_model=schemas.Variable) +@router.get('/variables/id/{variable_id}', response_model=schemas.Variable) def get_variable(variable_id: int, db: Session = Depends(get_db)): db_variable = crud.get_variable(db, variable_id=variable_id) if db_variable is None: -- GitLab