Exemplo n.º 1
0
    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')
Exemplo n.º 2
0
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)
Exemplo n.º 3
0
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
Exemplo n.º 4
0
    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')
Exemplo n.º 5
0
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()
Exemplo n.º 6
0
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()
Exemplo n.º 7
0
 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
Exemplo n.º 8
0
 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()
Exemplo n.º 9
0
    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
Exemplo n.º 10
0
    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
Exemplo n.º 11
0
 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)
Exemplo n.º 12
0
 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)
Exemplo n.º 13
0
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)
Exemplo n.º 14
0
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)
Exemplo n.º 15
0
 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()
Exemplo n.º 16
0
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)
Exemplo n.º 17
0
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)
Exemplo n.º 18
0
 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