generated

This commit is contained in:
Wolfgang Hottgenroth 2021-07-07 13:02:16 +02:00
parent b6c33534f1
commit 284eb77bfe
Signed by: wn
GPG Key ID: 6C1E5E531E0D5D7F
11 changed files with 790 additions and 227 deletions

7
.gitignore vendored
View File

@ -1,2 +1,7 @@
__pycache__/
ENV
ENV
# generated files
create.sql
methods.py
openapi.yaml

View File

@ -18,7 +18,8 @@ RUN \
pip3 install uwsgi && \
pip3 install flask-cors && \
pip3 install python-jose[cryptography] && \
pip3 install loguru
pip3 install loguru && \
pip3 install Cheetah3
@ -28,13 +29,19 @@ RUN \
useradd -d ${APP_DIR} -u 1000 user
COPY *.py ${APP_DIR}/
COPY openapi.yaml ${APP_DIR}/
COPY openapi.yaml.tmpl ${APP_DIR}/
COPY methods.py.tmpl ${APP_DIR}/
COPY schema.json ${APP_DIR}/
COPY server.ini ${CONF_DIR}/
USER 1000:1000
WORKDIR ${APP_DIR}
VOLUME ${CONF_DIR}
RUN \
python3 generate.py
EXPOSE 5000
EXPOSE 9191

View File

@ -1,8 +0,0 @@
from db import dbGetMany, dbGetOne
def getAccounts(user, token_info):
return dbGetMany(user, token_info, {"statement": "SELECT id, description FROM account_t", "params": ()})
def getAccount(user, token_info, accountId=None):
return dbGetOne(user, token_info, {"statement": "select id, description from account_t where id = %s", "params": (accountId, )})

35
create.sql.tmpl Normal file
View File

@ -0,0 +1,35 @@
-- -----------------------------------------------------
-- THIS IS GENERATED CODE, DO NOT EDIT MANUALLY!
-- ALL CHANGES WILL BE LOST AFTER THE NEXT RUN
-- OF generate.py
-- -----------------------------------------------------
#for $table in $tables
CREATE TABLE ${table.name}_t (
id serial not null primary key
#for $column in $table.columns
,$column.name $column.sqltype #slurp
#if (('notnull' in $column) and $column.notnull)
not null #slurp
#end if
#if (('primarykey' in $column) and $column.primarykey)
primary key #slurp
#end if
#if (('foreignkey' in $column) and $column.foreignkey)
references ${column.name}_t (id) #slurp
#end if
#if ('default' in $column)
default $column.default #slurp
#end if
#end for
#if ('tableConstraints' in $table)
#for $tableConstraint in $table.tableConstraints
,$tableConstraint
#end for
#end if
);
#end for

38
generate.py Normal file
View File

@ -0,0 +1,38 @@
import json
from Cheetah.Template import Template
import glob
with open("schema.json") as schemaFile:
schema = json.load(schemaFile)
for table in schema["tables"]:
for column in table["columns"]:
if column["sqltype"] == 'serial':
column["apitype"] = 'integer'
column["jstype"] = 'number'
elif column["sqltype"] == 'integer':
column["apitype"] = 'integer'
column["jstype"] = 'number'
elif column["sqltype"] == 'date':
column["apitype"] = 'string'
column["jstype"] = 'string'
elif column["sqltype"] == 'timestamp':
column["apitype"] = 'string'
column["jstype"] = 'string'
elif column["sqltype"].startswith('varchar'):
column["apitype"] = 'string'
column["jstype"] = 'string'
elif column["sqltype"].startswith('numeric'):
column["apitype"] = 'number'
column["jstype"] = 'number'
for f in glob.glob("*.tmpl"):
tmpl = Template(file=f, searchList=[schema])
with open(f[:-5], 'w') as outFile:
outFile.write(str(tmpl))

39
methods.py.tmpl Normal file
View File

