Skip to content

Commit 5289f23

Browse files
Merge pull request #5 from Nieuwe-Warmte-Nu/add_additional_func
Add additional func
2 parents 52d89e6 + b8456c5 commit 5289f23

File tree

7 files changed

+210
-46
lines changed

7 files changed

+210
-46
lines changed

README.md

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,13 @@ Nieuwe Warmte Nu
44

55
## install/update pip package
66
see
7-
https://packaging.python.org/en/latest/tutorials/packaging-projects/#:~:text=Generating%20distribution%20archives
7+
https://packaging.python.org/en/latest/tutorials/packaging-projects/#:~:text=Generating%20distribution%20archives
8+
Update version in `pyproject.toml`.
9+
In root directory:
10+
```
11+
py -m build
12+
twine upload dist/*
13+
```
814

915
## usage
1016
Install in development mode, in root directory:
@@ -17,12 +23,13 @@ or install from pypi:
1723
pip install nwnsdk
1824
```
1925

20-
Start local rabbitmq and postgres, in root directory:
26+
For testing locally with RabbitMQ and Postgres on docker desktop clone https://github.com/Nieuwe-Warmte-Nu/computation-engine, copy `.env-template` to `.env` and in the root directory:
2127
```
2228
docker-compose up
2329
```
2430

2531
Example usage
32+
2633
```python
2734
from uuid import uuid4
2835
from nwnsdk import NwnClient, WorkFlowType, PostgresConfig, RabbitmqConfig
@@ -42,7 +49,38 @@ rabbitmq_config = RabbitmqConfig(
4249
"5678",
4350
)
4451
nwn_client = NwnClient(postgres_config, rabbitmq_config)
45-
job_id: uuid4 = nwn_client.start_work_flow(WorkFlowType.GROWTH_OPTIMIZER, "test_job", "esdl_string", "test_user")
52+
job_id1: uuid4 = nwn_client.start_work_flow(
53+
WorkFlowType.GROWTH_OPTIMIZER, "test_job1", "esdl_string", "test_user1", "test_proj"
54+
)
55+
job_id2: uuid4 = nwn_client.start_work_flow(
56+
WorkFlowType.GROWTH_OPTIMIZER, "test_job2", "esdl_string", "test_user2", "test_proj"
57+
)
58+
print(job_id1)
59+
60+
job1_input_esdl = nwn_client.get_job_input_esdl(job_id1)
61+
print(f"===== job1 input ESDL: {job1_input_esdl}")
62+
63+
job1_status = nwn_client.get_job_status(job_id1)
64+
print(f"===== job1 status: {job1_status}")
65+
66+
job1 = nwn_client.get_job_details(job_id1)
67+
print(f"===== {job1.job_name} input esdl: {job1.input_esdl}")
68+
69+
jobs_all = nwn_client.get_all_jobs()
70+
print(f"===== {jobs_all[1].job_name} added at: {jobs_all[1].added_at}")
71+
72+
73+
jobs_from_ids = nwn_client.get_jobs_from_ids([job_id1, job_id2])
74+
print(f"===== {jobs_from_ids[1].job_name} added at: {jobs_from_ids[1].added_at}")
75+
76+
77+
jobs_from_user = nwn_client.get_jobs_from_user("test_user1")
78+
print(f"===== Jobs from test_user1 added at: {','.join([str(job.added_at) for job in jobs_from_user])}")
79+
80+
81+
jobs_from_project = nwn_client.get_jobs_from_project("test_proj")
82+
print(f"===== Jobs from test_proj added at: {','.join([str(job.added_at) for job in jobs_from_project])}")
83+
84+
print(f"===== Deleted job with id '{job_id1}': {nwn_client.delete_job(job_id1)}")
4685

