def test_definition(mocker): from indico.modules.events.agreements import util mocker.patch.object(util, 'get_agreement_definitions', return_value={'foobar': 'test'}) assert Agreement(type='foobar').definition == 'test' assert Agreement(type='barfoo').definition is None
def test_reject(reason, on_behalf, expected_state): ip = '127.0.0.1' agreement = Agreement() agreement.reject(from_ip=ip, reason=reason, on_behalf=on_behalf) assert agreement.state == expected_state assert agreement.signed_from_ip == ip assert agreement.reason == reason assert agreement.signed_dt == now_utc() agreement.definition.handle_rejected.assert_called_with(agreement)
def test_reject(reason, on_behalf, expected_state): ip = '127.0.0.1' agreement = Agreement() agreement.reject(from_ip=ip, reason=reason, on_behalf=on_behalf) assert agreement.state == expected_state assert agreement.signed_from_ip == ip assert agreement.reason == reason assert agreement.signed_dt == now_utc() agreement.definition.handle_rejected.assert_called_with(agreement)
def test_reset(): agreement = Agreement() agreement.reset() assert agreement.state == AgreementState.pending assert agreement.attachment is None assert agreement.attachment_filename is None assert agreement.data is None assert agreement.reason is None assert agreement.signed_dt is None assert agreement.signed_from_ip is None
def test_reset(): agreement = Agreement() agreement.reset() assert agreement.state == AgreementState.pending assert agreement.attachment is None assert agreement.attachment_filename is None assert agreement.data is None assert agreement.reason is None assert agreement.signed_dt is None assert agreement.signed_from_ip is None
def _process(self): agreement = self.agreement form = AgreementAnswerSubmissionForm() if form.validate_on_submit(): if agreement is None: agreement = Agreement.create_from_data( event=self.event_new, type_=self.definition.name, person=self.person) db.session.add(agreement) db.session.flush() if form.answer.data: agreement.accept(from_ip=request.remote_addr, on_behalf=True) agreement.attachment_filename = form.document.data.filename agreement.attachment = form.document.data.read() else: agreement.reject(from_ip=request.remote_addr, on_behalf=True) flash( _("Agreement answered on behalf of {0}".format( agreement.person_name)), 'success') return jsonify(success=True) return WPJinjaMixin.render_template( 'events/agreements/dialogs/agreement_submit_answer_form.html', form=form, event=self.event_new, agreement=agreement)
def _create_agreement(state): agreement = Agreement(uuid=str(uuid4()), event=dummy_event, type='dummy', person_email=dummy_person.email, person_name=dummy_person.name, state=state, identifier=dummy_person.identifier) db.session.add(agreement) db.session.flush() return agreement
def _process(self): event = self._conf people = self.definition.get_people(event) agreements = Agreement.find_all(Agreement.event_id == event.getId(), Agreement.type == self.definition.name, Agreement.identifier.in_(people)) return WPAgreementManager.render_template('agreement_type_details.html', event, event=event, definition=self.definition, agreements=agreements)
def _process(self): event = self._conf people = self.definition.get_people(event) agreements = Agreement.find_all(Agreement.event_id == event.getId(), Agreement.type == self.definition.name, Agreement.identifier.in_(people)) return WPAgreementManager.render_template('agreement_type_details.html', event, event=event, definition=self.definition, agreements=agreements)
def redirect_old_agreement_url(confId): uuid = request.args['authKey'] agreement = Agreement.find_first(event_id=confId, uuid=uuid) if agreement is None: raise NotFound return redirect( url_for('agreements.agreement_form', confId=confId, id=agreement.id, uuid=uuid))
def get_people_not_notified(cls, event): """Returns a dictionary of :class:`AgreementPersonInfo` yet to be notified""" people = cls.get_people(event) sent_agreements = { a.identifier for a in Agreement.find(event_id=event.getId(), type=cls.name) } return { k: v for k, v in people.items() if v.identifier not in sent_agreements }
def test_create_from_data(dummy_event, dummy_person, dummy_user, person_with_user): type_ = 'dummy' dummy_person.user = dummy_user if person_with_user else None agreement = Agreement.create_from_data(event=dummy_event, type_=type_, person=dummy_person) assert agreement.event == dummy_event assert agreement.type == type_ assert agreement.state == AgreementState.pending assert agreement.uuid assert agreement.identifier == dummy_person.identifier assert agreement.person_email == dummy_person.email assert agreement.person_name == dummy_person.name assert agreement.user == dummy_person.user assert agreement.data == dummy_person.data
def test_create_from_data(dummy_event, dummy_person, dummy_user, person_with_user): type_ = 'dummy' dummy_person.user = dummy_user if person_with_user else None agreement = Agreement.create_from_data(event=dummy_event, type_=type_, person=dummy_person) assert agreement.event == dummy_event assert agreement.type == type_ assert agreement.state == AgreementState.pending assert agreement.uuid assert agreement.identifier == dummy_person.identifier assert agreement.person_email == dummy_person.email assert agreement.person_name == dummy_person.name assert agreement.user == dummy_person.user assert agreement.data == dummy_person.data
def get_stats_for_signed_agreements(cls, event): """Returns a digest of signed agreements on an event :param event: the event :return: (everybody_signed, num_accepted, num_rejected) """ people = cls.get_people(event) identifiers = [p.identifier for p in people.itervalues()] query = Agreement.find(Agreement.event_id == event.getId(), Agreement.type == cls.name, Agreement.identifier.in_(identifiers)) num_accepted = query.filter(Agreement.accepted).count() num_rejected = query.filter(Agreement.rejected).count() everybody_signed = len(people) == (num_accepted + num_rejected) return everybody_signed, num_accepted, num_rejected
def get_stats_for_signed_agreements(cls, event): """Returns a digest of signed agreements on an event :param event: the event :return: (everybody_signed, num_accepted, num_rejected) """ people = cls.get_people(event) identifiers = [p.identifier for p in people.itervalues()] query = Agreement.find(Agreement.event_id == event.getId(), Agreement.type == cls.name, Agreement.identifier.in_(identifiers)) num_accepted = query.filter(Agreement.accepted).count() num_rejected = query.filter(Agreement.rejected).count() everybody_signed = len(people) == (num_accepted + num_rejected) return everybody_signed, num_accepted, num_rejected
def export_agreements(self, aw): sent_agreements = {a.identifier: a for a in Agreement.find(event_id=self._event.getId(), type=self._definition.name)} for person in islice(sorted(self._definition.get_people(self._event).itervalues(), key=attrgetter('name', 'identifier')), self._offset, self._offset + self._limit): agreement = sent_agreements.get(person.identifier) data = { 'event_id': int(self._event.id), 'identifier': person.identifier, 'sent': agreement is not None, 'accepted': None if (not agreement or agreement.pending) else agreement.accepted, } self._definition.extend_api_data(self._event, person, agreement, data) yield data
def _checkParams(self, params): RHAgreementManagerDetails._checkParams(self, params) if 'id' in request.view_args: self.agreement = Agreement.find_one(id=request.view_args['id']) if self._conf != self.agreement.event: raise NotFound if not self.agreement.pending: raise NoReportError(_("The agreement is already signed")) else: self.agreement = None identifier = request.args['identifier'] try: self.person = self.definition.get_people(self._conf)[identifier] except KeyError: raise NotFound
def _checkParams(self, params): RHAgreementManagerDetails._checkParams(self, params) if 'id' in request.view_args: self.agreement = Agreement.find_one(id=request.view_args['id']) if self._conf != self.agreement.event: raise NotFound if not self.agreement.pending: raise NoReportError(_("The agreement is already signed")) else: self.agreement = None identifier = request.args['identifier'] try: self.person = self.definition.get_people(self._conf)[identifier] except KeyError: raise NotFound
def export_agreements(self, aw): sent_agreements = {a.identifier: a for a in Agreement.find(event_id=self._event.getId(), type=self._definition.name)} for person in islice(sorted(self._definition.get_people(self._event).itervalues(), key=attrgetter('name', 'identifier')), self._offset, self._offset + self._limit): agreement = sent_agreements.get(person.identifier) data = { 'event_id': int(self._event.id), 'identifier': person.identifier, 'sent': agreement is not None, 'accepted': None if (not agreement or agreement.pending) else agreement.accepted, } self._definition.extend_api_data(self._event, person, agreement, data) yield data
def _process_args(self): RHAgreementManagerDetails._process_args(self) if 'id' in request.view_args: self.agreement = Agreement.get_one(request.view_args['id']) if self.event != self.agreement.event: raise NotFound if not self.agreement.pending: raise NoReportError(_("The agreement is already signed")) else: self.agreement = None identifier = request.args['identifier'] try: self.person = self.definition.get_people(self.event)[identifier] except KeyError: raise NotFound
def _process_args(self): RHAgreementManagerDetails._process_args(self) if 'id' in request.view_args: self.agreement = Agreement.get_one(request.view_args['id']) if self.event != self.agreement.event: raise NotFound if not self.agreement.pending: raise NoReportError(_("The agreement is already signed")) else: self.agreement = None identifier = request.args['identifier'] try: self.person = self.definition.get_people(self.event)[identifier] except KeyError: raise NotFound
def _process(self): event = self._conf agreement = self.agreement form = AgreementAnswerSubmissionForm() if form.validate_on_submit(): if agreement is None: agreement = Agreement.create_from_data(event=self._conf, type_=self.definition.name, person=self.person) db.session.add(agreement) db.session.flush() if form.answer.data: agreement.accept(from_ip=request.remote_addr, on_behalf=True) agreement.attachment_filename = form.document.data.filename agreement.attachment = form.document.data.read() else: agreement.reject(from_ip=request.remote_addr, on_behalf=True) flash(_("Agreement answered on behalf of {0}".format(agreement.person_name)), 'success') return jsonify(success=True) return WPJinjaMixin.render_template('events/agreements/dialogs/agreement_submit_answer_form.html', form=form, event=event, agreement=agreement)
def send_new_agreements(event, name, people, email_body, cc_addresses, from_address): """Creates and send agreements for a list of people on a given event. :param event: The `Event` associated with the agreement :param name: The agreement type matcing a :class:`AgreementDefinition` name :param people: The list of people for whom agreements will be created :param email_body: The body of the email :param cc_addresses: Email addresses to send CCs to :param from_address: Email address of the sender """ agreements = [] for person in people.itervalues(): agreement = Agreement.create_from_data(event=event, type_=name, person=person) db.session.add(agreement) agreements.append(agreement) db.session.flush() for agreement in agreements: notify_agreement_new(agreement, email_body, cc_addresses, from_address) return agreements
def _checkParams(self, params): RHAgreementManagerDetails._checkParams(self, params) self.agreement = Agreement.get_one(request.view_args['id'])
def _process_args(self): RHAgreementManagerDetails._process_args(self) self.agreement = Agreement.get_one(request.view_args['id'])
def _merge_users(target, source, **kwargs): Agreement.find(user_id=source.id).update({Agreement.user_id: target.id})
def test_rejected(dummy_agreement, state, expected): dummy_agreement.state = state assert dummy_agreement.rejected == expected assert Agreement.find_one(rejected=expected) == dummy_agreement
def test_is_orphan_no_definition(monkeypatch): monkeypatch.setattr(Agreement, 'definition', property(lambda s: None)) agreement = Agreement() with pytest.raises(ServiceUnavailable): agreement.is_orphan()
def test_signed_on_behalf(dummy_agreement, state, expected): dummy_agreement.state = state assert dummy_agreement.signed_on_behalf == expected assert Agreement.find_one(signed_on_behalf=expected) == dummy_agreement
def _get_agreements(self): return Agreement.find_all(Agreement.pending, Agreement.person_email != None, Agreement.event_id == self._conf.getId(), Agreement.type == self.definition.name)
def test_is_orphan_no_definition(monkeypatch): monkeypatch.setattr(Agreement, 'definition', property(lambda s: None)) agreement = Agreement() with pytest.raises(ServiceUnavailable): agreement.is_orphan()
def test_render(): agreement = Agreement() agreement.render(None) agreement.definition.render_form.assert_called_with(agreement, None)
def test_is_orphan(dummy_event_new): agreement = Agreement(event_new=dummy_event_new) agreement.is_orphan() agreement.definition.is_agreement_orphan(agreement.event_new, agreement)
def test_belongs_to(): agreement = Agreement(identifier='foo') assert agreement.belongs_to(MagicMock(identifier='foo')) assert not agreement.belongs_to(MagicMock(identifier='bar'))
def test_is_orphan(dummy_event): agreement = Agreement(event=dummy_event) agreement.is_orphan() agreement.definition.is_agreement_orphan(agreement.event, agreement)
def test_pending(dummy_agreement, state, expected): dummy_agreement.state = state filter_ = Agreement.pending if expected else ~Agreement.pending assert dummy_agreement.pending == expected assert Agreement.find_one(filter_) == dummy_agreement assert not Agreement.find_first(~filter_)
def test_belongs_to(): agreement = Agreement(identifier='foo') assert agreement.belongs_to(MagicMock(identifier='foo')) assert not agreement.belongs_to(MagicMock(identifier='bar'))
def _get_agreements(self): ids = set(request.form.getlist('references')) return Agreement.find_all(Agreement.id.in_(ids), Agreement.person_email != None)
def test_is_orphan(dummy_event): agreement = Agreement(event_id=dummy_event.id) agreement.is_orphan() agreement.definition.is_agreement_orphan(agreement.event, agreement)
def _checkParams(self, params): RHAgreementManagerDetails._checkParams(self, params) self.agreement = Agreement.find_one(id=request.view_args['id']) if self._conf != self.agreement.event: raise NotFound
def test_accepted(dummy_agreement, state, expected): dummy_agreement.state = state assert dummy_agreement.accepted == expected assert Agreement.find_one(accepted=expected) == dummy_agreement
def _checkParams(self, params): RHConferenceBaseDisplay._checkParams(self, params) self.agreement = Agreement.find_one(id=request.view_args['id']) if self.agreement.is_orphan(): raise NotFound('The agreement is not active anymore')
def _process_args(self): RHDisplayEventBase._process_args(self) self.agreement = Agreement.get_one(request.view_args['id']) if self.agreement.is_orphan(): raise NotFound('The agreement is not active anymore')
def _process_args(self): RHAgreementManagerDetails._process_args(self) self.agreement = Agreement.get_one(request.view_args['id'])
def _get_agreements(self): return Agreement.find_all(Agreement.pending, Agreement.person_email != None, Agreement.event_id == self._conf.getId(), Agreement.type == self.definition.name)
def _process_args(self): RHDisplayEventBase._process_args(self) self.agreement = Agreement.get_one(request.view_args['id']) if self.agreement.is_orphan(): raise NotFound('The agreement is not active anymore')
def test_locator(): id_ = 1337 event_id = 9000 agreement = Agreement(id=id_, event_id=event_id) assert agreement.locator == {'id': id_, 'confId': event_id}
def _checkParams(self, params): RHAgreementManagerDetails._checkParams(self, params) self.agreement = Agreement.get_one(request.view_args['id'])
def _checkParams(self, params): RHConferenceBaseDisplay._checkParams(self, params) self.agreement = Agreement.find_one(id=request.view_args['id']) if self.agreement.is_orphan(): raise NotFound('The agreement is not active anymore')
def test_pending(dummy_agreement, state, expected): dummy_agreement.state = state filter_ = Agreement.pending if expected else ~Agreement.pending assert dummy_agreement.pending == expected assert Agreement.find_one(filter_) == dummy_agreement assert not Agreement.find_first(~filter_)
def _merge_users(target, source, **kwargs): Agreement.find(user_id=source.id).update({Agreement.user_id: target.id})
def _get_agreements(self): ids = set(request.form.getlist('references')) return Agreement.find_all(Agreement.id.in_(ids), Agreement.person_email != None)
def test_rejected(dummy_agreement, state, expected): dummy_agreement.state = state assert dummy_agreement.rejected == expected assert Agreement.find_one(rejected=expected) == dummy_agreement
def _checkParams(self, params): RHAgreementManagerDetails._checkParams(self, params) self.agreement = Agreement.find_one(id=request.view_args['id']) if self._conf != self.agreement.event: raise NotFound
def test_signed_on_behalf(dummy_agreement, state, expected): dummy_agreement.state = state assert dummy_agreement.signed_on_behalf == expected assert Agreement.find_one(signed_on_behalf=expected) == dummy_agreement
def test_event_setter(dummy_event): agreement = Agreement() agreement.event = dummy_event assert agreement.event_id == int(dummy_event.getId())
def test_belongs_to(): agreement = Agreement(identifier="foo") assert agreement.belongs_to(MagicMock(identifier="foo")) assert not agreement.belongs_to(MagicMock(identifier="bar"))
def test_render_no_definition(monkeypatch): monkeypatch.setattr(Agreement, 'definition', property(lambda s: None)) agreement = Agreement() with pytest.raises(IndicoError): agreement.render(None)
def test_accepted(dummy_agreement, state, expected): dummy_agreement.state = state assert dummy_agreement.accepted == expected assert Agreement.find_one(accepted=expected) == dummy_agreement