@ -0,0 +1,39 @@
#####################################################
### THIS IS GENERATED CODE, DO NOT EDIT MANUALLY! ###
### ALL CHANGES WILL BE LOST AFTER THE NEXT RUN ###
### OF generate.py ###
#####################################################
from db import dbGetMany, dbGetOne
#for $table in $tables
def get_${table.name}s(user, token_info):
return dbGetMany(user, token_info, {
"statement": """
SELECT
id
#for $column in $table.columns
,$column.name
#end for
FROM account_t
""",
"params": ()
}
)
def get_${table.name}(user, token_info, ${table.name}Id=None):
return dbGetOne(user, token_info, {
"statement": """
SELECT
id
#for $column in $table.columns
,$column.name
#end for
FROM account_t
WHERE id = %s
""",
"params": (${table.name}Id, )
}
)
#end for

View File

@ -1,3 +1,6 @@
openapi: 3.0.0
info:
title: hv2-api
@ -12,25 +15,11 @@ externalDocs:
url: "https://home.hottis.de/dokuwiki/doku.php?id=hv2pub:externaldocs"
paths:
/v1/test:
get:
tags: [ "Test" ]
summary: Return secret string
operationId: auth.testToken
responses:
'200':
description: secret response
content:
'application/json':
schema:
$ref: '#/components/schemas/TestOutput'
security:
- jwt: ['secret']
/v1/accounts:
get:
tags: [ "Account" ]
tags: [ "account" ]
summary: Return all normalized accounts
operationId: account.getAccounts
operationId: methods.get_accounts
responses:
'200':
description: accounts response
@ -39,14 +28,14 @@ paths:
schema:
type: array
items:
$ref: '#/components/schemas/Account'
$ref: '#/components/schemas/account'
security:
- jwt: ['secret']
/v1/accounts/{accountId}:
get:
tags: [ "Account" ]
tags: [ "account" ]
summary: Return the normalized account with given id
operationId: account.getAccount
operationId: methods.get_account
parameters:
- name: accountId
in: path
@ -55,42 +44,20 @@ paths:
type: integer
responses:
'200':
description: accounts response
description: account response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/Account'
$ref: '#/components/schemas/account'
security:
- jwt: ['secret']
/v1/tenants:
get:
tags: [ "Tenant" ]
tags: [ "tenant" ]
summary: Return all normalized tenants
operationId: tenant.getTenants
responses:
'200':
description: tenant response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/Tenant'
security:
- jwt: ['secret']
/v1/tenants/{tenantId}:
get:
tags: [ "Tenant" ]
summary: Return the normalized tenant with given id
operationId: tenant.getTenant
parameters:
- name: tenantId
in: path
required: true
schema:
type: integer
operationId: methods.get_tenants
responses:
'200':
description: tenants response
@ -99,106 +66,90 @@ paths:
schema:
type: array
items:
$ref: '#/components/schemas/Tenant'
$ref: '#/components/schemas/tenant'
security:
- jwt: ['secret']
/v1/commercialPremises:
/v1/tenants/{tenantId}:
get:
tags: [ "CommercialPremise" ]
summary: Return all normalized commercial premises
operationId: rentalObjects.getCommercialPremises
responses:
'200':
description: commercial premise response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/CommercialPremise'
security:
- jwt: ['secret']
/v1/commercialPremises/{commercialPremiseId}:
get:
tags: [ "CommercialPremise" ]
summary: Return the normalized commercial premise with given id
operationId: rentalObjects.getCommercialPremise
tags: [ "tenant" ]
summary: Return the normalized tenant with given id
operationId: methods.get_tenant
parameters:
- name: commercialPremiseId
- name: tenantId
in: path
required: true
schema:
type: integer
responses:
'200':
description: commercial premise response
description: tenant response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/CommercialPremise'
$ref: '#/components/schemas/tenant'
security:
- jwt: ['secret']
/v1/parkings:
/v1/premises:
get:
tags: [ "Parking" ]
summary: Return all normalized parkings
operationId: rentalObjects.getParkings
tags: [ "premise" ]
summary: Return all normalized premises
operationId: methods.get_premises
responses:
'200':
description: parkings response
description: premises response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/Parking'
$ref: '#/components/schemas/premise'
security:
- jwt: ['secret']
/v1/parkings/{parkingId}:
/v1/premises/{premiseId}:
get:
tags: [ "Parking" ]
summary: Return the normalized parking with given id
operationId: rentalObjects.getParking
tags: [ "premise" ]
summary: Return the normalized premise with given id
operationId: methods.get_premise
parameters:
- name: parkingId
- name: premiseId
in: path
required: true
schema:
type: integer
responses:
'200':
description: parking response
description: premise response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/Parking'
$ref: '#/components/schemas/premise'
security:
- jwt: ['secret']
/v1/flats:
get:
tags: [ "Flat" ]
tags: [ "flat" ]
summary: Return all normalized flats
operationId: rentalObjects.getFlats
operationId: methods.get_flats
responses:
'200':
description: flat response
description: flats response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/Flat'
$ref: '#/components/schemas/flat'
security:
- jwt: ['secret']
/v1/flats/{flatId}:
get:
tags: [ "Flat" ]
tags: [ "flat" ]
summary: Return the normalized flat with given id
operationId: rentalObjects.getFlat
operationId: methods.get_flat
parameters:
- name: flatId
in: path
@ -213,7 +164,311 @@ paths:
schema:
type: array
items:
$ref: '#/components/schemas/Flat'
$ref: '#/components/schemas/flat'
security:
- jwt: ['secret']
/v1/overhead_advances:
get:
tags: [ "overhead_advance" ]
summary: Return all normalized overhead_advances
operationId: methods.get_overhead_advances
responses:
'200':
description: overhead_advances response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/overhead_advance'
security:
- jwt: ['secret']
/v1/overhead_advances/{overhead_advanceId}:
get:
tags: [ "overhead_advance" ]
summary: Return the normalized overhead_advance with given id
operationId: methods.get_overhead_advance
parameters:
- name: overhead_advanceId
in: path
required: true
schema:
type: integer
responses:
'200':
description: overhead_advance response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/overhead_advance'
security:
- jwt: ['secret']
/v1/overhead_advance_flat_mappings:
get:
tags: [ "overhead_advance_flat_mapping" ]
summary: Return all normalized overhead_advance_flat_mappings
operationId: methods.get_overhead_advance_flat_mappings
responses:
'200':
description: overhead_advance_flat_mappings response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/overhead_advance_flat_mapping'
security:
- jwt: ['secret']
/v1/overhead_advance_flat_mappings/{overhead_advance_flat_mappingId}:
get:
tags: [ "overhead_advance_flat_mapping" ]
summary: Return the normalized overhead_advance_flat_mapping with given id
operationId: methods.get_overhead_advance_flat_mapping
parameters:
- name: overhead_advance_flat_mappingId
in: path
required: true
schema:
type: integer
responses:
'200':
description: overhead_advance_flat_mapping response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/overhead_advance_flat_mapping'
security:
- jwt: ['secret']
/v1/parkings:
get:
tags: [ "parking" ]
summary: Return all normalized parkings
operationId: methods.get_parkings
responses:
'200':
description: parkings response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/parking'
security:
- jwt: ['secret']
/v1/parkings/{parkingId}:
get:
tags: [ "parking" ]
summary: Return the normalized parking with given id
operationId: methods.get_parking
parameters:
- name: parkingId
in: path
required: true
schema:
type: integer
responses:
'200':
description: parking response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/parking'
security:
- jwt: ['secret']
/v1/commercial_premises:
get:
tags: [ "commercial_premise" ]
summary: Return all normalized commercial_premises
operationId: methods.get_commercial_premises
responses:
'200':
description: commercial_premises response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/commercial_premise'
security:
- jwt: ['secret']
/v1/commercial_premises/{commercial_premiseId}:
get:
tags: [ "commercial_premise" ]
summary: Return the normalized commercial_premise with given id
operationId: methods.get_commercial_premise
parameters:
- name: commercial_premiseId
in: path
required: true
schema:
type: integer
responses:
'200':
description: commercial_premise response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/commercial_premise'
security:
- jwt: ['secret']
/v1/tenancys:
get:
tags: [ "tenancy" ]
summary: Return all normalized tenancys
operationId: methods.get_tenancys
responses:
'200':
description: tenancys response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/tenancy'
security:
- jwt: ['secret']
/v1/tenancys/{tenancyId}:
get:
tags: [ "tenancy" ]
summary: Return the normalized tenancy with given id
operationId: methods.get_tenancy
parameters:
- name: tenancyId
in: path
required: true
schema:
type: integer
responses:
'200':
description: tenancy response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/tenancy'
security:
- jwt: ['secret']
/v1/fees:
get:
tags: [ "fee" ]
summary: Return all normalized fees
operationId: methods.get_fees
responses:
'200':
description: fees response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/fee'
security:
- jwt: ['secret']
/v1/fees/{feeId}:
get:
tags: [ "fee" ]
summary: Return the normalized fee with given id
operationId: methods.get_fee
parameters:
- name: feeId
in: path
required: true
schema:
type: integer
responses:
'200':
description: fee response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/fee'
security:
- jwt: ['secret']
/v1/tenancy_fee_mappings:
get:
tags: [ "tenancy_fee_mapping" ]
summary: Return all normalized tenancy_fee_mappings
operationId: methods.get_tenancy_fee_mappings
responses:
'200':
description: tenancy_fee_mappings response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/tenancy_fee_mapping'
security:
- jwt: ['secret']
/v1/tenancy_fee_mappings/{tenancy_fee_mappingId}:
get:
tags: [ "tenancy_fee_mapping" ]
summary: Return the normalized tenancy_fee_mapping with given id
operationId: methods.get_tenancy_fee_mapping
parameters:
- name: tenancy_fee_mappingId
in: path
required: true
schema:
type: integer
responses:
'200':
description: tenancy_fee_mapping response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/tenancy_fee_mapping'
security:
- jwt: ['secret']
/v1/account_entrys:
get:
tags: [ "account_entry" ]
summary: Return all normalized account_entrys
operationId: methods.get_account_entrys
responses:
'200':
description: account_entrys response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/account_entry'
security:
- jwt: ['secret']
/v1/account_entrys/{account_entryId}:
get:
tags: [ "account_entry" ]
summary: Return the normalized account_entry with given id
operationId: methods.get_account_entry
parameters:
- name: account_entryId
in: path
required: true
schema:
type: integer
responses:
'200':
description: account_entry response
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/schemas/account_entry'
security:
- jwt: ['secret']
@ -225,24 +480,16 @@ components:
bearerFormat: JWT
x-bearerInfoFunc: auth.decodeToken
schemas:
TestOutput:
description: Test Output
type: object
properties:
message:
type: string
details:
type: string
Account:
description: Account
account:
description: account
type: object
properties:
id:
type: integer
description:
type: string
Tenant:
description: Tenant
tenant:
description: tenant
type: object
properties:
id:
@ -271,28 +518,22 @@ components:
type: string
account:
type: integer
CommercialPremise:
description: CommercialPremise
premise:
description: premise
type: object
properties:
id:
type: integer
description:
type: string
premise:
type: integer
Parking:
description: Parking
type: object
properties:
id:
type: integer
description:
street:
type: string
premise:
type: integer
Flat:
description: Flat
zip:
type: string
city:
type: string
flat:
description: flat
type: object
properties:
id:
@ -305,3 +546,107 @@ components:
type: number
flat_no:
type: integer
overhead_advance:
description: overhead_advance
type: object
properties:
id:
type: integer
description:
type: string
amount:
type: number
startdate:
type: string
enddate:
type: string
overhead_advance_flat_mapping:
description: overhead_advance_flat_mapping
type: object
properties:
id:
type: integer
overhead_advance:
type: integer
flat:
type: integer
parking:
description: parking
type: object
properties:
id:
type: integer
description:
type: string
premise:
type: integer
commercial_premise:
description: commercial_premise
type: object
properties:
id:
type: integer
description:
type: string
premise:
type: integer
tenancy:
description: tenancy
type: object
properties:
id:
type: integer
description:
type: string
tenant:
type: integer
flat:
type: integer
parking:
type: integer
commercial_premise:
type: integer
startdate:
type: string
enddate:
type: string
fee:
description: fee
type: object
properties:
id:
type: integer
description:
type: string
amount:
type: number
fee_type:
type: string
startdate:
type: string
enddate:
type: string
tenancy_fee_mapping:
description: tenancy_fee_mapping
type: object
properties:
id:
type: integer
tenancy:
type: integer
fee:
type: integer
account_entry:
description: account_entry
type: object
properties:
id:
type: integer
description:
type: string
account:
type: integer
created_at:
type: string
amount:
type: number