47-
print(job_id)
4886
```

pyproject.toml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "nwnsdk"
3-
version = "0.0.3"
3+
version = "0.0.4"
44
authors = [{ name = "NieuweWarmteNu", email = "[email protected]" }]
55
description = "Nieuwe Warmte Nu - compute engine sdk python"
66
classifiers = [
@@ -20,10 +20,11 @@ readme = "README.md"
2020
requires-python = ">=3.10"
2121

2222
dependencies = [
23-
"python-dotenv == 1.0.0",
24-
"pika == 1.3.2",
23+
"python-dotenv==1.0.0",
24+
"pika==1.3.2",
2525
"pika-stubs==0.1.3",
2626
"SQLAlchemy==2.0.19",
27+
"sqlalchemy-stubs==0.4",
2728
"psycopg2-binary==2.9.7",
2829
]
2930

src/nwnsdk/app_logging.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ def setup_logging(log_level: LogLevel, logger_name: Optional[str]) -> logging.Lo
7070
----------
7171
log_level : LogLevel
7272
The LogLevel for this logger.
73+
logger_name : Optional[str]
74+
Name for this logger.
7375
"""
7476
logger = logging.getLogger(logger_name)
7577

src/nwnsdk/nwn_client.py

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
from dataclasses import dataclass
2+
from typing import List
13
from uuid import uuid4
24

5+
from nwnsdk.postgres.dbmodels import Job
36
from nwnsdk.rabbitmq.rabbitmq_client import RabbitmqClient
47

58
import logging
69
from nwnsdk.postgres.postgres_client import PostgresClient
7-
from nwnsdk import PostgresConfig, RabbitmqConfig, WorkFlowType
10+
from nwnsdk import PostgresConfig, RabbitmqConfig, WorkFlowType, JobStatus
811

912
LOGGER = logging.getLogger("nwnsdk")
1013

@@ -18,15 +21,52 @@ def __init__(self, postgres_config: PostgresConfig, rabbitmq_config: RabbitmqCon
1821
self.rabbitmq_client = RabbitmqClient(rabbitmq_config)
1922
self.postgres_client = PostgresClient(postgres_config)
2023

21-
def start_work_flow(self, work_flow_type: WorkFlowType, job_name: str, esdl_str: str, user_name: str) -> uuid4:
24+
def start_work_flow(
25+
self, work_flow_type: WorkFlowType, job_name: str, esdl_str: str, user_name: str, project_name: str
26+
) -> uuid4:
2227
job_id: uuid4 = uuid4()
2328
self.postgres_client.send_input(
24-
job_id=job_id, job_name=job_name, work_flow_type=work_flow_type, esdl_str=esdl_str, user_name=user_name
29+
job_id=job_id,
30+
job_name=job_name,
31+
work_flow_type=work_flow_type,
32+
esdl_str=esdl_str,
33+
user_name=user_name,
34+
project_name=project_name,
2535
)
2636
self.rabbitmq_client.send_start_work_flow(job_id, work_flow_type)
2737

2838
return job_id
2939

40+
def get_job_status(self, job_id: uuid4) -> JobStatus:
41+
return self.postgres_client.get_job_status(job_id)
42+
43+
def get_job_input_esdl(self, job_id: uuid4) -> str:
44+
return self.postgres_client.get_job_input_esdl(job_id)
45+
46+
def get_job_output_esdl(self, job_id: uuid4) -> str:
47+
return self.postgres_client.get_job_output_esdl(job_id)
48+
49+
def get_job_logs(self, job_id: uuid4) -> str:
50+
return self.postgres_client.get_job_logs(job_id)
51+
52+
def get_job_details(self, job_id: uuid4) -> Job:
53+
return self.postgres_client.get_job(job_id)
54+
55+
def get_all_jobs(self) -> List[Job]:
56+
return self.postgres_client.get_jobs()
57+
58+
def get_jobs_from_ids(self, job_ids: List[uuid4]) -> List[Job]:
59+
return self.postgres_client.get_jobs(job_ids)
60+
61+
def get_jobs_from_user(self, user_name: str) -> List[Job]:
62+
return self.postgres_client.get_jobs_from_user(user_name)
63+
64+
def get_jobs_from_project(self, project_name: str) -> List[Job]:
65+
return self.postgres_client.get_jobs_from_project(project_name)
66+
67+
def delete_job(self, job_id: uuid4) -> bool:
68+
return self.postgres_client.delete_job(job_id)
69+
3070
@property
3171
def db_client(self) -> PostgresClient:
3272
return self.postgres_client

src/nwnsdk/postgres/database.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,20 @@
1515

1616

1717
@contextmanager
18-
def session_scope(bind=None) -> Generator[SQLSession, None, None]:
18+
def session_scope(do_expunge=False) -> Generator[SQLSession, None, None]:
1919
"""Provide a transactional scope around a series of operations. Ensures that the session is
2020
committed and closed. Exceptions raised within the 'with' block using this contextmanager
2121
should be handled in the with block itself. They will not be caught by the 'except' here."""
2222
try:
23-
if bind:
24-
yield Session(bind=bind)
2523
yield Session()
24+
25+
if do_expunge:
26+
Session.expunge_all()
2627
Session.commit()
27-
except Exception:
28+
except Exception as e:
2829
# Only the exceptions raised by session.commit above are caught here
2930
Session.rollback()
30-
raise
31+
raise e
3132
finally:
3233
Session.remove()
3334

src/nwnsdk/postgres/dbmodels.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
1+
from dataclasses import dataclass
12
from enum import Enum
23

34
import sqlalchemy as db
4-
55
from sqlalchemy.ext.declarative import declarative_base
6+
from sqlalchemy.dialects.postgresql import UUID
7+
8+
from nwnsdk import WorkFlowType
69

710
Base = declarative_base()
811

@@ -15,18 +18,20 @@ class JobStatus(Enum):
1518
STOPPED = "stopped"
1619

1720

21+
@dataclass
1822
class Job(Base):
1923
__tablename__ = "job"
2024

21-
job_id = db.Column(db.UUID, primary_key=True)
25+
job_id = db.Column(UUID(as_uuid=True), primary_key=True)
2226
job_name = db.Column(db.String, nullable=False)
23-
work_flow_type = db.Column(db.String, nullable=False)
24-
map_editor_user = db.Column(db.String)
25-
status = db.Column(db.String, nullable=False)
27+
work_flow_type = db.Column(db.Enum(WorkFlowType), nullable=False)
28+
user_name = db.Column(db.String)
29+
project_name = db.Column(db.String)
30+
status = db.Column(db.Enum(JobStatus), nullable=False)
2631
input_config = db.Column(db.String)
2732
input_esdl = db.Column(db.String, nullable=False)
2833
output_esdl = db.Column(db.String)
2934
added_at = db.Column(db.DateTime(timezone=True), nullable=False)
3035
running_at = db.Column(db.DateTime(timezone=True))
3136
stopped_at = db.Column(db.DateTime(timezone=True))
32-
logs = db.Column(db.DateTime(timezone=True))
37+
logs = db.Column(db.String)

0 commit comments

Comments
 (0)