def put(self): """Tender Document Update""" tender = self.request.validated['tender'] first_document = self.request.validated['documents'][0] if tender.status != 'active.enquiries': self.request.errors.add('body', 'data', 'Can\'t update document in current tender status') self.request.errors.status = 403 return if self.request.content_type == 'multipart/form-data': data = self.request.validated['file'] filename = data.filename content_type = data.type in_file = data.file else: filename = first_document.title content_type = self.request.content_type in_file = self.request.body_file document = Document() document.id = self.request.validated['id'] document.title = filename document.format = content_type document.datePublished = first_document.datePublished key = generate_id() document.url = self.request.route_url('Tender Documents', tender_id=tender.id, id=document.id, _query={'download': key}) src = tender.serialize("plain") tender.documents.append(document) upload_file(tender, document, key, in_file, self.request) save_tender(tender, src, self.request) return {'data': document.serialize("view")}
def put(self): """Tender Complaint Document Update""" tender = self.request.validated['tender'] if tender.status not in ['active.enquiries', 'active.tendering', 'active.auction', 'active.qualification', 'active.awarded']: self.request.errors.add('body', 'data', 'Can\'t update document in current tender status') self.request.errors.status = 403 return first_document = self.request.validated['documents'][0] src = tender.serialize("plain") if self.request.content_type == 'multipart/form-data': data = self.request.validated['file'] filename = data.filename content_type = data.type in_file = data.file else: filename = first_document.title content_type = self.request.content_type in_file = self.request.body_file document = Document() document.id = self.request.matchdict['id'] document.title = filename document.format = content_type document.datePublished = first_document.datePublished key = generate_id() document.url = self.request.route_url('Tender Complaint Documents', tender_id=tender.id, complaint_id=self.request.validated['complaint_id'], id=document.id, _query={'download': key}) self.request.validated['complaint'].documents.append(document) upload_file(tender, document, key, in_file, self.request) save_tender(tender, src, self.request) return {'data': document.serialize("view")}
def collection_post(self): """Tender Bid Document Upload """ tender = self.request.validated['tender'] if tender.status not in [ 'active.tendering', 'active.auction', 'active.qualification' ]: self.request.errors.add( 'body', 'data', 'Can\'t add document in current tender status') self.request.errors.status = 403 return src = tender.serialize("plain") data = self.request.validated['file'] document = Document() document.id = generate_id() document.title = data.filename document.format = data.type key = generate_id() document.url = self.request.route_url( 'Tender Bid Documents', tender_id=tender.id, bid_id=self.request.validated['bid_id'], id=document.id, _query={'download': key}) self.request.validated['bid'].documents.append(document) upload_file(tender, document, key, data.file, self.request) save_tender(tender, src, self.request) self.request.response.status = 201 self.request.response.headers['Location'] = self.request.route_url( 'Tender Bid Documents', tender_id=tender.id, bid_id=self.request.validated['bid_id'], id=document.id) return {'data': document.serialize("view")}
def upload_file(request): first_document = request.validated['documents'][0] if 'documents' in request.validated and request.validated['documents'] else None if request.content_type == 'multipart/form-data': data = request.validated['file'] filename = get_filename(data) content_type = data.type in_file = data.file else: filename = first_document.title content_type = request.content_type in_file = request.body_file document = Document({ 'title': filename, 'format': content_type }) document.__parent__ = request.context if 'document_id' in request.validated: document.id = request.validated['document_id'] if first_document: document.datePublished = first_document.datePublished key = generate_id() document_route = request.matched_route.name.replace("collection_", "") document_path = request.current_route_path(_route_name=document_route, document_id=document.id, _query={'download': key}) document.url = '/tenders' + document_path.split('/tenders', 1)[1] conn = getattr(request.registry, 's3_connection', None) if conn: bucket = conn.get_bucket(request.registry.bucket_name) filename = "{}/{}/{}".format(request.validated['tender_id'], document.id, key) key = bucket.new_key(filename) key.set_metadata('Content-Type', document.format) key.set_metadata("Content-Disposition", build_header(document.title, filename_compat=quote(document.title.encode('utf-8')))) key.set_contents_from_file(in_file) key.set_acl('private') else: filename = "{}_{}".format(document.id, key) request.validated['tender']['_attachments'][filename] = { "content_type": document.format, "data": b64encode(in_file.read()) } return document
def upload_file(request): first_document = request.validated['documents'][0] if 'documents' in request.validated and request.validated['documents'] else None if request.content_type == 'multipart/form-data': data = request.validated['file'] filename = get_filename(data) content_type = data.type in_file = data.file else: filename = first_document.title content_type = request.content_type in_file = request.body_file document = Document({ 'title': filename, 'format': content_type }) if 'document_id' in request.validated: document.id = request.validated['document_id'] if first_document: document.datePublished = first_document.datePublished key = generate_id() document_route = request.matched_route.name.replace("collection_", "") document_path = request.current_route_path(_route_name=document_route, document_id=document.id, _query={'download': key}) document.url = '/tenders' + document_path.split('/tenders', 1)[1] conn = getattr(request.registry, 's3_connection', None) if conn: bucket = conn.get_bucket(request.registry.bucket_name) filename = "{}/{}/{}".format(request.validated['tender_id'], document.id, key) key = bucket.new_key(filename) key.set_metadata('Content-Type', document.format) key.set_metadata("Content-Disposition", build_header(document.title, filename_compat=quote(document.title.encode('utf-8')))) key.set_contents_from_file(in_file) key.set_acl('private') else: filename = "{}_{}".format(document.id, key) request.validated['tender']['_attachments'][filename] = { "content_type": document.format, "data": b64encode(in_file.read()) } return document
def collection_post(self): """Tender Document Upload""" tender = self.request.validated['tender'] if tender.status != 'active.enquiries': self.request.errors.add('body', 'data', 'Can\'t add document in current tender status') self.request.errors.status = 403 return src = tender.serialize("plain") data = self.request.validated['file'] document = Document() document.id = generate_id() document.title = data.filename document.format = data.type key = generate_id() document.url = self.request.route_url('Tender Documents', tender_id=tender.id, id=document.id, _query={'download': key}) tender.documents.append(document) upload_file(tender, document, key, data.file, self.request) save_tender(tender, src, self.request) self.request.response.status = 201 self.request.response.headers['Location'] = self.request.route_url('Tender Documents', tender_id=tender.id, id=document.id) return {'data': document.serialize("view")}