83
openapi.yaml.tmpl Normal file
View File

@ -0,0 +1,83 @@
#####################################################
### THIS IS GENERATED CODE, DO NOT EDIT MANUALLY! ###
### ALL CHANGES WILL BE LOST AFTER THE NEXT RUN ###
### OF generate.py ###
#####################################################
openapi: 3.0.0
info:
title: hv2-api
version: "1"
description: "REST-API for the Nober Grundbesitz GbR Hausverwaltungs-Software"
termsOfService: "https://home.hottis.de/dokuwiki/doku.php?id=hv2pub:termsofuse"
contact:
name: "Wolfgang Hottgenroth"
email: "wolfgang.hottgenroth@icloud.com"
externalDocs:
description: "Find more details here"
url: "https://home.hottis.de/dokuwiki/doku.php?id=hv2pub:externaldocs"
paths:
#for $table in $tables
/v1/${table.name}s:
get:
tags: [ "$table.name" ]
summary: Return all normalized ${table.name}s
operationId: methods.get_${table.name}s
responses:
'200':
description: ${table.name}s response
content:
'application/json':
schema:
type: array
items:
\$ref: '#/components/schemas/$table.name'
security:
- jwt: ['secret']
/v1/${table.name}s/{${table.name}Id}:
get:
tags: [ "$table.name" ]
summary: Return the normalized $table.name with given id
operationId: methods.get_$table.name
parameters:
- name: ${table.name}Id
in: path
required: true
schema:
type: integer
responses:
'200':
description: $table.name response
content:
'application/json':
schema:
type: array
items:
\$ref: '#/components/schemas/$table.name'
security:
- jwt: ['secret']
#end for
components:
securitySchemes:
jwt:
type: http
scheme: bearer
bearerFormat: JWT
x-bearerInfoFunc: auth.decodeToken
schemas:
#for $table in $tables
$table.name:
description: $table.name
type: object
properties:
id:
type: integer
#for $column in $table.columns
$column.name:
type: $column.apitype
#end for
#end for

