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)
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)
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}])
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'), )))
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, ))
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])