def test_get_registered_event_persons(dummy_event, dummy_user, dummy_regform): create_registration(dummy_regform, { 'email': '*****@*****.**', 'first_name': 'John', 'last_name': 'Doe', }, notify_user=False) user_person = EventPerson.create_from_user(dummy_user, dummy_event) no_user_person = EventPerson(email='*****@*****.**', first_name='John', last_name='Doe') create_registration(dummy_regform, { 'email': '*****@*****.**', 'first_name': 'Jane', 'last_name': 'Doe', }, notify_user=False) no_user_no_reg = EventPerson(email='*****@*****.**', first_name='No', last_name='Show') dummy_event.persons.append(user_person) dummy_event.persons.append(no_user_person) dummy_event.persons.append(no_user_no_reg) db.session.flush() registered_persons = get_registered_event_persons(dummy_event) assert registered_persons == {user_person, no_user_person}
def _clone_persons(self, new_event): attrs = get_simple_column_attrs(EventPerson) | {'user'} for old_person in self.old_event.persons: person = EventPerson(event=new_event) person.populate_from_attrs(old_person, attrs) assert person not in db.session self._person_map[old_person] = person
def create_event_person(event, create_untrusted_persons=False, **data): """Create an event person from data passed as kwargs.""" title = next((x.value for x in UserTitle if data.get('title') == x.title), None) return EventPerson(event=event, email=data.get('email', '').lower(), _title=title, first_name=data.get('firstName'), last_name=data['familyName'], affiliation=data.get('affiliation'), address=data.get('address'), phone=data.get('phone'), is_untrusted=create_untrusted_persons)
def _event_person_from_legacy(self, old_person): data = dict(first_name=convert_to_unicode(old_person._firstName), last_name=convert_to_unicode(old_person._surName), _title=self.USER_TITLE_MAP.get( getattr(old_person, '_title', ''), UserTitle.none), affiliation=convert_to_unicode(old_person._affilliation), address=convert_to_unicode(old_person._address), phone=convert_to_unicode(old_person._telephone)) email = strict_sanitize_email(old_person._email) if email: person = (self.event_persons_by_email.get(email) or self.event_persons_by_user.get( self.importer.all_users_by_email.get(email))) else: person = self.event_persons_noemail_by_data.get( (data['first_name'], data['last_name'], data['affiliation'])) if not person: user = self.importer.all_users_by_email.get(email) person = EventPerson(event_new=self.event, user=user, email=email, **data) if email: self.event_persons_by_email[email] = person if user: self.event_persons_by_user[user] = person if not email and not user: self.event_persons_noemail_by_data[( person.first_name, person.last_name, person.affiliation)] = person person_link = AbstractPersonLink(person=person) person_link.populate_from_dict(data) return person_link
def event_person_from_legacy(self, old_person, skip_empty_email=False, skip_empty_names=False): """Translate an old participation-like (or avatar) object to an EventPerson.""" data = self._get_person_data(old_person) if skip_empty_names and not data['first_name'] and not data[ 'last_name']: self.print_warning('%[yellow!]Skipping nameless event person', always=False) return None # retrieve e-mail in both Avatar and Participation objects email = strict_sanitize_email( getattr(old_person, '_email', None) or getattr(old_person, 'email', None)) if email: person = (self.event_ns.event_persons_by_email.get(email) or self.event_ns.event_persons_by_user.get( self.global_ns.users_by_email.get(email))) elif skip_empty_email: return None else: person = self.event_ns.event_persons_by_data.get( (data['first_name'], data['last_name'], data['affiliation'])) if not person: user = self.global_ns.users_by_email.get(email) person = EventPerson(event=self.event, user=user, email=email, **data) self.add_event_person(person) return person
def test_dump_event(db, dummy_user, dummy_event): from indico.modules.search.schemas import EventSchema schema = EventSchema() dummy_event.description = 'A dummy event' dummy_event.keywords = ['foo', 'bar'] person = EventPerson.create_from_user(dummy_user, dummy_event) person2 = EventPerson(event=dummy_event, first_name='Admin', last_name='Saurus', affiliation='Indico') dummy_event.person_links.append(EventPersonLink(person=person)) dummy_event.person_links.append(EventPersonLink(person=person2)) db.session.flush() category_id = dummy_event.category_id assert schema.dump(dummy_event) == { 'description': 'A dummy event', 'keywords': ['foo', 'bar'], 'location': { 'address': '', 'room_name': '', 'venue_name': '' }, 'persons': [{ 'affiliation': None, 'name': 'Guinea Pig' }, { 'affiliation': 'Indico', 'name': 'Admin Saurus' }], 'title': 'dummy#0', 'category_id': category_id, 'category_path': [ { 'id': 0, 'title': 'Home', 'url': '/' }, { 'id': category_id, 'title': 'dummy', 'url': f'/category/{category_id}/' }, ], 'end_dt': dummy_event.end_dt.isoformat(), 'event_id': 0, 'start_dt': dummy_event.start_dt.isoformat(), 'type': 'event', 'event_type': 'meeting', 'url': '/event/0/', }
def create_event_person(event, create_untrusted_persons=False, **data): """Create an event person from data passed as kwargs.""" from indico.modules.events.persons.schemas import EventPersonSchema event_person = EventPerson(event=event, is_untrusted=create_untrusted_persons) event_person.populate_from_dict( EventPersonSchema(unknown=EXCLUDE).load(data)) return event_person
def person_from_data(person_data, event): user = User.find_first(~User.is_deleted, User.all_emails.contains(person_data['email'].lower())) if user: return EventPerson.for_user(user, event) person = EventPerson.find_first(event_new=event, email=person_data['email'].lower()) if not person: person = EventPerson(event_new=event, **person_data) return person
def _create_event_person(self, data): title = next((x.value for x in UserTitle if data.get('title') == x.title), None) person = EventPerson(event_new=self.event, email=data.get('email', '').lower(), _title=title, first_name=data.get('firstName'), last_name=data['familyName'], affiliation=data.get('affiliation'), address=data.get('address'), phone=data.get('phone')) # Keep the original data to cancel the conversion if the person is not persisted to the db self.event_person_conversions[person] = data return person
def _create(event, user=None, first_name=None, last_name=None, email=None, affiliation=None, title=None): person = EventPerson(event_new=event, user=user, first_name=first_name or user.first_name, last_name=last_name or user.last_name, email=email or user.email, affiliation=affiliation or user.affiliation, title=title or user.title) db.session.add(person) db.session.flush() return person
def _copy_person_link_data(link_data): # Copy person link data since we would otherwise end up # adding the EventPersons of the first event in all other # events of the series. for link, submitter in link_data.items(): link_copy = EventPersonLink(**{col: getattr(link, col) for col in get_simple_column_attrs(EventPersonLink)}) link_copy.person = EventPerson(**{col: getattr(link.person, col) for col in get_simple_column_attrs(EventPerson)}) link_copy.person.user = link.person.user yield link_copy, submitter
def _migrate_event_persons(self): all_persons = defaultdict(list) old_people = [] for chairperson in getattr(self.conf, '_chairs', []): old_people.append(chairperson) for old_contrib in self.conf.contributions.itervalues(): for speaker in getattr(old_contrib, '_speakers', []): old_people.append(speaker) for author in getattr(old_contrib, '_primaryAuthors', []): old_people.append(author) for coauthor in getattr(old_contrib, '_coAuthors', []): old_people.append(coauthor) for old_subcontrib in old_contrib._subConts: for speaker in getattr(old_subcontrib, 'speakers', []): old_people.append(speaker) schedule = self.conf._Conference__schedule if schedule: for old_entry in schedule._entries: entry_type = old_entry.__class__.__name__ if entry_type == 'LinkedTimeSchEntry': old_block = old_entry._LinkedTimeSchEntry__owner for convener in getattr(old_block, '_conveners', []): old_people.append(convener) for old_person in old_people: person = self.event_person_from_legacy(old_person, skip_empty_email=True, skip_empty_names=True) if person: user = self.global_ns.users_by_email.get(person.email) email = user.email if user else person.email all_persons[email].append(person) for email, persons in all_persons.iteritems(): person = self.get_event_person_by_email(email) if not person: person = EventPerson(email=email, event_new=self.event, user=self.global_ns.users_by_email.get(email), first_name=most_common(persons, key=attrgetter('first_name')), last_name=most_common(persons, key=attrgetter('last_name')), _title=most_common(persons, key=attrgetter('_title')), affiliation=most_common(persons, key=attrgetter('affiliation')), address=most_common(persons, key=attrgetter('address')), phone=most_common(persons, key=attrgetter('phone'))) self.add_event_person(person) if not self.quiet: self.print_info('%[magenta!]Event Person%[reset] {}({})'.format(person.full_name, person.email))
def test_dump_event(db, dummy_user, dummy_event): from .schemas import EventRecordSchema schema = EventRecordSchema(context={'schema': 'test-events'}) dummy_event.description = 'A dummy <strong>event</strong>' dummy_event.keywords = ['foo', 'bar'] person = EventPerson.create_from_user(dummy_user, dummy_event) person2 = EventPerson(event=dummy_event, first_name='Admin', last_name='Saurus', affiliation='Indico') dummy_event.person_links.append(EventPersonLink(person=person)) dummy_event.person_links.append(EventPersonLink(person=person2)) db.session.flush() category_id = dummy_event.category_id assert schema.dump(dummy_event) == { '$schema': 'test-events', '_access': { 'delete': ['IndicoAdmin'], 'owner': ['IndicoAdmin'], 'update': ['IndicoAdmin'], }, '_data': { 'description': 'A dummy event', 'keywords': ['foo', 'bar'], 'location': { 'address': '', 'room_name': '', 'venue_name': '' }, 'persons': [{ 'name': 'Guinea Pig' }, { 'affiliation': 'Indico', 'name': 'Admin Saurus' }], 'site': 'http://localhost', 'title': 'dummy#0' }, 'category_id': 1, 'category_path': [ { 'id': 0, 'title': 'Home', 'url': '/' }, { 'id': category_id, 'title': 'dummy', 'url': f'/category/{category_id}/' }, ], 'end_dt': dummy_event.end_dt.isoformat(), 'event_id': 0, 'start_dt': dummy_event.start_dt.isoformat(), 'type': 'event', 'type_format': 'meeting', 'url': 'http://localhost/event/0/', }