Skip to content

Commit

Permalink
Merge pull request #16 from kukirokuk/a204388103819339_transfer_compa…
Browse files Browse the repository at this point in the history
…titive_dialogue_docs

A204388103819339 transfer compatitive dialogue docs
  • Loading branch information
vmaksymiv committed Feb 8, 2017
2 parents 01ffad5 + 2c5d908 commit 3e97329
Show file tree
Hide file tree
Showing 5 changed files with 295 additions and 15 deletions.
95 changes: 80 additions & 15 deletions docs.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@
)
from openprocurement.relocation.api.tests.base import OwnershipWebTest, test_transfer_data, OpenEUOwnershipWebTest, test_eu_tender_data, test_ua_bid_data
from openprocurement.contracting.api.tests.base import test_contract_data, test_tender_token
from openprocurement.tender.competitivedialogue.tests.base import (BaseCompetitiveDialogWebTest,
test_tender_stage2_data_ua,
test_access_token_stage1)
from openprocurement.tender.openeu.models import TENDERING_DURATION
from openprocurement.api.models import get_now
from webtest import TestApp


Expand Down Expand Up @@ -219,29 +224,29 @@ def test_docs(self):

with open('docs/source/tutorial/get-used-award-complaint-transfer.http', 'w') as self.app.file_obj:
response = self.app.get('/transfers/{}'.format(transfer['id']))

########################
# Contracting transfer #
########################

data = deepcopy(test_contract_data)
tender_token = data['tender_token']
self.app.authorization = ('Basic', ('contracting', ''))

response = self.app.post_json('/contracts', {'data': data})
self.assertEqual(response.status, '201 Created')
self.contract = response.json['data']
self.assertEqual('broker', response.json['data']['owner'])
self.contract_id = self.contract['id']

self.app.authorization = ('Basic', ('broker', ''))
with open('docs/source/tutorial/get-contract-transfer.http', 'w') as self.app.file_obj:
response = self.app.patch_json('/contracts/{}/credentials?acc_token={}'.format(self.contract_id, tender_token),
{'data': ''})
self.assertEqual(response.status, '200 OK')
token = response.json['access']['token']
self.contract_transfer = response.json['access']['transfer']

self.app.authorization = ('Basic', ('broker3', ''))
with open('docs/source/tutorial/create-contract-transfer.http', 'w') as self.app.file_obj:
response = self.app.post_json('/transfers', {"data": test_transfer_data})
Expand All @@ -251,7 +256,7 @@ def test_docs(self):
transfer_creation_date = transfer['date']
new_access_token = response.json['access']['token']
new_transfer_token = response.json['access']['transfer']

with open('docs/source/tutorial/change-contract-ownership.http', 'w') as self.app.file_obj:
response = self.app.post_json('/contracts/{}/ownership'.format(self.contract_id),
{"data": {"id": transfer['id'], 'transfer': self.contract_transfer}})
Expand Down Expand Up @@ -299,48 +304,48 @@ def test_docs(self):
self.assertEqual(response.json['data']['description'], 'new credentials works')

class EuTransferDocsTest(OpenEUOwnershipWebTest):

def setUp(self):
self.app = DumpsTestAppwebtest(
"config:tests.ini", relative_to=os.path.dirname(base_test.__file__))
self.app.RequestClass = PrefixedRequestClass
self.app.authorization = ('Basic', ('broker', ''))
self.couchdb_server = self.app.app.registry.couchdb_server
self.db = self.app.app.registry.db

def test_eu_procedure(self):
##############################
# Qualification owner change #
##############################

self.app.authorization = ('Basic', ('broker', ''))
data = deepcopy(test_eu_tender_data)
with open('docs/source/tutorial/create-tender-for-qualification.http', 'w') as self.app.file_obj:
response = self.app.post_json('/tenders?opt_pretty=1', {"data": data})
self.assertEqual(response.status, '201 Created')
tender = response.json['data']
self.tender_token = response.json['access']['token']
self.tender_id = tender['id']
self.tender_id = tender['id']
self.set_tendering_status()
#broker(tender owner) create bid
#broker(tender owner) create bid
with open('docs/source/tutorial/create-first-bid-for-qualification.http', 'w') as self.app.file_obj:
response = self.app.post_json('/tenders/{}/bids'.format(self.tender_id), test_ua_bid_data)
self.assertEqual(response.status, '201 Created')
bid1_token = response.json['access']['token']

