Example #1
0
def _log_category_update(category, changes):
    log_fields = {
        'title': {
            'title': 'Title',
            'type': 'string'
        },
        'description': 'Description',
        'timezone': {
            'title': 'Timezone',
            'type': 'string'
        },
        'suggestions_disabled': 'Disable suggestions',
        'is_flat_view_enabled': 'Allow flat view',
        'event_message_mode': 'Event header message type',
        'event_message': 'Event header message',
        'notify_managers': 'Notify managers about event creation',
        'event_creation_notification_emails':
        'Event creation notification emails'
    }
    if changes:
        what = 'Settings'
        if len(changes) == 1:
            what = log_fields[list(changes)[0]]
            if isinstance(what, dict):
                what = what['title']
        category.log(CategoryLogRealm.category,
                     LogKind.change,
                     'Category',
                     f'{what} updated',
                     session.user,
                     data={'Changes': make_diff_log(changes, log_fields)})
    logger.info('Category %s updated by %s', category, session.user)
Example #2
0
def category_cleanup():
    from indico.modules.events import Event
    cfg = Config.getInstance()
    janitor_user = User.get_one(cfg.getJanitorUserId())

    logger.debug("Checking whether any categories should be cleaned up")
    for categ_id, days in cfg.getCategoryCleanup().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()
Example #3
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.items():
        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()
Example #4
0
 def _process_POST(self):
     f = request.files[self.IMAGE_TYPE]
     try:
         img = Image.open(f)
     except IOError:
         flash(_('You cannot upload this file as an icon/logo.'), 'error')
         return jsonify_data(content=None)
     if img.format.lower() not in {'jpeg', 'png', 'gif'}:
         flash(_('The file has an invalid format ({format})').format(format=img.format), 'error')
         return jsonify_data(content=None)
     if img.mode == 'CMYK':
         flash(_('The image you uploaded is using the CMYK colorspace and has been converted to RGB.  '
                 'Please check if the colors are correct and convert it manually if necessary.'), 'warning')
         img = img.convert('RGB')
     img = self._resize(img)
     image_bytes = BytesIO()
     img.save(image_bytes, 'PNG')
     image_bytes.seek(0)
     content = image_bytes.read()
     metadata = {
         'hash': crc32(content),
         'size': len(content),
         'filename': os.path.splitext(secure_filename(f.filename, self.IMAGE_TYPE))[0] + '.png',
         'content_type': 'image/png'
     }
     self._set_image(content, metadata)
     flash(self.SAVED_FLASH_MSG, 'success')
     logger.info("New {} '%s' uploaded by %s (%s)".format(self.IMAGE_TYPE), f.filename, session.user, self.category)
     return jsonify_data(content=get_image_data(self.IMAGE_TYPE, self.category))
Example #5
0
File: tasks.py Project: fph/indico
def category_cleanup():
    from indico.modules.events import Event
    cfg = Config.getInstance()
    janitor_user = User.get_one(cfg.getJanitorUserId())

    logger.debug("Checking whether any categories should be cleaned up")
    for categ_id, days in cfg.getCategoryCleanup().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.as_legacy.delete(user=janitor_user)
            if i % 100 == 0:
                db.session.commit()
                DBMgr.getInstance().commit()
        db.session.commit()
        DBMgr.getInstance().commit()
Example #6
0
def update_category_protection(category, data):
    assert set(data) <= {
        'protection_mode', 'own_no_access_contact', 'event_creation_mode',
        'visibility'
    }
    changes = category.populate_from_dict(data)
    db.session.flush()
    signals.category.updated.send(category, changes=changes)
    logger.info('Protection of category %r updated with %r by %r', category,
                data, session.user)
    if changes:
        log_fields = {
            'protection_mode': 'Protection mode',
            'own_no_access_contact': 'No access contact',
            'visibility': {
                'title':
                'Visibility',
                'type':
                'string',
                'convert':
                lambda changes:
                [format_visibility(category, x) for x in changes]
            },
            'event_creation_mode': 'Event creation mode'
        }
        category.log(CategoryLogRealm.category,
                     LogKind.change,
                     'Category',
                     'Protection updated',
                     session.user,
                     data={'Changes': make_diff_log(changes, log_fields)})
