Skip to content

Commit

Permalink
Merge pull request #102 from rl-institut/release/v0.1.4
Browse files Browse the repository at this point in the history
Release/v0.1.4
  • Loading branch information
henhuy authored Apr 22, 2020
2 parents b2b8b2f + 4e6f386 commit b2f6a35
Show file tree
Hide file tree
Showing 52 changed files with 661 additions and 7,682 deletions.
12 changes: 10 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,21 @@ Here is a template for new release sections
### Removed
-
```
## [Unreleased]
## [0.1.4] 2020-04-20

### Added
- Short link to Stemp-Tools on landing page
- Sphinx Makefile
- dynamic title for meta app lists

### Changed

- Removed unnecessary ionicon files
- Black style
- WAM installation instructions improved (esp. for Windows) #95
- Assumptions and sources are deleted if category is deleted (cascade)

### Security
- set django version to 2.2.10

## [0.1.3] 2019-09-19

Expand Down
175 changes: 67 additions & 108 deletions db_apps/oemof_results.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@

import re
import pandas
import transaction
from sqlalchemy import (
Column, Integer, String, ARRAY, ForeignKey)
from sqlalchemy import Column, Integer, String, ARRAY, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.dialects.postgresql import DOUBLE_PRECISION
from sqlalchemy.ext.declarative import declarative_base
Expand Down Expand Up @@ -48,90 +46,49 @@


class OemofInputResult(Base):
__tablename__ = 'stemp_oemof_input_result'
__tablename__ = "stemp_oemof_input_result"

input_result_id = Column(
Integer,
primary_key=True
)
input_id = Column(Integer, ForeignKey('stemp_oemof_data.data_id'))
result_id = Column(Integer, ForeignKey('stemp_oemof_data.data_id'))
input_result_id = Column(Integer, primary_key=True)
input_id = Column(Integer, ForeignKey("stemp_oemof_data.data_id"))
result_id = Column(Integer, ForeignKey("stemp_oemof_data.data_id"))
input = relationship(
"OemofData",
backref="input",
uselist=False,
foreign_keys=[input_id],
"OemofData", backref="input", uselist=False, foreign_keys=[input_id],
)
result = relationship(
"OemofData",
backref="result",
uselist=False,
foreign_keys=[result_id],
"OemofData", backref="result", uselist=False, foreign_keys=[result_id],
)


class OemofData(Base):
__tablename__ = 'stemp_oemof_data'
__tablename__ = "stemp_oemof_data"

data_id = Column(
Integer,
primary_key=True
)
data_id = Column(Integer, primary_key=True)
scalars = relationship("OemofScalar", cascade="delete")
sequences = relationship("OemofSequence", cascade="delete")


class OemofScalar(Base):
__tablename__ = 'stemp_oemof_scalar'
__tablename__ = "stemp_oemof_scalar"

scalar_id = Column(
Integer,
primary_key=True
)
data_id = Column(
Integer, ForeignKey('stemp_oemof_data.data_id'))
from_node = Column(
String
)
to_node = Column(
String
)
attribute = Column(
String
)
value = Column(
String
)
type = Column(
String
)
scalar_id = Column(Integer, primary_key=True)
data_id = Column(Integer, ForeignKey("stemp_oemof_data.data_id"))
from_node = Column(String)
to_node = Column(String)
attribute = Column(String)
value = Column(String)
type = Column(String)


class OemofSequence(Base):
__tablename__ = 'stemp_oemof_sequence'
__tablename__ = "stemp_oemof_sequence"

sequence_id = Column(
Integer,
primary_key=True
)
data_id = Column(
Integer, ForeignKey('stemp_oemof_data.data_id'))
from_node = Column(
String
)
to_node = Column(
String,
nullable=True
)
attribute = Column(
String
)
value = Column(
ARRAY(DOUBLE_PRECISION)
)
type = Column(
String
)
sequence_id = Column(Integer, primary_key=True)
data_id = Column(Integer, ForeignKey("stemp_oemof_data.data_id"))
from_node = Column(String)
to_node = Column(String, nullable=True)
attribute = Column(String)
value = Column(ARRAY(DOUBLE_PRECISION))
type = Column(String)


def store_results(session, input_data, result_data):
Expand Down Expand Up @@ -166,34 +123,33 @@ def store_results(session, input_data, result_data):
result_data = convert_keys_to_strings(result_data)

input_result = OemofInputResult()
for input_result_attr, data in (
('input', input_data), ('result', result_data)):
for input_result_attr, data in (("input", input_data), ("result", result_data)):
scalars = []
sequences = []
for (from_node, to_node), sc_sq_dict in data.items():
for key, value in sc_sq_dict['scalars'].items():
for key, value in sc_sq_dict["scalars"].items():
scalars.append(
OemofScalar(
from_node=from_node,
to_node=to_node,
attribute=key,
value=value,
type=type(value).__name__
type=type(value).__name__,
)
)
session.add_all(scalars)
for key, series in sc_sq_dict['sequences'].items():
list_type = 'list'
for key, series in sc_sq_dict["sequences"].items():
list_type = "list"
if isinstance(series, pandas.Series):
series = series.values.tolist()
list_type = 'series'
list_type = "series"
sequences.append(
OemofSequence(
from_node=from_node,
to_node=to_node,
attribute=key,
value=series,
type=list_type
type=list_type,
)
)
session.add_all(sequences)
Expand All @@ -208,8 +164,9 @@ def store_results(session, input_data, result_data):
return result_id


def restore_results(session, input_result_id, restore_none_type=False,
advanced_label=None):
def restore_results(
session, input_result_id, restore_none_type=False, advanced_label=None
):
"""
Restores input and result data from OemofInputResult from DB
Expand All @@ -229,49 +186,47 @@ def restore_results(session, input_result_id, restore_none_type=False,
(dict, dict):
Restored input- and result-data
"""

def type_conversion(value_str, value_type):
if value_type == 'str':
if value_type == "str":
return value_str
elif value_type == 'float':
elif value_type == "float":
return float(value_str)
elif value_type == 'int':
elif value_type == "int":
return int(value_str)
elif value_type == 'bool':
elif value_type == "bool":
return bool(value_str)
else:
raise TypeError('Unknown conversion type "' + value_type + '"')

def convert_label_to_namedtuple(label):
def unpack_tuples(value):
if value.startswith('(') and value.endswith(')'):
value_list = value[1:-1].split(', ')
if value.startswith("(") and value.endswith(")"):
value_list = value[1:-1].split(", ")
if len(value_list) == 1:
single = value_list[0][:-1]
return (None, ) if single == 'None' else (single, )
return (None,) if single == "None" else (single,)
else:
return (None if v == 'None' else v for v in value_list)
return (None if v == "None" else v for v in value_list)
else:
return None if value == 'None' else value
return None if value == "None" else value

pattern = (
f"{advanced_label.__name__}\(" +
', '.join(
f"{advanced_label.__name__}\("
+ ", ".join(
[
f"{field}=(?P<{field}>[\(\)A-Za-z0-9#._\-,\ ']*)"
for field in advanced_label._fields
]
) +
"\)"
)
+ "\)"
)
try:
match = re.match(pattern, label.replace('\'', ''))
match = re.match(pattern, label.replace("'", ""))
except AttributeError:
return label
if match is not None:
fields = {
k: unpack_tuples(v)
for k, v in match.groupdict().items()
}
fields = {k: unpack_tuples(v) for k, v in match.groupdict().items()}
return advanced_label(**fields)
else:
return label
Expand All @@ -281,35 +236,39 @@ def get_nodes(scalar_or_sequence):
if advanced_label is not None:
raw_nodes = tuple(map(convert_label_to_namedtuple, raw_nodes))
if restore_none_type:
return tuple(map(lambda x: None if x == 'None' else x, raw_nodes))
return tuple(map(lambda x: None if x == "None" else x, raw_nodes))
else:
return raw_nodes

# Find results:
input_result = session.query(OemofInputResult).filter(
OemofInputResult.input_result_id == input_result_id).first()
input_result = (
session.query(OemofInputResult)
.filter(OemofInputResult.input_result_id == input_result_id)
.first()
)
if input_result is None:
raise IndexError(
'Could not find OemofInputResult with ID #' + str(input_result_id))
"Could not find OemofInputResult with ID #" + str(input_result_id)
)

input_data = {}
result_data = {}
for input_result_attr, data in (
('input', input_data), ('result', result_data)):
for input_result_attr, data in (("input", input_data), ("result", result_data)):
ir_attr = getattr(input_result, input_result_attr)
for scalar in ir_attr.scalars:
nodes = get_nodes(scalar)
if nodes not in data:
data[nodes] = {'scalars': {}, 'sequences': {}}
data[nodes]['scalars'][scalar.attribute] = type_conversion(
scalar.value, scalar.type)
data[nodes] = {"scalars": {}, "sequences": {}}
data[nodes]["scalars"][scalar.attribute] = type_conversion(
scalar.value, scalar.type
)
for sequence in ir_attr.sequences:
nodes = get_nodes(sequence)
if nodes not in data:
data[nodes] = {'scalars': {}, 'sequences': {}}
if sequence.type == 'series':
data[nodes] = {"scalars": {}, "sequences": {}}
if sequence.type == "series":
series = pandas.Series(sequence.value)
else:
series = sequence.value
data[nodes]['sequences'][sequence.attribute] = series
data[nodes]["sequences"][sequence.attribute] = series
return input_data, result_data
19 changes: 19 additions & 0 deletions doc/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Minimal makefile for Sphinx documentation
#

# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
SOURCEDIR = .
BUILDDIR = _build

# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

.PHONY: help Makefile

# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
1 change: 0 additions & 1 deletion doc/_static/run_tasks.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

from app_name import tasks


Expand Down
1 change: 0 additions & 1 deletion doc/_static/tasks.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

from wam.celery import app


Expand Down
Loading

0 comments on commit b2f6a35

Please sign in to comment.