Пример #1
0
    def unset_computerroom_exammode(self,
                                    request,
                                    ldap_user_read=None,
                                    ldap_admin_write=None,
                                    ldap_position=None):
        '''Remove all member hosts of a given computer room from the special exam group.'''

        roomdn = request.options['roomdn']
        try:
            room = ComputerRoom.from_dn(roomdn, None, ldap_user_read)
        except univention.admin.uexceptions.noObject:
            raise UMC_Error('Room %r not found.' % (roomdn, ))
        except univention.admin.uexceptions.ldapError:
            raise

        # Remove all host members of room from examGroup
        host_uid_list = [
            univention.admin.uldap.explodeDn(uniqueMember, 1)[0] + '$'
            for uniqueMember in room.hosts
        ]
        examGroup = self.examGroup(ldap_admin_write, ldap_position,
                                   room.school)
        examGroup.fast_member_remove(
            room.hosts, host_uid_list
        )  # removes any uniqueMember and member listed if still present

        self.finished(request.id, {}, success=True)
Пример #2
0
 def validate_room(self, request, ldap_user_read=None, ldap_position=None):
     error = None
     dn = request.options['room']
     room = ComputerRoom.from_dn(dn, None, ldap_user_read)
     if not room.hosts:
         # FIXME: raise UMC_Error()
         error = _(
             'Room "%s" does not contain any computers. Empty rooms may not be used to start an exam.'
         ) % room.get_relative_name()
     self.finished(request.id, error)
Пример #3
0
    def remove(self, request, ldap_user_write=None, ldap_user_read=None):
        """Deletes a room"""

        try:
            room_dn = request.options[0]['object'][0]
            room = ComputerRoom.from_dn(room_dn, None, ldap_user_write)
            room.remove(ldap_user_write)
        except udm_exceptions.base as e:
            self.finished(request.id, [{'success': False, 'message': str(e)}])
            return

        self.finished(request.id, [{'success': True}])
Пример #4
0
    def room_acquire(self, request, ldap_user_read=None):
        """Acquires the specified computerroom"""
        roomDN = request.options['room']

        success = True
        message = 'OK'

        # match the corresponding school OU
        try:
            room = ComputerRoom.from_dn(roomDN, None, ldap_user_read)
            school = room.school
        except udm_exceptions.noObject:
            success = False
            message = 'UNKNOWN_ROOM'
        else:
            # set room and school
            if self._italc.school != school:
                self._italc.school = school
            if self._italc.room != roomDN:
                try:
                    self._italc.room = roomDN
                except ITALC_Error:
                    success = False
                    message = 'EMPTY_ROOM'

        # update the room info file
        if success:
            _updateRoomInfo(roomDN, user=self.user_dn)
            if not compare_dn(_getRoomOwner(roomDN), self.user_dn):
                success = False
                message = 'ALREADY_LOCKED'

        info = dict()
        if success:
            info = _readRoomInfo(roomDN)
        self.finished(
            request.id,
            dict(success=success,
                 message=message,
                 info=dict(
                     exam=info.get('exam'),
                     examDescription=info.get('examDescription'),
                     examEndTime=info.get('examEndTime'),
                     room=info.get('room'),
                     user=info.get('user'),
                 )))
Пример #5
0
    def _set(self, room, ldap_user_read=None):
        lo = ldap_user_read

        room_dn = room
        try:  # room DN
            ldap.dn.str2dn(room)
        except ldap.DECODING_ERROR:  # room name
            room_dn = None  # got a name instead of a DN

        try:
            if room_dn:
                computerroom = ComputerRoom.from_dn(room, ITALC_Manager.SCHOOL,
                                                    lo)
            else:
                computerroom = ComputerRoom.get_only_udm_obj(
                    lo, filter_format('cn=%s-%s',
                                      (ITALC_Manager.SCHOOL, room)))
                if computerroom is None:
                    raise noObject(computerroom)
                computerroom = ComputerRoom.from_udm_obj(
                    computerroom, ITALC_Manager.SCHOOL, lo)
        except noObject:
            raise ITALC_Error('Unknown computer room')
        except MultipleObjectsError as exc:
            raise ITALC_Error(
                'Did not find exactly 1 group for the room (count: %d)' %
                len(exc.objs))

        ITALC_Manager.ROOM = computerroom.get_relative_name()
        ITALC_Manager.ROOM_DN = computerroom.dn

        computers = list(computerroom.get_computers(lo))
        if not computers:
            raise ITALC_Error('There are no computers in the selected room.')

        for computer in computers:
            try:
                comp = ITALC_Computer(computer.get_udm_object(lo))
                self.__setitem__(comp.name, comp)
            except ITALC_Error as exc:
                MODULE.warn('Computer could not be added: %s' % (exc, ))
Пример #6
0
 def get(self, request, ldap_user_read=None):
     # open the specified room
     room = ComputerRoom.from_dn(request.options[0], None, ldap_user_read)
     result = room.to_dict()
     result['computers'] = result.get('hosts')
     self.finished(request.id, [result])