Example #7
0
 def _process(self):
     for data in request.json['users']:
         user = principal_from_fossil(data, allow_pending=True, allow_groups=False)
         if user not in self.role.members:
             self.role.members.add(user)
             logger.info('User %r added to role %r by %r', user, self.role, session.user)
     return jsonify_data(html=_render_role(self.role, collapsed=False))
Example #8
0
def category_cleanup():
    cfg = Config.getInstance()
    janitor_user = User.get_one(cfg.getJanitorUserId())

    logger.debug("Checking whether any categories should be cleaned up")
    for categ_id, days in cfg.getCategoryCleanup().iteritems():
        try:
            category = CategoryManager().getById(categ_id)
        except KeyError:
            logger.warning("Category %s does not exist!", categ_id)
            continue

        now = now_utc()
        to_delete = [ev for ev in category.conferences if (now - ev._creationDS) > timedelta(days=days)]
        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(user=janitor_user)
            if i % 100 == 0:
                db.session.commit()
                DBMgr.getInstance().commit()
        db.session.commit()
        DBMgr.getInstance().commit()
Example #9
0
def category_cleanup():
    cfg = Config.getInstance()
    janitor_user = User.get_one(cfg.getJanitorUserId())

    logger.debug("Checking whether any categories should be cleaned up")
    for categ_id, days in cfg.getCategoryCleanup().iteritems():
        try:
            category = CategoryManager().getById(categ_id)
        except KeyError:
            logger.warning("Category {} does not exist!".format(categ_id))
            continue

        now = now_utc()
        to_delete = [ev for ev in category.conferences if (now - ev._creationDS) > timedelta(days=days)]
        if not to_delete:
            continue

        logger.info("Category {}: {} events were created more than {} days ago and will be deleted".format(
            categ_id, len(to_delete), days
        ))
        for i, event in enumerate(to_delete, 1):
            logger.info("Deleting {}".format(event))
            event.delete(user=janitor_user)
            if i % 100 == 0:
                db.session.commit()
                DBMgr.getInstance().commit()
        db.session.commit()
        DBMgr.getInstance().commit()
Example #10
0
 def _process_POST(self):
     f = request.files[self.IMAGE_TYPE]
     try:
         img = Image.open(f)
     except IOError:
         flash(_('You cannot upload this file as an icon/logo.'), 'error')
         return jsonify_data(content=None)
     if img.format.lower() not in {'jpeg', 'png', 'gif'}:
         flash(_('The file has an invalid format ({format})').format(format=img.format), 'error')
         return jsonify_data(content=None)
     if img.mode == 'CMYK':
         flash(_('The image you uploaded is using the CMYK colorspace and has been converted to RGB.  '
                 'Please check if the colors are correct and convert it manually if necessary.'), 'warning')
         img = img.convert('RGB')
     img = self._resize(img)
     image_bytes = BytesIO()
     img.save(image_bytes, 'PNG')
     image_bytes.seek(0)
     content = image_bytes.read()
     metadata = {
         'hash': crc32(content),
         'size': len(content),
         'filename': os.path.splitext(secure_filename(f.filename, self.IMAGE_TYPE))[0] + '.png',
         'content_type': 'image/png'
     }
     self._set_image(content, metadata)
     flash(self.SAVED_FLASH_MSG, 'success')
     logger.info("New {} '%s' uploaded by %s (%s)".format(self.IMAGE_TYPE), f.filename, session.user, self.category)
     return jsonify_data(content=get_image_data(self.IMAGE_TYPE, self.category))
Example #11
0
 def _process(self):
     form = CategoryRoleForm(obj=self.role, category=self.category)
     if form.validate_on_submit():
         form.populate_obj(self.role)
         db.session.flush()
         logger.info('Category role %r updated by %r', self.role, session.user)
         return jsonify_data(html=_render_role(self.role))
     return jsonify_form(form)
