Example #1
0
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
Example #2
0
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
Example #3
0
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
Example #4
0
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
Example #5
0
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