#broker4 create bid
auth = self.app.authorization
self.app.authorization = ('Basic', ('broker4', ''))
response = self.app.post_json('/tenders/{}/bids'.format(self.tender_id), test_ua_bid_data)
self.assertEqual(response.status, '201 Created')
bid2_id = response.json['data']['id']
bid2_token = response.json['access']['token']
#broker change status to pre-qualification
#broker change status to pre-qualification
self.set_pre_qualification_status()
self.app.authorization = ('Basic', ('chronograph', ''))
response = self.app.patch_json('/tenders/{}'.format(self.tender_id), {"data": {"id": self.tender_id}})
self.app.authorization = auth

#qualifications
response = self.app.get('/tenders/{}/qualifications'.format(self.tender_id))
self.assertEqual(response.status, "200 OK")
Expand All @@ -363,7 +368,7 @@ def test_eu_procedure(self):
self.assertEqual(response.status, '201 Created')
complaint_id = response.json["data"]["id"]
complaint_transfer = response.json['access']['transfer']

# broker4 create Transfer
self.app.authorization = ('Basic', ('broker4', ''))
with open('docs/source/tutorial/create-qualification-complaint-transfer.http', 'w') as self.app.file_obj:
Expand All @@ -378,3 +383,63 @@ def test_eu_procedure(self):
response = self.app.post_json('/tenders/{}/qualifications/{}/complaints/{}/ownership'.format(self.tender_id, qualification_id, complaint_id),
{"data": {"id": transfer['id'], 'transfer': complaint_transfer}})
self.assertEqual(response.status, '200 OK')


class CompetitiveDialogueStage2TransferDocsTest(BaseCompetitiveDialogWebTest):

def setUp(self):
self.app = DumpsTestAppwebtest(
"config:tests.ini", relative_to=os.path.dirname(base_test.__file__))
self.app.RequestClass = PrefixedRequestClass
self.app.authorization = ('Basic', ('broker', ''))
self.couchdb_server = self.app.app.registry.couchdb_server
self.db = self.app.app.registry.db

def test_stage2(self):

# create tender with bridge
self.app.authorization = ('Basic', ('competitive_dialogue', ''))
response = self.app.post_json('/tenders?opt_pretty=1', {"data": test_tender_stage2_data_ua})
self.assertEqual(response.status, '201 Created')
self.tender_id = response.json['data']['id']
tender = response.json['data']

# get credentials of tender
self.app.authorization = ('Basic', ('broker', ''))
self.set_status('draft.stage2')


response = self.app.patch_json('/tenders/{}/credentials?acc_token={}&opt_pretty=1'.format(self.tender_id, test_access_token_stage1))
self.assertEqual(response.status, '200 OK')
self.assertEqual(response.json['data']['status'], 'draft.stage2')
tender_transfer_token = response.json['access']['transfer']

# change tender owner
self.app.authorization = ('Basic', ('broker3', ''))
with open('docs/source/tutorial/create-transfer-stage2.http', 'w') as self.app.file_obj:
response = self.app.post_json('/transfers', {"data": test_transfer_data})
self.assertEqual(response.status, '201 Created')
transfer = response.json['data']
self.assertIn('date', transfer)
new_access_token = response.json['access']['token']
new_transfer_token = response.json['access']['transfer']

with open('docs/source/tutorial/change-tender-ownership-stage2.http', 'w') as self.app.file_obj:
response = self.app.post_json('/tenders/{}/ownership'.format(self.tender_id),
{"data": {"id": transfer['id'], 'transfer': tender_transfer_token}})
self.assertEqual(response.status, '200 OK')
self.assertNotIn('transfer', response.json['data'])
self.assertNotIn('transfer_token', response.json['data'])
self.assertEqual('broker3', response.json['data']['owner'])