Example #12
0
 def _process(self):
     form = CategoryRoleForm(category=self.category, color=self._get_color())
     if form.validate_on_submit():
         role = CategoryRole(category=self.category)
         form.populate_obj(role)
         db.session.flush()
         logger.info('Category role %r created by %r', role, session.user)
         return jsonify_data(html=_render_roles(self.category), role=serialize_category_role(role))
     return jsonify_form(form)
Example #13
0
def create_category(parent, data):
    category = Category(parent=parent)
    data.setdefault('default_event_themes', parent.default_event_themes)
    data.setdefault('timezone', parent.timezone)
    category.populate_from_dict(data)
    db.session.add(category)
    db.session.flush()
    signals.category.created.send(category)
    logger.info('Category %s created by %s', category, session.user)
    return category
Example #14
0
def delete_category(category):
    category.is_deleted = True
    db.session.flush()
    signals.category.deleted.send(category)
    logger.info('Category %s deleted by %s', category, session.user)
    category.log(CategoryLogRealm.category, LogKind.negative, 'Category',
                 'Category deleted', session.user)
    category.parent.log(CategoryLogRealm.category, LogKind.negative, 'Content',
                        f'Subcategory deleted: "{category.title}"',
                        session.user)
Example #15
0
def create_category(parent, data):
    category = Category(parent=parent)
    data.setdefault("default_event_themes", parent.default_event_themes)
    data.setdefault("timezone", parent.timezone)
    category.populate_from_dict(data)
    db.session.add(category)
    db.session.flush()
    signals.category.created.send(category)
    logger.info("Category %s created by %s", category, session.user)
    return category
Example #16
0
 def _process(self):
     form = CategoryRoleForm(obj=self.role, category=self.category)
     if form.validate_on_submit():
         form.populate_obj(self.role)
         db.session.flush()
         logger.info('Category role %r updated by %r', self.role,
                     session.user)
         self.category.log(CategoryLogRealm.category, LogKind.change,
                           'Roles', f'Updated role: "{self.role.name}"',
                           session.user)
         return jsonify_data(html=_render_role(self.role))
     return jsonify_form(form)
Example #17
0
def update_category(category, data, skip=()):
    assert set(data) <= {
        'title', 'description', 'timezone', 'suggestions_disabled',
        'is_flat_view_enabled', 'event_message_mode', 'event_message',
        'notify_managers', 'event_creation_notification_emails', *skip
    }
    changes = category.populate_from_dict(data, skip=skip)
    db.session.flush()
    signals.category.updated.send(category)
    logger.info('Category %s updated with %r by %s', category, data,
                session.user)
    _log_category_update(category, changes)
Example #18
0
 def _process(self):
     form = CategoryRoleForm(category=self.category,
                             color=self._get_color())
     if form.validate_on_submit():
         role = CategoryRole(category=self.category)
         form.populate_obj(role)
         db.session.flush()
         logger.info('Category role %r created by %r', role, session.user)
         self.category.log(CategoryLogRealm.category, LogKind.positive,
                           'Roles', f'Added role: "{role.name}"',
                           session.user)
         return jsonify_data(html=_render_roles(self.category),
                             role=serialize_category_role(role))
     return jsonify_form(form)
Example #19
0
 def _process(self, users):
     for user in users - self.role.members:
         self.role.members.add(user)
         logger.info('User %r added to role %r by %r', user, self.role,
                     session.user)
         self.category.log(CategoryLogRealm.category,
                           LogKind.positive,
                           'Roles',
                           f'Added user to role "{self.role.name}"',
                           session.user,
                           data={
                               'Name': user.full_name,
                               'Email': user.email
                           })
     return jsonify_data(html=_render_role(self.role, collapsed=False))
