def clean_endpoint(self): endpoint = self.cleaned_data['endpoint'] edit = self.cleaned_data['edit'] try: Conference.get_by_endpoint(endpoint, False) if not edit: raise forms.ValidationError( 'A meeting with this endpoint exists already.') except ConferenceError: if edit: raise forms.ValidationError( 'Meeting not found with this endpoint to update') return endpoint
def clean_endpoint(self): endpoint = self.cleaned_data['endpoint'] edit = self.cleaned_data['edit'] try: Conference.get_by_endpoint(endpoint, False) if not edit: raise forms.ValidationError( 'A meeting with this endpoint exists already.' ) except ConferenceError: if edit: raise forms.ValidationError( 'Meeting not found with this endpoint to update' ) return endpoint
def meeting_hook(): """View function for email conference submission. """ message = ConferenceMessage() try: message.verify() except ConferenceError as error: logger.error(error) raise HTTPError(httplib.NOT_ACCEPTABLE) try: conference = Conference.get_by_endpoint(message.conference_name, active=False) except ConferenceError as error: logger.error(error) raise HTTPError(httplib.NOT_ACCEPTABLE) if not conference.active: send_mail( message.sender_email, CONFERENCE_INACTIVE, fullname=message.sender_display, presentations_url=web_url_for('conference_view', _absolute=True), can_change_preferences=False, logo=settings.OSF_MEETINGS_LOGO, ) raise HTTPError(httplib.NOT_ACCEPTABLE) add_poster_by_email(conference=conference, message=message)
def conference_submissions(**kwargs): """Return data for all OSF4M submissions. The total number of submissions for each meeting is calculated and cached in the Conference.num_submissions field. """ conferences = Conference.find(Q('is_meeting', 'ne', False)) # TODO: Revisit this loop, there has to be a way to optimize it for conf in conferences: # For efficiency, we filter by tag first, then node # instead of doing a single Node query projects = set() tags = Tag.find(Q('system', 'eq', False) & Q('name', 'iexact', conf.endpoint.lower())).values_list('pk', flat=True) nodes = Node.find( Q('tags', 'in', tags) & Q('is_public', 'eq', True) & Q('is_deleted', 'ne', True) ).include('guids') projects.update(list(nodes)) num_submissions = len(projects) # Cache the number of submissions conf.num_submissions = num_submissions bulk_update(conferences, update_fields=['num_submissions']) return {'success': True}
def conference_submissions(**kwargs): """Return data for all OSF4M submissions. The total number of submissions for each meeting is calculated and cached in the Conference.num_submissions field. """ conferences = Conference.find(Q('is_meeting', 'ne', False)) # TODO: Revisit this loop, there has to be a way to optimize it for conf in conferences: # For efficiency, we filter by tag first, then node # instead of doing a single Node query projects = set() tags = Tag.find( Q('system', 'eq', False) & Q('name', 'iexact', conf.endpoint.lower())).values_list( 'pk', flat=True) nodes = AbstractNode.find( Q('tags', 'in', tags) & Q('is_public', 'eq', True) & Q('is_deleted', 'ne', True)).include('guids') projects.update(list(nodes)) num_submissions = len(projects) # Cache the number of submissions conf.num_submissions = num_submissions bulk_update(conferences, update_fields=['num_submissions']) return {'success': True}
def populate_conferences(dev=False): if dev: Conference.remove() date_format = '%b %d %Y' for meeting, attrs in MEETING_DATA.iteritems(): meeting = meeting.strip() admin_emails = attrs.pop('admins', []) admin_objs = [] if not dev: for email in admin_emails: try: user = OSFUser.find_one(Q('username', 'iexact', email)) admin_objs.append(user) except ModularOdmException: raise RuntimeError( 'Username {0!r} is not registered.'.format(email)) # Convert string into datetime object try: attrs['end_date'] = datetime.strptime(attrs.get('end_date'), date_format) attrs['start_date'] = datetime.strptime(attrs.get('start_date'), date_format) except TypeError: print '** Meeting {} does not have a start or end date. **'.format( meeting) custom_fields = attrs.pop('field_names', {}) conf = Conference(endpoint=meeting, admins=admin_objs, **attrs) conf.field_names.update(custom_fields) try: conf.save() except ModularOdmException: conf = Conference.find_one(Q('endpoint', 'eq', meeting)) for key, value in attrs.items(): if isinstance(value, dict): current = getattr(conf, key) current.update(value) setattr(conf, key, current) else: setattr(conf, key, value) conf.admins = admin_objs changed_fields = conf.save() if changed_fields: print('Updated {}: {}'.format(meeting, changed_fields)) else: print('Added new Conference: {}'.format(meeting))
def conference_data(meeting): try: conf = Conference.find_one(Q('endpoint', 'iexact', meeting)) except ModularOdmException: raise HTTPError(httplib.NOT_FOUND) nodes = Node.objects.filter(tags__id__in=Tag.objects.filter(name__iexact=meeting, system=False).values_list('id', flat=True), is_public=True, is_deleted=False) ret = [ _render_conference_node(each, idx, conf) for idx, each in enumerate(nodes) ] return ret
def populate_conferences(dev=False): if dev: Conference.remove() date_format = '%b %d %Y' for meeting, attrs in MEETING_DATA.iteritems(): meeting = meeting.strip() admin_emails = attrs.pop('admins', []) admin_objs = [] if not dev: for email in admin_emails: try: user = User.find_one(Q('username', 'iexact', email)) admin_objs.append(user) except ModularOdmException: raise RuntimeError('Username {0!r} is not registered.'.format(email)) # Convert string into datetime object try: attrs['end_date'] = datetime.strptime(attrs.get('end_date'), date_format) attrs['start_date'] = datetime.strptime(attrs.get('start_date'), date_format) except TypeError: print '** Meeting {} does not have a start or end date. **'.format(meeting) custom_fields = attrs.pop('field_names', {}) conf = Conference( endpoint=meeting, admins=admin_objs, **attrs ) conf.field_names.update(custom_fields) try: conf.save() except ModularOdmException: conf = Conference.find_one(Q('endpoint', 'eq', meeting)) for key, value in attrs.items(): if isinstance(value, dict): current = getattr(conf, key) current.update(value) setattr(conf, key, current) else: setattr(conf, key, value) conf.admins = admin_objs changed_fields = conf.save() if changed_fields: print('Updated {}: {}'.format(meeting, changed_fields)) else: print('Added new Conference: {}'.format(meeting))
def conference_data(meeting): try: conf = Conference.find_one(Q('endpoint', 'iexact', meeting)) except ModularOdmException: raise HTTPError(httplib.NOT_FOUND) nodes = AbstractNode.objects.filter(tags__id__in=Tag.objects.filter( name__iexact=meeting, system=False).values_list('id', flat=True), is_public=True, is_deleted=False) ret = [ _render_conference_node(each, idx, conf) for idx, each in enumerate(nodes) ] return ret
def conference_view(**kwargs): meetings = [] for conf in Conference.find(): if conf.num_submissions < settings.CONFERENCE_MIN_COUNT: continue if (hasattr(conf, 'is_meeting') and (conf.is_meeting is False)): continue meetings.append({ 'name': conf.name, 'location': conf.location, 'end_date': conf.end_date.strftime('%b %d, %Y') if conf.end_date else None, 'start_date': conf.start_date.strftime('%b %d, %Y') if conf.start_date else None, 'url': web_url_for('conference_results', meeting=conf.endpoint), 'count': conf.num_submissions, }) meetings.sort(key=lambda meeting: meeting['count'], reverse=True) return {'meetings': meetings}
def conference_results(meeting): """Return the data for the grid view for a conference. :param str meeting: Endpoint name for a conference. """ try: conf = Conference.find_one(Q('endpoint', 'iexact', meeting)) except ModularOdmException: raise HTTPError(httplib.NOT_FOUND) data = conference_data(meeting) return { 'data': data, 'label': meeting, 'meeting': serialize_conference(conf), # Needed in order to use base.mako namespace 'settings': settings, }