Spaces:
Running
Running
Upload 5 files
Browse files- task_assignment.py +3 -3
- task_dispute_read.py +2 -2
- task_read.py +2 -2
- task_settlement.py +3 -3
- task_terms.py +14 -0
task_assignment.py
CHANGED
|
@@ -6,7 +6,7 @@ from task_projection import scoped_pending
|
|
| 6 |
from sqlalchemy.orm import Session
|
| 7 |
from models_sql import Transaction, TaskAssignment
|
| 8 |
from tip_transaction import lock_wallet_accounts
|
| 9 |
-
from task_terms import funded_amount, latest_terms
|
| 10 |
|
| 11 |
|
| 12 |
def assign_open_task(session, task_id, publisher, assignee, load_task):
|
|
@@ -30,7 +30,7 @@ def assign_open_task(session, task_id, publisher, assignee, load_task):
|
|
| 30 |
deposits = [row for row in rows if row.tx_type == 'TASK_DEPOSIT']
|
| 31 |
assignment = session.get(TaskAssignment,task_id)
|
| 32 |
if deposits:
|
| 33 |
-
if (len(deposits)!=1 or deposits[0].account!=publisher or deposits[0].related_account!=assignee
|
| 34 |
or type(deposits[0].amount) is not int or deposits[0].amount!=-deposit):
|
| 35 |
raise ValueError('task already assigned differently')
|
| 36 |
if assignment is None:
|
|
@@ -80,7 +80,7 @@ def project_assignments(bind,store,limit=50, *, task_id=None):
|
|
| 80 |
deposits=session.query(Transaction).filter(Transaction.item_id==task_id,
|
| 81 |
Transaction.tx_type=='TASK_DEPOSIT').all()
|
| 82 |
if (row.publisher!=publisher or type(row.deposit) is not int or row.deposit<0
|
| 83 |
-
or len(deposits)!=1 or deposits[0].account!=publisher
|
| 84 |
or deposits[0].related_account!=row.assignee or type(deposits[0].amount) is not int
|
| 85 |
or deposits[0].amount!=-row.deposit):
|
| 86 |
raise ValueError('assignment ledger mismatch')
|
|
|
|
| 6 |
from sqlalchemy.orm import Session
|
| 7 |
from models_sql import Transaction, TaskAssignment
|
| 8 |
from tip_transaction import lock_wallet_accounts
|
| 9 |
+
from task_terms import funded_amount, latest_terms, repeated_zero_deposits
|
| 10 |
|
| 11 |
|
| 12 |
def assign_open_task(session, task_id, publisher, assignee, load_task):
|
|
|
|
| 30 |
deposits = [row for row in rows if row.tx_type == 'TASK_DEPOSIT']
|
| 31 |
assignment = session.get(TaskAssignment,task_id)
|
| 32 |
if deposits:
|
| 33 |
+
if ((len(deposits)!=1 and not repeated_zero_deposits(deposits,publisher,assignee,deposit)) or deposits[0].account!=publisher or deposits[0].related_account!=assignee
|
| 34 |
or type(deposits[0].amount) is not int or deposits[0].amount!=-deposit):
|
| 35 |
raise ValueError('task already assigned differently')
|
| 36 |
if assignment is None:
|
|
|
|
| 80 |
deposits=session.query(Transaction).filter(Transaction.item_id==task_id,
|
| 81 |
Transaction.tx_type=='TASK_DEPOSIT').all()
|
| 82 |
if (row.publisher!=publisher or type(row.deposit) is not int or row.deposit<0
|
| 83 |
+
or (len(deposits)!=1 and not repeated_zero_deposits(deposits,publisher,row.assignee,row.deposit)) or deposits[0].account!=publisher
|
| 84 |
or deposits[0].related_account!=row.assignee or type(deposits[0].amount) is not int
|
| 85 |
or deposits[0].amount!=-row.deposit):
|
| 86 |
raise ValueError('assignment ledger mismatch')
|
task_dispute_read.py
CHANGED
|
@@ -5,7 +5,7 @@ from models_sql import TaskDisputeRecord, TaskDisputeResponseRecord, TaskResolut
|
|
| 5 |
from task_dispute import dispute_payload
|
| 6 |
from task_dispute_response import response_payload, ORIGINAL_FIELDS, RESPONSE_FIELDS
|
| 7 |
from task_resolution import validate_resolution_ledgers, validate_participants
|
| 8 |
-
from task_terms import funded_amount
|
| 9 |
|
| 10 |
|
| 11 |
class DisputeReadDenied(PermissionError):
|
|
@@ -83,7 +83,7 @@ def merged_dispute(session, source, identifier, actor, admin=False, *, records=N
|
|
| 83 |
Transaction.tx_type.like('TASK_%')).populate_existing().all()
|
| 84 |
amount = funded_amount(rows, publisher)
|
| 85 |
deposits = [r for r in rows if r.tx_type == 'TASK_DEPOSIT']
|
| 86 |
-
if (amount != resolution.amount or len(deposits) != 1 or deposits[0].account != publisher
|
| 87 |
or deposits[0].related_account != assignee or type(deposits[0].amount) is not int
|
| 88 |
or deposits[0].amount != -resolution.deposit):
|
| 89 |
raise ValueError('resolution differs from actual funding')
|
|
|
|
| 5 |
from task_dispute import dispute_payload
|
| 6 |
from task_dispute_response import response_payload, ORIGINAL_FIELDS, RESPONSE_FIELDS
|
| 7 |
from task_resolution import validate_resolution_ledgers, validate_participants
|
| 8 |
+
from task_terms import funded_amount, repeated_zero_deposits
|
| 9 |
|
| 10 |
|
| 11 |
class DisputeReadDenied(PermissionError):
|
|
|
|
| 83 |
Transaction.tx_type.like('TASK_%')).populate_existing().all()
|
| 84 |
amount = funded_amount(rows, publisher)
|
| 85 |
deposits = [r for r in rows if r.tx_type == 'TASK_DEPOSIT']
|
| 86 |
+
if (amount != resolution.amount or (len(deposits) != 1 and not repeated_zero_deposits(deposits, publisher, assignee, resolution.deposit)) or deposits[0].account != publisher
|
| 87 |
or deposits[0].related_account != assignee or type(deposits[0].amount) is not int
|
| 88 |
or deposits[0].amount != -resolution.deposit):
|
| 89 |
raise ValueError('resolution differs from actual funding')
|
task_read.py
CHANGED
|
@@ -6,7 +6,7 @@ from sqlalchemy import func
|
|
| 6 |
from models_sql import (TaskPublication, TaskRevision, TaskAssignment, TaskDelivery,
|
| 7 |
TaskDisputeRecord, TaskDisputeResponseRecord, TaskSettlement,
|
| 8 |
TaskResolution, Transaction)
|
| 9 |
-
from task_terms import validate_patch, funded_amount
|
| 10 |
from task_delivery import delivery_patch
|
| 11 |
from task_dispute import dispute_payload
|
| 12 |
from task_resolution import distribution
|
|
@@ -79,7 +79,7 @@ def merged_task(current, records, funds):
|
|
| 79 |
deposit = result.get('deposit_amount')
|
| 80 |
if type(deposit) is float and deposit.is_integer() and 0 <= deposit <= 2147483647:
|
| 81 |
deposit = int(deposit)
|
| 82 |
-
if len(deposits) != 1:
|
| 83 |
_reject_deposit('ledger_count')
|
| 84 |
if type(deposit) is not int:
|
| 85 |
_reject_deposit('deposit_type')
|
|
|
|
| 6 |
from models_sql import (TaskPublication, TaskRevision, TaskAssignment, TaskDelivery,
|
| 7 |
TaskDisputeRecord, TaskDisputeResponseRecord, TaskSettlement,
|
| 8 |
TaskResolution, Transaction)
|
| 9 |
+
from task_terms import validate_patch, funded_amount, repeated_zero_deposits
|
| 10 |
from task_delivery import delivery_patch
|
| 11 |
from task_dispute import dispute_payload
|
| 12 |
from task_resolution import distribution
|
|
|
|
| 79 |
deposit = result.get('deposit_amount')
|
| 80 |
if type(deposit) is float and deposit.is_integer() and 0 <= deposit <= 2147483647:
|
| 81 |
deposit = int(deposit)
|
| 82 |
+
if len(deposits) != 1 and not repeated_zero_deposits(deposits, publisher, assignee, deposit):
|
| 83 |
_reject_deposit('ledger_count')
|
| 84 |
if type(deposit) is not int:
|
| 85 |
_reject_deposit('deposit_type')
|
task_settlement.py
CHANGED
|
@@ -5,7 +5,7 @@ import uuid
|
|
| 5 |
from task_projection import scoped_pending
|
| 6 |
from sqlalchemy.orm import Session
|
| 7 |
from models_sql import Transaction,TaskSettlement,TaskDisputeRecord,TaskDisputeResponseRecord
|
| 8 |
-
from task_terms import funded_amount,latest_terms
|
| 9 |
from tip_transaction import lock_wallet_accounts
|
| 10 |
|
| 11 |
|
|
@@ -21,7 +21,7 @@ def settlement_terms(session,task,publisher,assignee):
|
|
| 21 |
Transaction.tx_type.like('TASK_%')).populate_existing().with_for_update().all()
|
| 22 |
amount=funded_amount(rows,publisher)
|
| 23 |
deposits=[row for row in rows if row.tx_type=='TASK_DEPOSIT']
|
| 24 |
-
if (len(deposits)!=1 or deposits[0].account!=publisher or deposits[0].related_account!=assignee
|
| 25 |
or type(deposits[0].amount) is not int or deposits[0].amount>0):
|
| 26 |
raise ValueError('invalid task deposit')
|
| 27 |
deposit=-deposits[0].amount
|
|
@@ -124,7 +124,7 @@ def project_settlements(bind,store,limit=50, *, task_id=None):
|
|
| 124 |
funds=session.query(Transaction).filter(Transaction.item_id==task_id,
|
| 125 |
Transaction.tx_type.like('TASK_%')).all()
|
| 126 |
deposits=[tx for tx in funds if tx.tx_type=='TASK_DEPOSIT']
|
| 127 |
-
if (funded_amount(funds,publisher)!=row.amount or len(deposits)!=1
|
| 128 |
or deposits[0].account!=publisher or deposits[0].related_account!=assignee
|
| 129 |
or type(deposits[0].amount) is not int or deposits[0].amount!=-row.deposit):
|
| 130 |
raise ValueError('settlement projection funding mismatch')
|
|
|
|
| 5 |
from task_projection import scoped_pending
|
| 6 |
from sqlalchemy.orm import Session
|
| 7 |
from models_sql import Transaction,TaskSettlement,TaskDisputeRecord,TaskDisputeResponseRecord
|
| 8 |
+
from task_terms import funded_amount,latest_terms,repeated_zero_deposits
|
| 9 |
from tip_transaction import lock_wallet_accounts
|
| 10 |
|
| 11 |
|
|
|
|
| 21 |
Transaction.tx_type.like('TASK_%')).populate_existing().with_for_update().all()
|
| 22 |
amount=funded_amount(rows,publisher)
|
| 23 |
deposits=[row for row in rows if row.tx_type=='TASK_DEPOSIT']
|
| 24 |
+
if ((len(deposits)!=1 and not repeated_zero_deposits(deposits,publisher,assignee,task.get('deposit_amount'))) or deposits[0].account!=publisher or deposits[0].related_account!=assignee
|
| 25 |
or type(deposits[0].amount) is not int or deposits[0].amount>0):
|
| 26 |
raise ValueError('invalid task deposit')
|
| 27 |
deposit=-deposits[0].amount
|
|
|
|
| 124 |
funds=session.query(Transaction).filter(Transaction.item_id==task_id,
|
| 125 |
Transaction.tx_type.like('TASK_%')).all()
|
| 126 |
deposits=[tx for tx in funds if tx.tx_type=='TASK_DEPOSIT']
|
| 127 |
+
if (funded_amount(funds,publisher)!=row.amount or (len(deposits)!=1 and not repeated_zero_deposits(deposits,publisher,assignee,row.deposit))
|
| 128 |
or deposits[0].account!=publisher or deposits[0].related_account!=assignee
|
| 129 |
or type(deposits[0].amount) is not int or deposits[0].amount!=-row.deposit):
|
| 130 |
raise ValueError('settlement projection funding mismatch')
|
task_terms.py
CHANGED
|
@@ -38,6 +38,20 @@ def funded_amount(rows, publisher):
|
|
| 38 |
return amount
|
| 39 |
|
| 40 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 41 |
def latest_terms(session, task):
|
| 42 |
rows = session.query(TaskRevision).filter(TaskRevision.task_id == task['id']).order_by(
|
| 43 |
TaskRevision.revision.desc()).populate_existing().with_for_update().all()
|
|
|
|
| 38 |
return amount
|
| 39 |
|
| 40 |
|
| 41 |
+
|
| 42 |
+
def repeated_zero_deposits(rows, publisher, assignee, deposit):
|
| 43 |
+
if (len(rows) < 2 or type(deposit) is not int or deposit != 0
|
| 44 |
+
or not isinstance(publisher, str) or not publisher.strip()
|
| 45 |
+
or not isinstance(assignee, str) or not assignee.strip() or publisher == assignee):
|
| 46 |
+
return False
|
| 47 |
+
identifiers = [getattr(row, 'tx_id', None) for row in rows]
|
| 48 |
+
return (all(isinstance(identifier, str) and identifier.strip() for identifier in identifiers)
|
| 49 |
+
and len(set(identifiers)) == len(identifiers)
|
| 50 |
+
and all(row.tx_type == 'TASK_DEPOSIT' and row.account == publisher
|
| 51 |
+
and row.related_account == assignee and type(row.amount) is int
|
| 52 |
+
and row.amount == 0 for row in rows))
|
| 53 |
+
|
| 54 |
+
|
| 55 |
def latest_terms(session, task):
|
| 56 |
rows = session.query(TaskRevision).filter(TaskRevision.task_id == task['id']).order_by(
|
| 57 |
TaskRevision.revision.desc()).populate_existing().with_for_update().all()
|