# broker3 can change the tender
with open('docs/source/tutorial/modify-tender-stage2.http', 'w') as self.app.file_obj:
now = get_now()
response = self.app.patch_json('/tenders/{}?acc_token={}'.format(self.tender_id, new_access_token),
{"data": {"tenderPeriod": {"endDate": (now + TENDERING_DURATION).isoformat()}}})
self.assertEqual(response.status, '200 OK')
self.assertNotIn('transfer', response.json['data'])
self.assertNotIn('transfer_token', response.json['data'])
self.assertIn('owner', response.json['data'])
self.assertEqual(response.json['data']['owner'], 'broker3')
self.assertEqual(response.json['data']["tenderPeriod"]['endDate'], (now + TENDERING_DURATION).isoformat())
42 changes: 42 additions & 0 deletions docs/source/tutorial.rst
Original file line number Diff line number Diff line change
Expand Up @@ -328,3 +328,45 @@ New broker should send POST request to the appropriate `/tenders/id/qualificatio

.. include:: tutorial/change-qualification-complaint-owner.http
:code:

Examples for Сompetitive Dialogue procedure
-------------------------------------------

Stage1 procedure
~~~~~~~~~~~~~~~~

Changing owner of tender in stage 1 is similar to Open UA or Open EU tenders procedure.

Stage2 procedure
~~~~~~~~~~~~~~~~

To change second stage tender owner, we need transfer token received during getting access to second stage tender. `Get token for second stage <http://openprocurementtendercompetitivedialogue.readthedocs.io/en/latest/tutorial.html#get-token-for-second-stage>`

Transfer creation
^^^^^^^^^^^^^^^^^

Broker that is going to become new tender owner should create a `Transfer`.

.. include:: tutorial/create-transfer-stage2.http
:code:

`Transfer` object contains new access ``token`` and new ``transfer`` token for the tender that will be transferred to new broker.


Changing tender's stage2 owner
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Pay attention that only broker with appropriate accreditation level can become new owner. Otherwise broker will be forbidden from this action.

To change tender's ownership new broker should send POST request to appropriate `/tenders/<tender_id>/ownership` with `data` section containing ``id`` of `Transfer` and ``transfer`` token received from previous PATCH request to `tender/<tender_id>/credentials?acc_token=<acc_token>`.

.. include:: tutorial/change-tender-ownership-stage2.http
:code:

Updated ``owner`` value indicates that ownership is successfully changed.

Note that new broker has to provide its customer with new ``transfer`` key (generated in `Transfer` object).

Let's try to change the tender using ``token`` received on `Transfer` creation:

.. include:: tutorial/modify-tender-stage2.http
:code:
13 changes: 13 additions & 0 deletions docs/source/tutorial/change-tender-ownership-stage2.http
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
POST /api/2.3/tenders/d2344d0c92f44741b5d0772abb62bf64/ownership HTTP/1.0
Authorization: Basic YnJva2VyMzo=
Content-Length: 100
Content-Type: application/json
Host: api-sandbox.openprocurement.org
DATA:
{
"data": {
"transfer": "a94cad539be54d208d905ddc12e410f8",
"id": "e89c01f817fb9640daa2244a7c0393e3"
}
}

23 changes: 23 additions & 0 deletions docs/source/tutorial/create-transfer-stage2.http
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
POST /api/2.3/transfers HTTP/1.0
Authorization: Basic YnJva2VyMzo=
Content-Length: 12
Content-Type: application/json
Host: api-sandbox.openprocurement.org
DATA:
{
"data": {}
}

Response: 201 Created
Content-Type: application/json; charset=UTF-8
{
"access": {
"transfer": "7cb4384b8649499bac5d3a3a6493e808",
"token": "7383c92f33ce461dbf5e4acec9c6ab30"
},
"data": {
"date": "2017-02-07T12:00:20.239540+02:00",
"id": "e89c01f817fb9640daa2244a7c0393e3"
}
}

0 comments on commit 3e97329

Please sign in to comment.