def move(user, building_id, level, room_number, processor, when=None): """Moves the user into another room. :param user: The user to be moved. :param building_id: The id of the building. :param level: The level of the new room. :param room_number: The number of the new room. :param processor: The user who is currently logged in. :param when: The date at which the user should be moved :return: The user object of the moved user. :rtype: User """ if when and when > session.utcnow(): return schedule_user_task(task_type=TaskType.USER_MOVE, due=when, user=user, parameters={ 'building_id': building_id, 'level': level, 'room_number': room_number }, processor=processor) else: old_room = user.room had_custom_address = user.has_custom_address new_room = Room.q.filter_by(number=room_number, level=level, building_id=building_id).one() assert old_room != new_room,\ "A User is only allowed to move in a different room!" user.room = new_room if not had_custom_address: user.address = new_room.address message = deferred_gettext(u"Moved from {} to {}.") log_user_event(author=processor, message=message.format(str(old_room), str(new_room)).to_json(), user=user) for user_host in user.hosts: if user_host.room == old_room: migrate_user_host(user_host, new_room, processor) user_send_mail(user, UserMovedInTemplate(), True) return user
def move_out(user, comment, processor, when, end_membership=True): """Move out a user and may terminate relevant memberships. The user's room is set to ``None`` and all hosts are deleted. Memberships in :py:obj:`config.member_group` and :py:obj:`config.member_group` are terminated. A log message is created including the number of deleted hosts. :param User user: The user to move out. :param unicode|None comment: An optional comment :param User processor: The admin who is going to move out the user. :param datetime when: The time the user is going to move out. :param bool end_membership: Ends membership if true :return: The user that moved out. """ if when > session.utcnow(): return schedule_user_task(task_type=TaskType.USER_MOVE_OUT, due=when, user=user, parameters={'comment': comment, 'end_membership': end_membership}, processor=processor) else: if end_membership: for group in {config.member_group, config.external_group, config.cache_group, config.network_access_group}: if user.member_of(group): remove_member_of(user, group, processor, closedopen(when, None)) user.birthdate = None deleted_interfaces = list() num_hosts = 0 for num_hosts, h in enumerate(user.hosts, 1): if not h.switch and (h.room == user.room or end_membership): for interface in h.interfaces: deleted_interfaces.append(interface.mac) session.session.delete(h) message = None if user.room is not None: message = u"Moved out of {room}: Deleted interfaces {interfaces} of {num_hosts} hosts."\ .format(room=user.room.short_name, num_hosts=num_hosts, interfaces=', '.join(deleted_interfaces)) had_custom_address = user.has_custom_address user.room = None else: if num_hosts: message = u"Deleted interfaces {interfaces} of {num_hosts} hosts." \ .format(num_hosts=num_hosts, interfaces=', '.join(deleted_interfaces)) if message is not None: if comment: message += u"\nComment: {}".format(comment) log_user_event( message=deferred_gettext(message).to_json(), author=processor, user=user ) return user
def move_in(user, building_id, level, room_number, mac, processor, birthdate=None, host_annex=False, begin_membership=True, when=None): """Move in a user in a given room and do some initialization. The user is given a new Host with an interface of the given mac, a UnixAccount, a finance Account, and is made member of important groups. Networking is set up. :param User user: The user to move in :param int building_id: :param int level: :param str room_number: :param str mac: The mac address of the users pc. :param User processor: :param Date birthdate: Date of birth` :param bool host_annex: when true: if MAC already in use, annex host to new user :param bool begin_membership: Starts a membership if true :param datetime when: The date at which the user should be moved in :return: The user object. """ if when and when > session.utcnow(): return schedule_user_task(task_type=TaskType.USER_MOVE_IN, due=when, user=user, parameters={'building_id': building_id, 'level': level, 'room_number': room_number, 'mac': mac, 'birthdate': birthdate, 'host_annex': host_annex, 'begin_membership': begin_membership}, processor=processor) else: room = get_room(building_id, level, room_number) if birthdate: user.birthdate = birthdate if begin_membership: if user.member_of(config.external_group): remove_member_of(user, config.external_group, processor, closedopen(session.utcnow(), None)) for group in {config.member_group, config.network_access_group}: if not user.member_of(group): make_member_of(user, group, processor, closed(session.utcnow(), None)) if room: user.room = room user.address = room.address if mac and user.birthdate: interface_existing = Interface.q.filter_by(mac=mac).first() if interface_existing is not None: if host_annex: host_existing = interface_existing.host host_existing.owner_id = user.id session.session.add(host_existing) migrate_user_host(host_existing, user.room, processor) else: raise MacExistsException else: new_host = Host(owner=user, room=room) session.session.add(new_host) session.session.add(Interface(mac=mac, host=new_host)) setup_ipv4_networking(new_host) msg = deferred_gettext(u"Moved in: {room}") log_user_event(author=processor, message=msg.format(room=room.short_name).to_json(), user=user) return user
def move(user, building_id, level, room_number, processor, comment=None, when=None): """Moves the user into another room. :param user: The user to be moved. :param building_id: The id of the building. :param level: The level of the new room. :param room_number: The number of the new room. :param processor: The user initiating this process. Becomes author of the log message. Not used if execution is deferred! :param comment: a comment to be included in the log message. :param when: The date at which the user should be moved :return: The user object of the moved user. :rtype: User """ if when and when > session.utcnow(): task_params = UserMoveParams(building_id=building_id, level=level, room_number=room_number, comment=comment) return schedule_user_task(task_type=TaskType.USER_MOVE, due=when, user=user, parameters=task_params, processor=processor) old_room = user.room had_custom_address = user.has_custom_address new_room = Room.q.filter_by(number=room_number, level=level, building_id=building_id).one() assert old_room != new_room,\ "A User is only allowed to move in a different room!" user.room = new_room if not had_custom_address: user.address = new_room.address args = {'old_room': str(old_room), 'new_room': str(new_room)} if comment: message = deferred_gettext("Moved from {old_room} to {new_room}.\n" "Comment: {comment}") args.update(comment=comment) else: message = deferred_gettext("Moved from {old_room} to {new_room}.") log_user_event(author=processor, message=message.format(**args).to_json(), user=user) for user_host in user.hosts: if user_host.room == old_room: migrate_user_host(user_host, new_room, processor) user_send_mail(user, UserMovedInTemplate(), True) return user
def move_in(user: User, building_id: int, level: int, room_number: str, mac: str | None, processor: User | None = None, birthdate: date = None, host_annex: bool = False, begin_membership: bool = True, when: datetime | None = None): """Move in a user in a given room and do some initialization. The user is given a new Host with an interface of the given mac, a UnixAccount, a finance Account, and is made member of important groups. Networking is set up. :param User user: The user to move in :param building_id: :param level: :param room_number: :param mac: The mac address of the users pc. :param processor: :param birthdate: Date of birth` :param host_annex: when true: if MAC already in use, annex host to new user :param begin_membership: Starts a membership if true :param when: The date at which the user should be moved in :return: The user object. """ if when and when > session.utcnow(): task_params = UserMoveInParams(building_id=building_id, level=level, room_number=room_number, mac=mac, birthdate=birthdate, host_annex=host_annex, begin_membership=begin_membership) return schedule_user_task(task_type=TaskType.USER_MOVE_IN, due=when, user=user, parameters=task_params, processor=processor) if user.room is not None: raise ValueError("user is already living in a room.") room = get_room(building_id, level, room_number) if birthdate: user.birthdate = birthdate if begin_membership: for group in {config.external_group, config.pre_member_group}: if user.member_of(group): remove_member_of(user, group, processor, closedopen(session.utcnow(), None)) for group in {config.member_group, config.network_access_group}: if not user.member_of(group): make_member_of(user, group, processor, closed(session.utcnow(), None)) if room: user.room = room user.address = room.address if mac and user.birthdate: interface_existing = Interface.q.filter_by(mac=mac).first() if interface_existing is not None: if host_annex: host_existing = interface_existing.host host_existing.owner_id = user.id session.session.add(host_existing) migrate_user_host(host_existing, user.room, processor) else: raise MacExistsException else: new_host = Host(owner=user, room=room) session.session.add(new_host) session.session.add(Interface(mac=mac, host=new_host)) setup_ipv4_networking(new_host) user_send_mail(user, UserMovedInTemplate(), True) msg = deferred_gettext("Moved in: {room}") log_user_event(author=processor if processor is not None else user, message=msg.format(room=room.short_name).to_json(), user=user) return user