def fields(self): query = (Room.query.filter( ~Room.is_deleted, Room.id.in_(get_managed_room_ids(self.user))).order_by( func.indico.natsort(Room.full_name))) fields = { 'email_mode': IndicoEnumSelectField( _('Room notifications'), enum=RoomEmailMode, description=_( 'If you own or manage any rooms, you can choose whether to ' 'receive notifications about activity related to them.')), 'email_blacklist': IndicoQuerySelectMultipleField( _('Room blacklist'), query_factory=lambda: query, get_label='full_name', collection_class=set, render_kw={'size': 10}, description=_('Regardless of the room notifications selected ' 'above, you will never receive notifications ' 'for rooms selected in this list.')) } if not query.count(): # don't show an empty select field if user doesn't manage any rooms del fields['email_blacklist'] return fields
def test_managed_rooms(monkeypatch, bulk_possible, create_user, create_room, dummy_user): from indico.modules.rb.operations.rooms import get_managed_room_ids monkeypatch.setattr(User, 'can_get_all_multipass_groups', bulk_possible) users = { 'x': { 'first_name': 'Regular', 'last_name': 'User' }, 'y': { 'first_name': 'Room', 'last_name': 'Owner' }, 'z': { 'first_name': 'ManyRooms', 'last_name': 'Owner' } } rooms = { 'a': { 'verbose_name': 'Red room', 'owner': 'z' }, 'b': { 'verbose_name': 'Blue room', 'owner': 'y' }, 'c': { 'verbose_name': 'Green room', 'owner': 'y' } } user_map = { key: create_user(id_, **data) for id_, (key, data) in enumerate(users.items(), 1) } room_map = {} for id_, (key, data) in enumerate(rooms.items(), 1): data['id'] = id_ data['owner'] = user_map[data['owner']] room_map[key] = create_room(**data) room_map['a'].update_principal(user_map['y'], full_access=True) for key, user in user_map.items(): room_ids = [ room.id for room in room_map.values() if (room.owner == user_map[key] or room.can_manage(user)) ] assert get_managed_room_ids(user) == set(room_ids)
def get_room_blockings(timeframe=None, created_by=None, in_rooms_owned_by=None): query = (Blocking.query .join(Blocking.blocked_rooms) .join(BlockedRoom.room) .options(contains_eager('blocked_rooms').contains_eager('room'), selectinload('_allowed'))) criteria = [] if timeframe == 'recent': criteria.append(Blocking.end_date >= date.today()) elif timeframe == 'year': criteria.extend([Blocking.start_date <= date(date.today().year, 12, 31), Blocking.end_date >= date(date.today().year, 1, 1)]) if created_by: criteria.append(Blocking.created_by_user == created_by) if in_rooms_owned_by: criteria.append(BlockedRoom.room_id.in_(get_managed_room_ids(in_rooms_owned_by))) query = query.filter(db.and_(*criteria)) return query.all()
def is_active(cls, user): return (rb_user_settings.get(user, 'email_mode', None) is not None or rb_user_settings.get(user, 'email_blacklist', None) is not None or get_managed_room_ids(user))