Example #20
0
 def _process(self):
     if self.user in self.role.members:
         self.role.members.remove(self.user)
         logger.info('User %r removed from role %r by %r', self.user,
                     self.role, session.user)
         self.category.log(CategoryLogRealm.category,
                           LogKind.negative,
                           'Roles',
                           f'Removed user from role "{self.role.name}"',
                           session.user,
                           data={
                               'Name': self.user.full_name,
                               'Email': self.user.email
                           })
     return jsonify_data(html=_render_role(self.role, collapsed=False))
Example #21
0
def create_category(parent, data):
    category = Category(parent=parent)
    data.setdefault('default_event_themes', parent.default_event_themes)
    data.setdefault('timezone', parent.timezone)
    category.populate_from_dict(data)
    db.session.add(category)
    db.session.flush()
    signals.category.created.send(category)
    logger.info('Category %s created by %s', category, session.user)
    sep = ' \N{RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK} '
    category.log(CategoryLogRealm.category,
                 LogKind.positive,
                 'Category',
                 'Category created',
                 session.user,
                 data={'Location': sep.join(category.chain_titles[:-1])})
    parent.log(CategoryLogRealm.category, LogKind.positive, 'Content',
               f'Subcategory created: "{category.title}"', session.user)
    return category
Example #22
0
 def _process(self):
     if self.user in self.role.members:
         self.role.members.remove(self.user)
         logger.info('User %r removed from role %r by %r', self.user,
                     self.role, session.user)
     return jsonify_data(html=_render_role(self.role, collapsed=False))
Example #23
0
 def _process(self):
     db.session.delete(self.role)
     logger.info('Category role %r deleted by %r', self.role, session.user)
     return jsonify_data(html=_render_roles(self.category))
Example #24
0
 def _process_DELETE(self):
     self._set_image(None, None)
     flash(self.DELETED_FLASH_MSG, 'success')
     logger.info("{} of %s deleted by %s".format(self.IMAGE_TYPE.title()),
                 self.category, session.user)
     return jsonify_data(content=None)
Example #25
0
 def _process(self, users):
     for user in users - self.role.members:
         self.role.members.add(user)
         logger.info('User %r added to role %r by %r', user, self.role,
                     session.user)
     return jsonify_data(html=_render_role(self.role, collapsed=False))
Example #26
0
def update_category(category, data, skip=()):
    category.populate_from_dict(data, skip=skip)
    db.session.flush()
    signals.category.updated.send(category)
    logger.info("Category %s updated by %s", category, session.user)
Example #27
0
def move_category(category, target_category):
    category.move(target_category)
    logger.info("Category %s moved to %s by %s", category, target_category, session.user)
Example #28
0
def delete_category(category):
    category.is_deleted = True
    db.session.flush()
    signals.category.deleted.send(category)
    logger.info("Category %s deleted by %s", category, session.user)
Example #29
0
 def _process(self):
     db.session.delete(self.role)
     logger.info('Category role %r deleted by %r', self.role, session.user)
     self.category.log(CategoryLogRealm.category, LogKind.negative, 'Roles',
                       f'Deleted role: "{self.role.name}"', session.user)
     return jsonify_data(html=_render_roles(self.category))
Example #30
0
def update_category(category, data, skip=()):
    category.populate_from_dict(data, skip=skip)
    db.session.flush()
    signals.category.updated.send(category)
    logger.info('Category %s updated by %s', category, session.user)
Example #31
0
def move_category(category, target_category):
    category.move(target_category)
    logger.info('Category %s moved to %s by %s', category, target_category, session.user)
Example #32
0
def delete_category(category):
    category.is_deleted = True
    db.session.flush()
    signals.category.deleted.send(category)
    logger.info('Category %s deleted by %s', category, session.user)
Example #33
0
 def _process_DELETE(self):
     self._set_image(None, None)
     flash(self.DELETED_FLASH_MSG, 'success')
     logger.info("{} of %s deleted by %s".format(self.IMAGE_TYPE.title()), self.category, session.user)
     return jsonify_data(content=None)