diff --git a/ereuse_devicehub/migrations/versions/1bb2b5e0fae7_change_action_device.py b/ereuse_devicehub/migrations/versions/1bb2b5e0fae7_change_action_device.py new file mode 100644 index 00000000..2f3a4ce0 --- /dev/null +++ b/ereuse_devicehub/migrations/versions/1bb2b5e0fae7_change_action_device.py @@ -0,0 +1,56 @@ +""" +change action_device + +Revision ID: 1bb2b5e0fae7 +Revises: a0978ac6cf4a +Create Date: 2021-11-04 10:32:49.116399 + +""" +import sqlalchemy as sa +from alembic import context +from alembic import op +from sqlalchemy.dialects import postgresql + + +# revision identifiers, used by Alembic. +revision = '1bb2b5e0fae7' +down_revision = 'a0978ac6cf4a' +branch_labels = None +depends_on = None + + +def get_inv(): + INV = context.get_x_argument(as_dictionary=True).get('inventory') + if not INV: + raise ValueError("Inventory value is not specified") + return INV + + +def upgrade_data(): + con = op.get_bind() + + values = f"action_id, {get_inv()}.action.created" + table = f"{get_inv()}.action_device" + joins = f"inner join {get_inv()}.action" + on = f"on {get_inv()}.action_device.action_id = {get_inv()}.action.id" + sql = f"select {values} from {table} {joins} {on}" + + actions_devs = con.execute(sql) + for a in actions_devs: + action_id = a.action_id + created = a.created + sql = f"update {get_inv()}.action_device set created='{created}' where action_id='{action_id}';" + con.execute(sql) + + +def upgrade(): + op.add_column('action_device', + sa.Column('created', sa.TIMESTAMP(timezone=True), server_default=sa.text('CURRENT_TIMESTAMP'), + nullable=False, comment='When Devicehub created this.'), + schema=f'{get_inv()}') + + upgrade_data() + + +def downgrade(): + op.drop_column('action_device', 'created', schema=f'{get_inv()}') diff --git a/ereuse_devicehub/resources/action/models.py b/ereuse_devicehub/resources/action/models.py index fbc05234..5cd678db 100644 --- a/ereuse_devicehub/resources/action/models.py +++ b/ereuse_devicehub/resources/action/models.py @@ -304,6 +304,23 @@ class ActionDevice(db.Model): device_id = Column(BigInteger, ForeignKey(Device.id), primary_key=True) action_id = Column(UUID(as_uuid=True), ForeignKey(ActionWithMultipleDevices.id), primary_key=True) + device = relationship(Device, + backref=backref('actions_device', + lazy=True), + primaryjoin=Device.id == device_id) + action = relationship(Action, + backref=backref('actions_device', + lazy=True), + primaryjoin=Action.id == action_id) + created = db.Column(db.TIMESTAMP(timezone=True), + nullable=False, + index=True, + server_default=db.text('CURRENT_TIMESTAMP')) + created.comment = """When Devicehub created this.""" + + def __init__(self, **kwargs) -> None: + self.created = kwargs.get('created', datetime.now(timezone.utc)) + super().__init__(**kwargs) class ActionWithMultipleTradeDocuments(ActionWithMultipleDevices): diff --git a/ereuse_devicehub/resources/device/metrics.py b/ereuse_devicehub/resources/device/metrics.py index bbc2f470..a9c84a44 100644 --- a/ereuse_devicehub/resources/device/metrics.py +++ b/ereuse_devicehub/resources/device/metrics.py @@ -5,7 +5,7 @@ class MetricsMix: """we want get the data metrics of one device""" def __init__(self, *args, **kwargs): - self.actions.sort(key=lambda x: x.created) + # self.actions.sort(key=lambda x: x.created) self.rows = [] self.lifetime = 0 self.last_trade = None @@ -15,6 +15,7 @@ class MetricsMix: self.act = None self.end_users = 0 self.final_user_code = '' + self.trades = {} def get_template_row(self): """ @@ -76,16 +77,7 @@ class Metrics(MetricsMix): self.rows.append(row) return - # if self.last_trade['trade_supplier'] == self.act.rol_user.email: - # self.last_trade['status_supplier'] = self.act.type - # self.last_trade['status_supplier_created'] = self.act.created - # return - - # if self.last_trade['trade_receiver'] == self.act.rol_user.email: - # self.last_trade['status_receiver'] = self.act.type - # self.last_trade['status_receiver_created'] = self.act.created - # return - + # import pdb; pdb.set_trace() if self.last_trade['trade_supplier'] == self.act.author.email: self.last_trade['status_supplier'] = self.act.type self.last_trade['status_supplier_created'] = self.act.created @@ -96,7 +88,6 @@ class Metrics(MetricsMix): self.last_trade['status_receiver_created'] = self.act.created return - def get_snapshot(self): """ If there are one snapshot get the last lifetime for to do a calcul of time of use. @@ -109,6 +100,7 @@ class Metrics(MetricsMix): """ If the action is one Allocate, need modify the row base. """ + self.action_create_by = 'Receiver' self.end_users = self.act.end_users self.final_user_code = self.act.final_user_code row = self.get_template_row() @@ -124,6 +116,7 @@ class Metrics(MetricsMix): """ If the action is one Live, need modify the row base. """ + self.action_create_by = 'Receiver' row = self.get_template_row() row['type'] = 'Live' row['finalUserCode'] = self.final_user_code @@ -139,6 +132,7 @@ class Metrics(MetricsMix): """ If the action is one Dellocate, need modify the row base. """ + self.action_create_by = 'Receiver' row = self.get_template_row() row['type'] = 'Deallocate' row['start'] = self.act.start_time @@ -159,15 +153,18 @@ class Metrics(MetricsMix): """ if self.act.author == self.act.user_from: self.action_create_by = 'Supplier' + self.status_receiver = '' + row = self.get_template_row() self.last_trade = row row['type'] = 'Trade' row['action_type'] = 'Trade' row['trade_supplier'] = self.act.user_from.email row['trade_receiver'] = self.act.user_to.email - row['status_receiver'] = '' + row['status_receiver'] = self.status_receiver row['status_supplier'] = '' row['trade_confirmed'] = self.get_confirms() + self.trades[self.act.created] = row self.rows.append(row) def get_metrics(self): diff --git a/ereuse_devicehub/resources/device/models.py b/ereuse_devicehub/resources/device/models.py index 473ca640..d30df4f8 100644 --- a/ereuse_devicehub/resources/device/models.py +++ b/ereuse_devicehub/resources/device/models.py @@ -171,7 +171,16 @@ class Device(Thing): Actions are returned by descending ``created`` time. """ - return sorted(chain(self.actions_multiple, self.actions_one), key=lambda x: x.created) + actions_multiple = copy.copy(self.actions_multiple) + actions_one = copy.copy(self.actions_one) + + for ac in actions_multiple: + ac.real_created = ac.actions_device[0].created + + for ac in actions_one: + ac.real_created = ac.created + + return sorted(chain(actions_multiple, actions_one), key=lambda x: x.real_created) @property def problems(self): diff --git a/ereuse_devicehub/resources/documents/device_row.py b/ereuse_devicehub/resources/documents/device_row.py index de550d91..26eecd21 100644 --- a/ereuse_devicehub/resources/documents/device_row.py +++ b/ereuse_devicehub/resources/documents/device_row.py @@ -435,7 +435,7 @@ class ActionRow(OrderedDict): self['Action-User-LastOwner-Receiver'] = allocate['trade_receiver'] self['Action-Create-By'] = allocate['action_create_by'] self['Trade-Confirmed'] = allocate['trade_confirmed'] - self['Status-Supplier'] = allocate['status_supplier'] + self['Status-Created-By-Supplier-About-Reciber'] = allocate['status_supplier'] self['Status-Receiver'] = allocate['status_receiver'] self['Status Supplier – Created Date'] = allocate['status_supplier_created'] self['Status Receiver – Created Date'] = allocate['status_receiver_created'] diff --git a/tests/test_metrics.py b/tests/test_metrics.py index 191c988f..6ad7a516 100644 --- a/tests/test_metrics.py +++ b/tests/test_metrics.py @@ -134,7 +134,7 @@ def test_metrics_action_status(user: UserClient, user2: UserClient): item='actions/', accept='text/csv', query=[('filter', {'type': ['Computer']})]) - head = 'DHID;Hid;Document-Name;Action-Type;Action-User-LastOwner-Supplier;Action-User-LastOwner-Receiver;Action-Create-By;Trade-Confirmed;Status-Supplier;Status-Receiver;Status Supplier – Created Date;Status Receiver – Created Date;Trade-Weight;Action-Create;Allocate-Start;Allocate-User-Code;Allocate-NumUsers;UsageTimeAllocate;Type;LiveCreate;UsageTimeHdd\n' + head = 'DHID;Hid;Document-Name;Action-Type;Action-User-LastOwner-Supplier;Action-User-LastOwner-Receiver;Action-Create-By;Trade-Confirmed;Status-Created-By-Supplier-About-Reciber;Status-Receiver;Status Supplier – Created Date;Status Receiver – Created Date;Trade-Weight;Action-Create;Allocate-Start;Allocate-User-Code;Allocate-NumUsers;UsageTimeAllocate;Type;LiveCreate;UsageTimeHdd\n' body = 'O48N2;desktop-lenovo-9644w8n-0169622-00:1a:6b:5e:7f:10;;Status;;foo@foo.com;Receiver;;;Use;;' assert head in csv_str assert body in csv_str