Exemplo n.º 1
0
    def test_0010_move_in(self):
        test_name = u"Hans"
        test_login = u"hans66"
        test_email = u"*****@*****.**"
        test_building = self.room.building
        test_mac = "12:11:11:11:11:11"
        test_birthdate = "1990-01-01"

        address = get_room(building_id=test_building.id, level=1, room_number="1").address
        new_user, _ = UserHelper.create_user(
            test_name,
            test_login,
            test_email,
            test_birthdate,
            processor=self.processing_user,
            groups=[self.config.member_group],
            address=address
        )

        UserHelper.move_in(
            new_user,
            building_id=test_building.id,
            level=1,
            room_number="1",
            mac=test_mac,
            processor=self.processing_user,
        )

        self.assertEqual(new_user.name, test_name)
        self.assertEqual(new_user.login, test_login)
        self.assertEqual(new_user.email, test_email)
        self.assertEqual(new_user.room.building, test_building)
        self.assertEqual(new_user.room.number, "1")
        self.assertEqual(new_user.room.level, 1)
        self.assertEqual(new_user.address, new_user.room.address)

        user_host = host.Host.q.filter_by(owner=new_user).one()
        self.assertEqual(len(user_host.interfaces), 1)
        user_interface = user_host.interfaces[0]
        self.assertEqual(len(user_interface.ips), 1)
        self.assertEqual(user_interface.mac, test_mac)

        # checks the initial group memberships
        active_user_groups = new_user.active_property_groups()
        for group in {self.config.member_group, self.config.network_access_group}:
            self.assertIn(group, active_user_groups)

        self.assertIsNotNone(new_user.account)
        self.assertEqual(new_user.account.balance, 0)
        self.assertFalse(new_user.has_property("reduced_membership_fee"))
        self.assertTrue(new_user.unix_account is not None)
        account = new_user.unix_account
        self.assertTrue(account.home_directory.endswith(new_user.login))
        self.assertTrue(account.home_directory.startswith('/home/'))
Exemplo n.º 2
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
Exemplo n.º 3
0
def create():
    form = UserCreateForm(property_groups=[config.member_group])

    if form.is_submitted():
        unique_name_error = validate_unique_name(form, form.name)
        unique_email_error = validate_unique_email(form, form.email)
        unique_mac_error = validate_unique_mac(form, form.mac)

    if form.validate_on_submit() and not (
            unique_name_error or unique_email_error or unique_mac_error):

        room: Room = get_room(building_id=form.building.data.id,
                              level=form.level.data,
                              room_number=form.room_number.data)
        if not room:
            flash("Raum scheint nicht zu existieren…", 'error')
            return
        result, success = web_execute(
            lib.user.create_user,
            None,
            name=form.name.data,
            login=form.login.data,
            processor=current_user,
            email=form.email.data,
            birthdate=form.birthdate.data,
            groups=form.property_groups.data,
            address=room.address,
        )

        if success:
            (new_user, plain_password) = result

            # We only have to check if building is present, as the presence
            # of the other fields depends on building
            if form.building.data is not None:
                _, success = web_execute(lib.user.move_in,
                                         None,
                                         user=new_user,
                                         building_id=form.building.data.id,
                                         level=form.level.data,
                                         room_number=form.room_number.data,
                                         mac=form.mac.data,
                                         processor=current_user,
                                         host_annex=form.annex.data)

            if success:
                sheet = lib.user.store_user_sheet(new_user, plain_password)
                session.session.commit()

                flask_session['user_sheet'] = sheet.id
                flash(
                    Markup(
                        u'Benutzer angelegt. <a href="{}" target="_blank">Nutzerdatenblatt</a> verfügbar!'
                        .format(url_for('.user_sheet'))), 'success')

                return redirect(url_for('.user_show', user_id=new_user.id))

    if form.is_submitted():
        if unique_name_error:
            form.name.errors.append(unique_name_error)

        if unique_email_error:
            form.email.errors.append(unique_email_error)

        if unique_mac_error:
            form.mac.errors.append(unique_mac_error)

    return render_template('user/user_create.html', form=form)
Exemplo n.º 4
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
Exemplo n.º 5
0
    def test_0030_move_out(self):
        test_name = u"Hans"
        test_login = u"hans66"
        test_email = u"*****@*****.**"
        test_building = facilities.Building.q.first()
        test_mac = "12:11:11:11:11:11"
        test_birthdate = "1990-01-01"

        address = get_room(building_id=test_building.id,
                           level=1,
                           room_number="1").address

        new_user, _ = UserHelper.create_user(test_name,
                                             test_login,
                                             test_email,
                                             test_birthdate,
                                             processor=self.processing_user,
                                             groups=[config.member_group],
                                             address=address)

        UserHelper.move_in(
            new_user,
            building_id=test_building.id,
            level=1,
            room_number="1",
            mac=test_mac,
            processor=self.processing_user,
        )

        session.session.commit()

        out_time = session.utcnow()

        UserHelper.move_out(user=new_user,
                            comment="",
                            processor=self.processing_user,
                            when=out_time)

        session.session.refresh(new_user)
        # check ends_at of moved out user
        for membership in new_user.memberships:
            self.assertIsNotNone(membership.ends_at)
            self.assertLessEqual(membership.ends_at, out_time)

        self.assertFalse(new_user.hosts)
        self.assertIsNone(new_user.room)
        # move_out keeps user's address
        self.assertEquals(new_user.address, address)

        # check if users finance account still exists
        self.assertIsNotNone(new_user.account)

        UserHelper.move_in(
            user=new_user,
            building_id=test_building.id,
            level=1,
            room_number="1",
            mac=test_mac,
            birthdate=test_birthdate,
            processor=self.processing_user,
        )

        session.session.refresh(new_user)
        self.assertEqual(new_user.room.building, test_building)
        self.assertEqual(new_user.room.level, 1)
        self.assertEqual(new_user.room.number, "1")
        self.assertEqual(new_user.address, new_user.room.address)

        self.assertEqual(len(new_user.hosts), 1)
        user_host = new_user.hosts[0]
        self.assertEqual(len(user_host.interfaces), 1)
        self.assertEqual(user_host.interfaces[0].mac, test_mac)
        self.assertEqual(len(user_host.ips), 1)

        self.assertTrue(new_user.member_of(config.member_group))
        self.assertTrue(new_user.member_of(config.network_access_group))