ZHIWEI666 commited on
Commit
06157f4
·
verified ·
1 Parent(s): b2717b9

Upload 5 files

Browse files
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()