def _on_event_update(self, event, **kwargs): changes = kwargs['changes'] if not changes.viewkeys() & {'location_data', 'start_dt', 'end_dt'}: return request = Request.find_latest_for_event(event, RoomAssistanceRequest.name) if not request or request.state != RequestState.accepted: return if 'location_data' in changes and not event_has_room_with_support_attached( event): request.definition.reject( request, { 'comment': render_plugin_template('auto_reject_no_supported_room.txt') }, User.get_system_user()) request.data = dict(request.data, occurrences=[]) flash( _("The new event location is not in the list of the rooms supported by the room assistance team. " "Room assistance request has been rejected and support will not be provided." ), 'warning') if changes.viewkeys() & {'start_dt', 'end_dt'}: tz = pytz.timezone(config.DEFAULT_TIMEZONE) occurrences = { dateutil.parser.parse(occ).astimezone(tz) for occ in request.data['occurrences'] } req_dates = {occ.date() for occ in occurrences} event_dates = set(event.iter_days()) old_dates = req_dates - event_dates has_overlapping_dates = req_dates & event_dates if not has_overlapping_dates: request.definition.reject( request, { 'comment': render_plugin_template( 'auto_reject_no_overlapping_dates.txt') }, User.get_system_user()) request.data = dict(request.data, occurrences=[]) flash( _("The new event dates don't overlap with the existing room assistance request for this event. " "Room assistance request has been rejected and support will not be provided." ), 'warning') elif old_dates and has_overlapping_dates: new_data = dict(request.data) new_data['occurrences'] = [ occ.astimezone(pytz.utc).isoformat() for occ in occurrences if occ.date() in req_dates & event_dates ] request.data = new_data flash( _("Room assistance had been requested for days that are not between the updated start/end " "dates. Support will not be provided on these days anymore." ), 'warning')
def service_handle_review_editable(editable, user, action, parent_revision, revision=None): new_revision = revision or parent_revision data = { 'action': action.name, 'revision': EditingRevisionSignedSchema().dump(new_revision), 'endpoints': _get_revision_endpoints(new_revision), 'user': ServiceUserSchema(context={'editable': editable}).dump(user), } try: path = '/event/{}/editable/{}/{}/{}'.format( _get_event_identifier(editable.event), editable.type.name, editable.contribution_id, new_revision.id ) resp = requests.post(_build_url(editable.event, path), headers=_get_headers(editable.event), json=data) resp.raise_for_status() resp = ServiceReviewEditableSchema().load(resp.json()) if 'comment' in resp: parent_revision.comment = resp['comment'] if 'tags' in resp: parent_revision.tags = {tag for tag in editable.event.editing_tags if tag.id in map(int, resp['tags'])} for comment in resp.get('comments', []): create_revision_comment(new_revision, User.get_system_user(), comment['text'], internal=comment['internal']) db.session.flush() return resp except (requests.RequestException, ValidationError) as exc: _log_service_error(exc, 'Calling listener for editable revision failed') raise ServiceRequestFailed(exc)
def service_handle_custom_action(editable, revision, user, action): data = { 'revision': EditingRevisionSignedSchema().dump(revision), 'action': action, 'user': ServiceUserSchema(context={'editable': editable}).dump(user), } try: path = '/event/{}/editable/{}/{}/{}/action'.format( _get_event_identifier(editable.event), editable.type.name, editable.contribution_id, revision.id ) resp = requests.post(_build_url(editable.event, path), headers=_get_headers(editable.event), json=data) resp.raise_for_status() resp = ServiceActionResultSchema().load(resp.json()) except (requests.RequestException, ValidationError) as exc: _log_service_error(exc, 'Calling listener for triggering custom action failed') raise ServiceRequestFailed(exc) if revision.final_state == FinalRevisionState.accepted: publish = resp.get('publish') if publish: publish_editable_revision(revision) elif publish is False: revision.editable.published_revision = None if 'tags' in resp: revision.tags = {tag for tag in editable.event.editing_tags if tag.id in map(int, resp['tags'])} for comment in resp.get('comments', []): create_revision_comment(revision, User.get_system_user(), comment['text'], internal=comment['internal']) db.session.flush() return resp
def _apply_changes(self, sender, **kwargs): # we are using after_request to avoid spam in case someone changes many contribution times if 'av_request_changes' not in g: return for req in g.av_request_changes: identifiers = get_data_identifiers(req) if req.state == RequestState.accepted and identifiers['dates'][ 0] != req.data['identifiers']['dates'][0]: notify_rescheduled_request(req) if not compare_data_identifiers( identifiers['locations'], req.data['identifiers']['locations']): if (not count_capable_contributions(req.event)[0] and req.state in {RequestState.accepted, RequestState.pending} and not is_av_manager(req.created_by_user)): janitor = User.get_system_user() data = dict(req.data, comment=render_plugin_template( 'auto_reject_no_capable_contribs.txt')) req.definition.reject(req, data, janitor) elif req.state == RequestState.accepted: notify_relocated_request(req) req.data['identifiers'] = identifiers flag_modified(req, 'data')
def category_cleanup(): from indico.modules.events import Event janitor_user = User.get_system_user() logger.debug("Checking whether any categories should be cleaned up") for categ_id, days in config.CATEGORY_CLEANUP.iteritems(): try: category = Category.get(int(categ_id), is_deleted=False) except KeyError: logger.warning("Category %s does not exist!", categ_id) continue now = now_utc() to_delete = Event.query.with_parent(category).filter(Event.created_dt < (now - timedelta(days=days))).all() if not to_delete: continue logger.info("Category %s: %s events were created more than %s days ago and will be deleted", categ_id, len(to_delete), days) for i, event in enumerate(to_delete, 1): logger.info("Deleting %s", event) event.delete('Cleaning up category', janitor_user) if i % 100 == 0: db.session.commit() db.session.commit()
def category_cleanup(): from indico.modules.events import Event janitor_user = User.get_system_user() logger.debug("Checking whether any categories should be cleaned up") for categ_id, days in config.CATEGORY_CLEANUP.iteritems(): try: category = Category.get(int(categ_id), is_deleted=False) except KeyError: logger.warning("Category %s does not exist!", categ_id) continue now = now_utc() to_delete = Event.query.with_parent(category).filter( Event.created_dt < (now - timedelta(days=days))).all() if not to_delete: continue logger.info( "Category %s: %s events were created more than %s days ago and will be deleted", categ_id, len(to_delete), days) for i, event in enumerate(to_delete, 1): logger.info("Deleting %s", event) event.delete('Cleaning up category', janitor_user) if i % 100 == 0: db.session.commit() db.session.commit()
def __init__(self, *args, **kwargs): super(EventImporter, self).__init__(*args, **kwargs) del kwargs['system_user_id'] self.system_user = User.get_system_user() self.migrate_broken_events = kwargs.get('migrate_broken_events') self.debug = kwargs.get('debug') self.kwargs = kwargs self.kwargs['system_user'] = self.system_user
def migrate(self): default_conference = getattr(self.zodb_root['MaKaCInfo']['main'], '_defaultConference', None) if not default_conference: self.print_warning('%[yellow!]Server has no default conference') return system_user = User.get_system_user() BadgeMigration(self, default_conference, None, system_user).run() PosterMigration(self, default_conference, None, system_user).run()
def _process(self, text, internal): user = session.user if self.is_service_call: user = User.get_system_user() elif internal and not self.editable.can_use_internal_comments(session.user): internal = False create_revision_comment(self.revision, user, text, internal) return '', 201
def _process(self, comment, state): args = parser.parse({ 'tags': EditingTagsField(self.event, allow_system_tags=self.is_service_call, missing=set()), 'files': EditingFilesField(self.event, self.contrib, self.editable_type, allow_claimed_files=True, required=True) }) user = User.get_system_user() if self.is_service_call else session.user replace_revision(self.revision, user, comment, args['files'], args['tags'], state) return '', 204
def migrate_system_user(self): if self.system_user_id is not None: user = User.get(self.system_user_id, is_deleted=False) if not user: raise Exception('Invalid system_user user id') user.is_system = True self.print_success('Using existing system user: {}'.format(user), always=True) return user_id = 0 if not User.get(0) else None db.session.add(User(id=user_id, is_system=True, first_name='Indico', last_name='System')) db.session.flush() self.print_success('Added new system user: {}'.format(User.get_system_user()), always=True)
def __init__(self, source_file, category_id=0, create_users=None, verbose=False, force=False): self.source_file = source_file self.category_id = category_id self.create_users = create_users self.verbose = verbose self.force = force self.archive = tarfile.open(fileobj=source_file) self.data = yaml.unsafe_load(self.archive.extractfile('data.yaml')) self.id_map = {} self.user_map = {} self.event_id = None self.system_user_id = User.get_system_user().id self.spec = self._load_spec() self.deferred_idrefs = defaultdict(set)
def update_room_from_obj(settings, vc_room, room_obj): """Updates a VCRoom DB object using a SOAP room object returned by the API""" vc_room.name = room_obj.name if room_obj.ownerName != vc_room.data['owner_identity']: owner = get_user_from_identifier(settings, room_obj.ownerName) or User.get_system_user() vc_room.vidyo_extension.owned_by_user = owner vc_room.data.update({ 'description': room_obj.description, 'vidyo_id': unicode(room_obj.roomID), 'url': room_obj.RoomMode.roomURL, 'owner_identity': room_obj.ownerName, 'room_pin': room_obj.RoomMode.roomPIN if room_obj.RoomMode.hasPIN else "", 'moderation_pin': room_obj.RoomMode.moderatorPIN if room_obj.RoomMode.hasModeratorPIN else "", }) vc_room.vidyo_extension.extension = int(room_obj.extension)
def update_room_from_obj(settings, vc_room, room_obj): """Updates a VCRoom DB object using a SOAP room object returned by the API""" vc_room.name = room_obj.name if room_obj.ownerName != vc_room.data['owner_identity']: owner = get_user_from_identifier(settings, room_obj.ownerName) or User.get_system_user() vc_room.zoom_meeting.owned_by_user = owner vc_room.data.update({ 'description': room_obj.description, 'zoom_id': unicode(room_obj.roomID), 'url': room_obj.RoomMode.roomURL, 'owner_identity': room_obj.ownerName, 'room_pin': room_obj.RoomMode.roomPIN if room_obj.RoomMode.hasPIN else "", 'moderation_pin': room_obj.RoomMode.moderatorPIN if room_obj.RoomMode.hasModeratorPIN else "", }) vc_room.zoom_meeting.extension = int(room_obj.extension)
def migrate(self): default_conference = getattr(self.zodb_root['MaKaCInfo']['main'], '_defaultConference', None) if not default_conference: self.print_warning('%[yellow!]Server has no default conference') return system_user = User.get_system_user() BadgeMigration(self, default_conference, None, system_user).run() PosterMigration(self, default_conference, None, system_user).run() dt = DesignerTemplate(category_id=0, title='Default ticket', type=TemplateType.badge, data=DEFAULT_TEMPLATE_DATA, is_system_template=True) Category.get_root().default_ticket_template = dt db.session.commit()
def _event_deleted(event, **kwargs): user = session.user if has_request_context() and session.user else User.get_system_user() for event_vc_room in VCRoomEventAssociation.find_for_event(event, include_hidden=True, include_deleted=True): event_vc_room.delete(user)
def _event_deleted(event, **kwargs): user = session.user if has_request_context() and session.user else User.get_system_user() for event_vc_room in VCRoomEventAssociation.find_for_event(event, include_hidden=True, include_deleted=True): event_vc_room.delete(user)
def __init__(self, *args, **kwargs): self._set_config_options(**kwargs) self.system_user = User.get_system_user() super(CategoryImporter, self).__init__(*args, **kwargs) self.categ_id_counter = self.zodb_root['counters']['CATEGORY']._Counter__count