View File

@ -1,71 +0,0 @@
from db import dbGetMany, dbGetOne
def getCommercialPremises(user, token_info):
return dbGetMany(user, token_info,
{
"statement": """
SELECT id, description, premise
FROM commercial_premise_t
""",
"params": ()
}
)
def getCommercialPremise(user, token_info, commercialPremiseId=None):
return dbGetOne(user, token_info,
{
"statement": """
SELECT id, description, premise
FROM commercial_premise_t
WHERE id = %s
""",
"params": (commercialPremiseId, )
}
)
def getFlats(user, token_info):
return dbGetMany(user, token_info,
{
"statement": """
SELECT id, description, premise, area, flat_no
FROM flat_t
""",
"params": ()
}
)
def getFlat(user, token_info, flatId=None):
return dbGetOne(user, token_info,
{
"statement": """
SELECT id, description, premise, area, flat_no
FROM flat_t
WHERE id = %s
""",
"params": (flatId, )
}
)
def getParking(user, token_info):
return dbGetMany(user, token_info,
{
"statement": """
SELECT id, description, premise
FROM parking_t
""",
"params": ()
}
)
def getParking(user, token_info, parkingId=None):
return dbGetOne(user, token_info,
{
"statement": """
SELECT id, description, premise
FROM parking_t
WHERE id = %s
""",
"params": (parkingId, )
}
)

