def __call__(self): jsondata = self.request.get(REQUEST_KEY) data = encode_after_json(json.loads(jsondata)) committee = Oguid.parse(data['committee_oguid']).resolve_object() proposal_oguid = Oguid.parse(data['proposal_oguid']) proposal = meeting_service().fetch_proposal_by_oguid(proposal_oguid) with elevated_privileges(): submitted_proposal = SubmittedProposal.create(proposal, committee) # XXX use Transporter API? collector = getMultiAdapter((submitted_proposal,), IDataCollector, name='field-data') data['field-data']['ISubmittedProposal'] = data['field-data'].pop( 'IProposal') collector.insert(data['field-data']) # XXX fix data types in transporter submitted_proposal.date_of_submission = date.today() # sync data to proposal after inserting field data submitted_proposal.sync_model(proposal_model=proposal) submitted_proposal.create_proposal_document( filename=data['file']['filename'], content_type=data['file']['contentType'].encode('utf-8'), data=base64.decodestring(data['file']['data'])) history_data = advancedjson.loads(self.request.get('history_data')) IHistory(submitted_proposal).append_record( u'submitted', uuid=history_data['uuid']) self.request.response.setHeader("Content-type", "application/json") return json.dumps( {'path': '/'.join(submitted_proposal.getPhysicalPath())})
def __call__(self): jsondata = self.request.get(REQUEST_KEY) data = encode_after_json(json.loads(jsondata)) committee = Oguid.parse(data['committee_oguid']).resolve_object() proposal_oguid = Oguid.parse(data['proposal_oguid']) proposal = meeting_service().fetch_proposal_by_oguid(proposal_oguid) with elevated_privileges(): submitted_proposal = SubmittedProposal.create(proposal, committee) # XXX use Transporter API? collector = getMultiAdapter((submitted_proposal, ), IDataCollector, name='field-data') data['field-data']['ISubmittedProposal'] = data['field-data'].pop( 'IProposal') collector.insert(data['field-data']) # XXX fix data types in transporter submitted_proposal.date_of_submission = date.today() # sync data to proposal after inserting field data submitted_proposal.sync_model(proposal_model=proposal) submitted_proposal.create_proposal_document( filename=data['file']['filename'], content_type=data['file']['contentType'].encode('utf-8'), data=base64.decodestring(data['file']['data'])) history_data = advancedjson.loads(self.request.get('history_data')) IHistory(submitted_proposal).append_record( u'submitted', uuid=history_data['uuid']) self.request.response.setHeader("Content-type", "application/json") return json.dumps( {'path': '/'.join(submitted_proposal.getPhysicalPath())})
def render(self): jsondata = self.request.get(REQUEST_KEY) data = json.loads(jsondata) committee = Oguid.parse(data['committee_oguid']).resolve_object() proposal_oguid = Oguid.parse(data['proposal_oguid']) proposal = meeting_service().fetch_proposal_by_oguid(proposal_oguid) with elevated_privileges(): submitted_proposal = SubmittedProposal.create(proposal, committee) self.request.response.setHeader("Content-type", "application/json") return json.dumps( {'path': '/'.join(submitted_proposal.getPhysicalPath())})
def by_oguid(self, oguid): """Returns the task identified by the given int_id and admin_unit_id or None """ if isinstance(oguid, basestring): oguid = Oguid.parse(oguid) return self.filter_by(oguid=oguid).first()
def sync_with_proposal(self, proposal): """Sync self with a plone proposal instance.""" from opengever.meeting.model.committee import Committee reference_number = proposal.get_main_dossier_reference_number() repository_folder_title = safe_unicode( proposal.get_repository_folder_title()) committee = Committee.get_one( oguid=Oguid.parse(proposal.committee_oguid)) # temporarily use mapping from plone workflow state to model workflow # state workflow_state = api.content.get_state(proposal) new_sql_state = self.WORKFLOW_STATE_TO_SQL_STATE.get(workflow_state) if new_sql_state: self.workflow_state = new_sql_state self.committee = committee self.language = proposal.language self.physical_path = proposal.get_physical_path() self.dossier_reference_number = reference_number self.repository_folder_title = repository_folder_title self.title = proposal.title self.issuer = proposal.issuer self.description = proposal.description self.date_of_submission = proposal.date_of_submission
def by_oguid(self, oguid): """Returns the task identified by the given int_id and admin_unit_id or None """ if isinstance(oguid, basestring): oguid = Oguid.parse(oguid) return self.filter_by(oguid=oguid).first()
def render(self): jsondata = self.request.get(REQUEST_KEY) data = json.loads(jsondata) committee = Oguid.parse(data['committee_oguid']).resolve_object() proposal_oguid = Oguid.parse(data['proposal_oguid']) proposal = meeting_service().fetch_proposal_by_oguid(proposal_oguid) with elevated_privileges(): submitted_proposal = SubmittedProposal.create(proposal, committee) if is_word_meeting_implementation_enabled(): submitted_proposal.create_proposal_document( filename=data['file']['filename'], content_type=data['file']['contentType'].encode('utf-8'), data=base64.decodestring(data['file']['data'])) self.request.response.setHeader("Content-type", "application/json") return json.dumps( {'path': '/'.join(submitted_proposal.getPhysicalPath())})
def render(self): oguid = Oguid.parse(self.request.get('oguid')) if self._is_on_different_admin_unit(oguid.admin_unit_id): admin_unit = ogds_service().fetch_admin_unit(oguid.admin_unit_id) url = self.url_for(oguid, admin_unit) return self.request.RESPONSE.redirect(url) obj = self._get_object(oguid.int_id) return self.request.RESPONSE.redirect(obj.absolute_url())
def render(self): oguid = Oguid.parse(self.request.get('oguid')) if self._is_on_different_admin_unit(oguid.admin_unit_id): admin_unit = ogds_service().fetch_admin_unit(oguid.admin_unit_id) url = self.url_for(oguid, admin_unit) return self.request.RESPONSE.redirect(url) obj = self._get_object(oguid.int_id) return self.request.RESPONSE.redirect(obj.absolute_url())
def get_committee(self, context): if isinstance(context, SchemaValidationData): # Proposal is being added through the REST-API. oguid = Oguid.parse(context.committee_oguid) return Committee.query.get_by_oguid(oguid) committees = context.REQUEST.form.get('form.widgets.committee', None) if committees: return Committee.query.filter_by( committee_id=int(committees[0])).one() return None
def test_add_favorite(self): favorite = Favorite( oguid=Oguid.parse('fd:123'), userid=self.regular_user.getId(), title=u'Testposition 1', position=2, portal_type='opengever.repositoryfolder.repositoryfolder', icon_class='contenttype-opengever-repository-repositoryfolder', plone_uid='127bad76e535451493bb5172c28eb38d') create_session().add(favorite) self.assertEqual(1, Favorite.query.count()) self.assertEqual(u'Testposition 1', Favorite.query.one().title)
def test_add_favorite(self): favorite = Favorite( oguid=Oguid.parse('fd:123'), userid=self.regular_user.getId(), title=u'Testposition 1', position=2, portal_type='opengever.repositoryfolder.repositoryfolder', icon_class='contenttype-opengever-repository-repositoryfolder', plone_uid='127bad76e535451493bb5172c28eb38d') create_session().add(favorite) self.assertEqual(1, Favorite.query.count()) self.assertEqual(u'Testposition 1', Favorite.query.one().title)
def lookup_object(dataself, data): if data.get('oguid'): oguid = Oguid.parse(data.get('oguid')) obj = oguid.resolve_object() elif data.get('uid'): uid = data.get('uid') catalog = api.portal.get_tool('portal_catalog') brains = catalog(UID=uid) if brains: obj = brains[0].getObject() if not obj: raise BadRequest('Invalid oguid/uid object could not be resolved.') return obj
def test_unique_constraint(self): data = { 'oguid': Oguid.parse('fd:123'), 'userid': self.regular_user.getId(), 'title': u'Testposition 1', 'position': 2, 'portal_type': 'opengever.repositoryfolder.repositoryfolder', 'icon_class': 'contenttype-opengever-repository-repositoryfolder', 'plone_uid': '127bad76e535451493bb5172c28eb38d'} session = create_session() session.add(Favorite(**data)) with self.assertRaises(IntegrityError): session.add(Favorite(**data)) session.flush()
def test_unique_constraint(self): data = { 'oguid': Oguid.parse('fd:123'), 'userid': self.regular_user.getId(), 'title': u'Testposition 1', 'position': 2, 'portal_type': 'opengever.repositoryfolder.repositoryfolder', 'icon_class': 'contenttype-opengever-repository-repositoryfolder', 'plone_uid': '127bad76e535451493bb5172c28eb38d'} session = create_session() session.add(Favorite(**data)) with self.assertRaises(IntegrityError): session.add(Favorite(**data)) session.flush()
def serialize(self): data = {'principal': self.principal, 'roles': self.roles, 'cause': { 'id': self.cause, 'title': translate( self.cause_title(), context=getRequest())}, 'reference': None} if self.reference: reference_obj = Oguid.parse(self.reference).resolve_object() data['reference'] = { 'url': reference_obj.absolute_url(), 'title': reference_obj.Title().decode('utf-8')} return data
def handle_continue(self, action): data, errors = self.extractData() if not errors: oguid = self.request.get('oguid') key = 'accept:%s' % oguid dm = getUtility(IWizardDataStorage) text = dm.get(key, 'text') # forwarding if dm.get(key, 'is_forwarding'): if dm.get(key, 'is_only_assign'): transition_data = { 'text': text, 'dossier': IUUID(data['dossier'])} wftool = api.portal.get_tool('portal_workflow') task = wftool.doActionFor( Oguid.parse(oguid).resolve_object(), 'forwarding-transition-assign-to-dossier', comment=transition_data['text'], transition_params=transition_data) IStatusMessage(self.request).addStatusMessage( _(u'The forwarding is now assigned to the dossier'), 'info') self.request.RESPONSE.redirect( '%s/edit' % task.absolute_url()) else: task = accept_forwarding_with_successor( self.context, oguid, text, dossier=data['dossier']) IStatusMessage(self.request).addStatusMessage( _(u'The forwarding has been stored in the local inbox ' u'and the succesor task has been created'), 'info') self.request.RESPONSE.redirect( '%s/edit' % task.absolute_url()) # task else: task = accept_task_with_successor( data['dossier'], oguid, text) IStatusMessage(self.request).addStatusMessage( _(u'The task has been copied to the selected dossier and ' u'accepted.'), 'info') self.request.RESPONSE.redirect(task.absolute_url())
def __call__(self): if not self.oguid_str: self.oguid_str = self.request.get('oguid') oguid = Oguid.parse(self.oguid_str) if self._is_on_different_admin_unit(oguid.admin_unit_id): admin_unit = ogds_service().fetch_admin_unit(oguid.admin_unit_id) url = self.url_for(oguid, admin_unit, self.view_name) else: obj = self._get_object(oguid.int_id) url = obj.absolute_url() if self.view_name: url = '/'.join((url, self.view_name)) return self.request.RESPONSE.redirect(self.preserve_query_string(url))
def __call__(self): if not self.oguid_str: self.oguid_str = self.request.get('oguid') oguid = Oguid.parse(self.oguid_str) if self._is_on_different_admin_unit(oguid.admin_unit_id): admin_unit = ogds_service().fetch_admin_unit(oguid.admin_unit_id) url = self.url_for(oguid, admin_unit, self.view_name) else: obj = self._get_object(oguid.int_id) url = obj.absolute_url() if self.view_name: url = '/'.join((url, self.view_name)) return self.request.RESPONSE.redirect(url)
def __call__(self): oguid_str = self.request.get('oguid') if not oguid_str: raise NotFound() oguid = Oguid.parse(oguid_str) with elevated_privileges(): document = oguid.resolve_object() if document.is_checked_out(): raise Unauthorized() transporter = Transporter() transporter.update(document, self.request) comment = translate(_(u"Updated with a newer excerpt version."), context=self.request) Versioner(document).create_version(comment) return json.dumps({})
def set_predecessor(self, oguid): """Sets the predecessor on the adapted object to ``oguid``. Returns False if it failed. """ oguid = Oguid.parse(oguid) # do we have it in our indexes? predecessor = Task.query.by_oguid(oguid) if not predecessor: return False # set the predecessor in the task object self.task.predecessor = oguid.id modified(self.task) # keep predecessor's issuing_org_unit successor = self.task.get_sql_object() successor.issuing_org_unit = predecessor.issuing_org_unit return True
def set_predecessor(self, oguid): """Sets the predecessor on the adapted object to ``oguid``. Returns False if it failed. """ oguid = Oguid.parse(oguid) # do we have it in our indexes? predecessor = Task.query.by_oguid(oguid) if not predecessor: return False # set the predecessor in the task object self.task.predecessor = oguid.id modified(self.task) # keep predecessor's issuing_org_unit successor = self.task.get_sql_object() successor.issuing_org_unit = predecessor.issuing_org_unit return True
def render(self): oguid_str = self.request.get('oguid') if not oguid_str: raise NotFound() oguid = Oguid.parse(oguid_str) with elevated_privileges(): document = oguid.resolve_object() if document.is_checked_out(): raise Unauthorized() transporter = Transporter() transporter.update(document, self.request) repository = api.portal.get_tool('portal_repository') comment = translate(_(u"Updated with a newer excerpt version."), context=self.request) repository.save(obj=document, comment=comment) return json.dumps({})
def render(self): oguid_str = self.request.get('oguid') if not oguid_str: raise NotFound() oguid = Oguid.parse(oguid_str) with elevated_privileges(): document = oguid.resolve_object() if document.is_checked_out(): raise Unauthorized() transporter = Transporter() transporter.update(document, self.request) repository = api.portal.get_tool('portal_repository') comment = translate( _(u"Updated with a newer excerpt version."), context=self.request) repository.save(obj=document, comment=comment) return json.dumps({})
def __call__(self): if not self.oguid_str: self.oguid_str = self.request.get('oguid') oguid = Oguid.parse(self.oguid_str) if self._is_on_different_admin_unit(oguid.admin_unit_id): admin_unit = ogds_service().fetch_admin_unit(oguid.admin_unit_id) url = self.url_for(oguid, admin_unit, self.view_name) else: obj = self._get_object(oguid.int_id) url = obj.absolute_url() if self.view_name: url = '/'.join((url, self.view_name)) # Preserve query string qs = self.request.get('QUERY_STRING') qs = self._strip_oguid(qs) if qs: url = self._extend_with_querystring(url, qs) return self.request.RESPONSE.redirect(url)
def get_successor(self): return Oguid.parse(self.data['successor_oguid']).resolve_object()
def lookup_object(dataself, data): oguid = Oguid.parse(data.get('oguid')) obj = oguid.resolve_object() if not obj: raise BadRequest('Invalid oguid, could not be resolved.') return obj
def handleAdd(self, action): # create the dossier data, errors = self.extractData() if errors: self.status = self.formErrorsMessage return obj = self.createAndAdd(data) if obj is not None: # mark only as finished if we get the new object self._finishedAdd = True # Get a properly aq wrapped object dossier = self.context.get(obj.id) dm = getUtility(IWizardDataStorage) oguid = self.request.get('oguid') dmkey = 'accept:%s' % oguid # forwarding if dm.get(dmkey, 'is_forwarding'): if dm.get(dmkey, 'is_only_assign'): transition_data = { 'text': dm.get(dmkey, 'text'), 'dossier': IUUID(dossier)} wftool = api.portal.get_tool('portal_workflow') task = wftool.doActionFor( Oguid.parse(oguid).resolve_object(), 'forwarding-transition-assign-to-dossier', comment=transition_data['text'], transition_params=transition_data) IStatusMessage(self.request).addStatusMessage( _(u'The forwarding is now assigned to the new ' 'dossier'), 'info') self.request.RESPONSE.redirect( '%s/edit' % task.absolute_url()) else: task = accept_forwarding_with_successor( self.context, oguid, dm.get(dmkey, 'text'), dossier=dossier) IStatusMessage(self.request).addStatusMessage( _(u'The forwarding has been stored in the ' u'local inbox and the succesor task has been' u' created'), 'info') self.request.RESPONSE.redirect( '%s/edit' % task.absolute_url()) else: # create the successor task, accept the predecessor task = accept_task_with_successor( dossier, oguid, dm.get(dmkey, 'text')) IStatusMessage(self.request).addStatusMessage( _(u'The new dossier has been created and the task ' u'has been copied to the new dossier.'), 'info') self.request.RESPONSE.redirect(task.absolute_url())
def oguid(self, oguid): self.arguments['oguid'] = Oguid.parse(oguid) return self
def get_committee_oguid(): return Oguid.parse(getRequest().get('committee-oguid'))
def lookup_object(dataself, data): oguid = Oguid.parse(data.get('oguid')) obj = oguid.resolve_object() if not obj: raise BadRequest('Invalid oguid, could not be resolved.') return obj
def test_init_with_string_oguid(self): oguid = Oguid.parse('foo:123') self.assertEqual('foo', oguid.admin_unit_id) self.assertEqual(123, oguid.int_id) self.assertEqual('foo:123', oguid.id)
def test_oguid_string_representation(self): self.assertEqual('foo:123', str(Oguid.parse('foo:123')))
def get_successor(self): return Oguid.parse(self.data['successor_oguid']).resolve_object()
def get_committee_oguid(): return Oguid.parse(getRequest().get('committee-oguid'))
def get_committee(self): return Oguid.parse(self.committee_oguid).resolve_object()
def accept_forwarding_with_successor(context, predecessor_oguid, response_text, dossier=None): # the predessecor (the forwarding on the remote client) predecessor = Task.query.by_oguid(predecessor_oguid) # transport the remote forwarding to the inbox or actual yearfolder transporter = Transporter() inbox = get_current_inbox(context) if dossier: yearfolder = get_current_yearfolder(inbox=inbox) successor_forwarding = transporter.transport_from( yearfolder, predecessor.admin_unit_id, predecessor.physical_path) else: successor_forwarding = transporter.transport_from( inbox, predecessor.admin_unit_id, predecessor.physical_path) # Replace the issuer with the current inbox successor_forwarding.issuer = get_current_org_unit().inbox().id() # Set the "X-CREATING-SUCCESSOR" flag for preventing the event handler # from creating additional responses per added document. successor_forwarding.REQUEST.set('X-CREATING-SUCCESSOR', True) successor_tc = ISuccessorTaskController(successor_forwarding) # copy documents and map the intids doc_transporter = getUtility(ITaskDocumentsTransporter) comment = _( u'version_message_accept_forwarding', default=u'Document copied from forwarding (forwarding accepted)') intids_mapping = doc_transporter.copy_documents_from_remote_task( predecessor, successor_forwarding, comment=comment) # copy the responses response_transporter = IResponseTransporter(successor_forwarding) response_transporter.get_responses(predecessor.admin_unit_id, predecessor.physical_path, intids_mapping=intids_mapping) # Remove current responsible from predecessor and add issuer # and responsible to successor's watcher. center = notification_center() center.remove_task_responsible(Oguid.parse(predecessor_oguid), successor_forwarding.responsible) center.add_task_responsible(successor_forwarding, successor_forwarding.responsible) center.add_task_issuer(successor_forwarding, successor_forwarding.issuer) # if a dossier is given means that a successor task must # be created in a new or a existing dossier if dossier: # we need all task field values from the forwarding fielddata = {} for fieldname in ITask.names(): value = ITask.get(fieldname).get(successor_forwarding) fielddata[fieldname] = value # Predefine the task_type to avoid tasks with an invalid task_type fielddata['task_type'] = FORWARDING_SUCCESSOR_TYPE # lets create a new task - the successor task task = createContentInContainer(dossier, 'opengever.task.task', **fielddata) # copy documents and map the intids intids_mapping = _copy_documents_from_forwarding( successor_forwarding, task) # copy the responses response_transporter = IResponseTransporter(task) response_transporter.get_responses( get_current_admin_unit().id(), '/'.join(successor_forwarding.getPhysicalPath()), intids_mapping=intids_mapping) # successor successor_tc_task = ISuccessorTaskController(task) transaction.savepoint() # Close the predessecor forwarding response_text = response_text or '' request_data = { 'response_text': response_text.encode('utf-8'), 'successor_oguid': successor_tc.get_oguid(), 'transition': 'forwarding-transition-accept' } response = dispatch_request(predecessor.admin_unit_id, '@@store_forwarding_in_yearfolder', path=predecessor.physical_path, data=request_data) response_body = response.read() if response_body.strip() != 'OK': raise TaskRemoteRequestError( 'Adding the response and changing the workflow state on the ' 'predecessor forwarding failed.') if dossier: # Update watchers for created successor forwarding and task center = notification_center() center.remove_task_responsible(successor_forwarding, task.responsible) center.add_task_responsible(task, task.responsible) # When a successor task exists, we close also the successor forwarding change_task_workflow_state( successor_forwarding, 'forwarding-transition-accept', text=response_text, successor_oguid=successor_tc_task.get_oguid()) # create the succssor relations successor_tc.set_predecessor(predecessor_oguid) if dossier: successor_tc_task.set_predecessor(successor_tc.get_oguid()) return task return successor_forwarding
def accept_forwarding_with_successor( context, predecessor_oguid, response_text, dossier=None): # the predessecor (the forwarding on the remote client) predecessor = Task.query.by_oguid(predecessor_oguid) # Set the "X-CREATING-SUCCESSOR" flag for preventing the event handler # from creating additional responses per added document. context.REQUEST.set('X-CREATING-SUCCESSOR', True) # transport the remote forwarding to the inbox or actual yearfolder transporter = Transporter() inbox = get_current_inbox(context) if dossier: yearfolder = get_current_yearfolder(inbox=inbox) successor_forwarding = transporter.transport_from( yearfolder, predecessor.admin_unit_id, predecessor.physical_path) else: successor_forwarding = transporter.transport_from( inbox, predecessor.admin_unit_id, predecessor.physical_path) # Replace the issuer with the current inbox successor_forwarding.issuer = get_current_org_unit().inbox().id() successor_tc = ISuccessorTaskController(successor_forwarding) # copy documents and map the intids doc_transporter = getUtility(ITaskDocumentsTransporter) comment = _( u'version_message_accept_forwarding', default=u'Document copied from forwarding (forwarding accepted)') intids_mapping = doc_transporter.copy_documents_from_remote_task( predecessor, successor_forwarding, comment=comment) # copy the responses response_transporter = IResponseTransporter(successor_forwarding) response_transporter.get_responses(predecessor.admin_unit_id, predecessor.physical_path, intids_mapping=intids_mapping) # Remove current responsible from predecessor and add issuer # and responsible to successor's watcher. center = notification_center() center.remove_task_responsible(Oguid.parse(predecessor_oguid), successor_forwarding.responsible) center.add_task_responsible(successor_forwarding, successor_forwarding.responsible) center.add_task_issuer(successor_forwarding, successor_forwarding.issuer) # if a dossier is given means that a successor task must # be created in a new or a existing dossier if dossier: # we need all task field values from the forwarding fielddata = {} for fieldname in ITask.names(): value = ITask.get(fieldname).get(successor_forwarding) fielddata[fieldname] = value # Predefine the task_type to avoid tasks with an invalid task_type fielddata['task_type'] = FORWARDING_SUCCESSOR_TYPE # lets create a new task - the successor task task = createContentInContainer( dossier, 'opengever.task.task', **fielddata) # copy documents and map the intids intids_mapping = _copy_documents_from_forwarding( successor_forwarding, task) # copy the responses response_transporter = IResponseTransporter(task) response_transporter.get_responses( get_current_admin_unit().id(), '/'.join(successor_forwarding.getPhysicalPath()), intids_mapping=intids_mapping) # successor successor_tc_task = ISuccessorTaskController(task) transaction.savepoint() # Close the predessecor forwarding response_text = response_text or '' request_data = {'response_text': response_text.encode('utf-8'), 'successor_oguid': successor_tc.get_oguid(), 'transition': 'forwarding-transition-accept'} response = dispatch_request(predecessor.admin_unit_id, '@@store_forwarding_in_yearfolder', path=predecessor.physical_path, data=request_data) response_body = response.read() if response_body.strip() != 'OK': raise TaskRemoteRequestError( 'Adding the response and changing the workflow state on the ' 'predecessor forwarding failed.') if dossier: # Update watchers for created successor forwarding and task center = notification_center() center.remove_task_responsible(successor_forwarding, task.responsible) center.add_task_responsible(task, task.responsible) # When a successor task exists, we close also the successor forwarding change_task_workflow_state( successor_forwarding, 'forwarding-transition-accept', text=response_text, successor_oguid=successor_tc_task.get_oguid()) # create the succssor relations successor_tc.set_predecessor(predecessor_oguid) if dossier: successor_tc_task.set_predecessor(successor_tc.get_oguid()) return task return successor_forwarding