View | Details | Raw Unified | Return to bug 28496
Collapse All | Expand All

(-)a/branches/ucs-3.1/ucs/management/univention-directory-manager-modules/modules/univention/admin/handlers/users/user.py (-67 / +18 lines)
 Lines 1008-1084   def sambaWorkstationsUnmap(workstations): Link Here 
1008
	return string.split(workstations[0],',')
1008
	return string.split(workstations[0],',')
1009
1009
1010
def logonHoursMap(logontimes):
1010
def logonHoursMap(logontimes):
1011
	"converts the bitfield 001110010110...100 to the respective string"
1011
	"""Converts array of bits set to an hex-string."""
1012
1012
	octets = [0] * (24 * 7 / 8)
1013
	# convert list of bit numbers to bit-string
1014
	# bitstring = '0' * 168
1015
	bitstring = ''.join( map( lambda x: x in logontimes and '1' or '0', range( 168 ) ) )
1016
1017
	# for idx in logontimes:
1018
	# 	bitstring[ idx ] = '1'
1019
1020
	logontimes = bitstring
1021
1022
	# the order of the bits of each byte has to be reversed. The reason for this is that
1013
	# the order of the bits of each byte has to be reversed. The reason for this is that
1023
	# consecutive bytes mean consecutive 8-hrs-intervals, but the leftmost bit stands for
1014
	# consecutive bytes mean consecutive 8-hrs-intervals, but the MSB stands for
1024
	# the last hour in that interval, the 2nd but leftmost bit for the second-but-last
1015
	# the last hour in that interval, the 2nd leftmost bit for the second-to-last
1025
	# hour and so on. We want to hide this from anybody using this feature.
1016
	# hour and so on. We want to hide this from anybody using this feature.
1026
	# See http://ma.ph-freiburg.de/tng/tng-technical/2003-04/msg00015.html for details.
1017
	# See <http://ma.ph-freiburg.de/tng/tng-technical/2003-04/msg00015.html> for details.
1027
1018
	for hour in logontimes:
1028
	newtimes = ""
1019
		idx, bit = divmod(hour, 8)
1029
	for i in range(0,21):
1020
		octets[idx] |= 1 << bit
1030
		bitlist=list(logontimes[(i*8):(i*8)+8])
1021
	return ''.join(['%02x' % _ for _ in octets])
1031
		bitlist.reverse()
1032
		newtimes+="".join(bitlist)
1033
	logontimes = newtimes
1034
1035
	# create a hexnumber from each 8-bit-segment
1036
	ret=""
1037
	for i in range(0,21):
1038
	        val=0
1039
	        exp=7
1040
	        for j in range((i*8), (i*8)+8):
1041
	                if not (logontimes[j]=="0"):
1042
	                        val+=2**exp
1043
	                exp-=1
1044
		# we now have: 0<=val<=255
1045
	        hx=hex(val)[2:4]
1046
	        if len(hx)==1: hx="0"+hx
1047
	        ret+=hx
1048
1049
	return ret
1050
1022
1051
def logonHoursUnmap(logontimes):
1023
def logonHoursUnmap(logontimes):
1052
	"converts the string to a bit array"
1024
	"""Converts hex-string to an array of bits set."""
1053
1025
	times = logontimes[0].ljust(42, '0')[:42]
1054
	times=logontimes[0][:42]
1026
	assert len(times) == 24 * 7 / 4
1055
	while len(times)<42:
1027
	octets = [int(times[i : i + 2], 16) for i in range(0, len(times), 2)]
1056
		times=times
1028
	assert len(octets) == 24 * 7 / 8
1057
        ret=""
1029
	return [idx * 8 + bit
1058
        for i in range(0,42,2):
1030
			for (idx, value) in enumerate(octets)
1059
                val=int(times[i:i+2],16)
1031
			for bit in range(8)
1060
                ret+=intToBinary(val)
1032
			if value & (1 << bit)]
1061
1062
	# reverse order of the bits in each byte. See above for details
1063
	newtime = ""
1064
	for i in range(0, 21):
1065
		bitlist=list(ret[(i*8):(i*8)+8])
1066
		bitlist.reverse()
1067
		newtime+="".join(bitlist)
1068
1069
	# convert bit-string to list
1070
	return filter( lambda i: newtime[ i ] == '1', range( 168 ) )
1071
1072
def intToBinary(val):
1073
        ret=""
1074
        while val>0:
1075
                ret=str(val&1)+ret
1076
                val=val>>1
1077
        # pad with leading 0s until length is n*8
1078
        if ret=="": ret="0"
1079
        while not (len(ret)%8==0):
1080
                ret="0"+ret
1081
        return ret
1082
1033
1083
def GMTOffset():
1034
def GMTOffset():
1084
	# returns the difference in hours between local time and GMT (is -1 for CET and CEST)
1035
	# returns the difference in hours between local time and GMT (is -1 for CET and CEST)

Return to bug 28496