119
schema.json Normal file
View File

@ -0,0 +1,119 @@
{
"tables": [
{
"name": "account",
"columns": [
{ "name": "description", "sqltype": "varchar(128)", "notnull": true }
]
},
{
"name": "tenant",
"columns": [
{ "name": "salutation", "sqltype": "varchar(128)" },
{ "name": "firstname", "sqltype": "varchar(128)" },
{ "name": "lastname", "sqltype": "varchar(128)" },
{ "name": "address1", "sqltype": "varchar(128)" },
{ "name": "address2", "sqltype": "varchar(128)" },
{ "name": "address3", "sqltype": "varchar(128)" },
{ "name": "zip", "sqltype": "varchar(10)" },
{ "name": "city", "sqltype": "varchar(128)" },
{ "name": "phone1", "sqltype": "varchar(64)" },
{ "name": "phone2", "sqltype": "varchar(64)" },
{ "name": "iban", "sqltype": "varchar(64)" },
{ "name": "account", "sqltype": "integer", "notnull": true, "foreignkey": true }
]
},
{
"name": "premise",
"columns": [
{ "name": "description", "sqltype": "varchar(128)" },
{ "name": "street", "sqltype": "varchar(128)", "notnull": true },
{ "name": "zip", "sqltype": "varchar(10)", "notnull": true },
{ "name": "city", "sqltype": "varchar(128)", "notnull": true }
]
},
{
"name": "flat",
"columns": [
{ "name": "description", "sqltype": "varchar(128)" },
{ "name": "premise", "sqltype": "integer", "foreignkey": true },
{ "name": "area", "sqltype": "numeric(10,2)", "notnull": true },
{ "name": "flat_no", "sqltype": "integer" }
]
},
{
"name": "overhead_advance",
"columns": [
{ "name": "description", "sqltype": "varchar(128)" },
{ "name": "amount", "sqltype": "numeric(10,4)", "notnull": true },
{ "name": "startdate", "sqltype": "date" },
{ "name": "enddate", "sqltype": "date" }
]
},
{
"name": "overhead_advance_flat_mapping",
"columns": [
{ "name": "overhead_advance", "sqltype": "integer", "notnull": true, "foreignkey": true },
{ "name": "flat", "sqltype": "integer", "notnull": true, "foreignkey": true }
]
},
{
"name": "parking",
"columns": [
{ "name": "description", "sqltype": "varchar(128)" },
{ "name": "premise", "sqltype": "integer", "foreignkey": true }
]
},
{
"name": "commercial_premise",
"columns": [
{ "name": "description", "sqltype": "varchar(128)" },
{ "name": "premise", "sqltype": "integer", "foreignkey": true }
]
},
{
"name": "tenancy",
"columns": [
{ "name": "description", "sqltype": "varchar(128)" },
{ "name": "tenant", "sqltype": "integer", "notnull": true, "foreignkey": true },
{ "name": "flat", "sqltype": "integer", "notnull": false, "foreignkey": true },
{ "name": "parking", "sqltype": "integer", "notnull": false, "foreignkey": true },
{ "name": "commercial_premise", "sqltype": "integer", "notnull": false, "foreignkey": true },
{ "name": "startdate", "sqltype": "date", "notnull": true },
{ "name": "enddate", "sqltype": "date", "notnull": false }
],
"tableConstraints": [
"constraint tenancy_only_one_object check ((flat is not null and parking is null and commercial_premise is null) or (flat is null and parking is not null and commercial_premise is null) or (flat is null and parking is null and commercial_premise is not null))"
]
},
{
"name": "fee",
"columns": [
{ "name": "description", "sqltype": "varchar(128)" },
{ "name": "amount", "sqltype": "numeric(10,2)", "notnull": true },
{ "name": "fee_type", "sqltype": "varchar(10)", "notnull": true },
{ "name": "startdate", "sqltype": "date" },
{ "name": "enddate", "sqltype": "date" }
],
"tableConstraints": [
"constraint fee_fee_type check (fee_type = 'per_area' or fee_type = 'total')"
]
},
{
"name": "tenancy_fee_mapping",
"columns": [
{ "name": "tenancy", "sqltype": "integer", "notnull": true, "foreignkey": true },
{ "name": "fee", "sqltype": "integer", "notnull": true, "foreignkey": true }
]
},
{
"name": "account_entry",
"columns": [
{ "name": "description", "sqltype": "varchar(128)", "notnull": true },
{ "name": "account", "sqltype": "integer", "notnull": true, "foreignkey": true },
{ "name": "created_at", "sqltype": "timestamp", "notnull": true, "default": "now()" },
{ "name": "amount", "sqltype": "numeric(10,2)", "notnull": true }
]
}
]
}

View File

@ -1,29 +0,0 @@
from db import dbGetMany, dbGetOne
def getTenants(user, token_info):
return dbGetMany(user, token_info,
{
"statement": """
SELECT id, salutation, firstname, lastname,
address1, address2, address3, zip, city,
phone1, phone2, iban, account
FROM tenant_t
""",
"params": ()
}
)
def getTenant(user, token_info, tenantId=None):
return dbGetOne(user, token_info,
{
"statement": """
SELECT id, salutation, firstname, lastname,
address1, address2, address3, zip, city,
phone1, phone2, iban, account
FROM tenant_t
WHERE id = %s
""",
"params": (tenantId, )
}
)