|
| 1 | +import copy |
1 | 2 | from typing import Any, ClassVar
|
2 | 3 |
|
3 |
| -import pandas as pd |
4 | 4 | from sqlalchemy.orm import validates
|
5 | 5 |
|
6 | 6 | from ixmp4 import db
|
7 | 7 | from ixmp4.data import types
|
8 | 8 | from ixmp4.data.abstract import optimization as abstract
|
9 | 9 |
|
10 |
| -from .. import Column, base |
| 10 | +from .. import Column, base, utils |
11 | 11 |
|
12 | 12 |
|
13 |
| -class Parameter(base.BaseModel, base.OptimizationDataMixin, base.UniqueNameRunIDMixin): |
| 13 | +class Parameter(base.BaseModel): |
14 | 14 | # NOTE: These might be mixin-able, but would require some abstraction
|
15 | 15 | NotFound: ClassVar = abstract.Parameter.NotFound
|
16 | 16 | NotUnique: ClassVar = abstract.Parameter.NotUnique
|
17 | 17 | DeletionPrevented: ClassVar = abstract.Parameter.DeletionPrevented
|
18 | 18 |
|
19 | 19 | # constrained_to_indexsets: ClassVar[list[str] | None] = None
|
20 | 20 |
|
21 |
| - # TODO Same as in table/model.py |
22 |
| - columns: types.Mapped[list["Column"]] = db.relationship() # type: ignore |
| 21 | + run__id: types.RunId |
| 22 | + columns: types.Mapped[list["Column"]] = db.relationship() |
| 23 | + data: types.JsonDict = db.Column(db.JsonType, nullable=False, default={}) |
23 | 24 |
|
24 | 25 | @validates("data")
|
25 | 26 | def validate_data(self, key, data: dict[str, Any]):
|
26 |
| - data_frame: pd.DataFrame = pd.DataFrame.from_dict(data) |
27 |
| - data_frame_to_validate = data_frame.drop(columns=["values", "units"]) |
28 |
| - |
29 |
| - self._validate_data(data_frame=data_frame_to_validate, data=data) |
30 |
| - return data_frame.to_dict(orient="list") |
| 27 | + data_to_validate = copy.deepcopy(data) |
| 28 | + del data_to_validate["values"] |
| 29 | + del data_to_validate["units"] |
| 30 | + _ = utils.validate_data( |
| 31 | + key=key, |
| 32 | + data=data_to_validate, |
| 33 | + columns=self.columns, |
| 34 | + ) |
| 35 | + return data |
| 36 | + |
| 37 | + __table_args__ = (db.UniqueConstraint("name", "run__id"),) |
0 commit comments