Rev 13211 | Blame | Compare with Previous | Last modification | View Log | RSS feed
# mkuserlist
# Constructs .userlist file in specified class (wims_class by default)
# constructs .usernextlist and .userprevlist
# also constructs .userlist_external if needed
uclass=$wims_read_parm
!default uclass=$wims_class
# What's the point of $wims_prefix ?
!if user notwordof $wims_prefix
wims_prefix=$wims_prefix user
!endif
:mkstart
supclass=!defof class_superclass in wimshome/log/classes/$uclass/.def
reset class_lvl
!if $supclass!=$empty and $supclass!=$uclass
supertype=!defof class_type in wimshome/log/classes/$supclass/.def
typename=!defof class_typename in wimshome/log/classes/$uclass/.def
!!case of program can occur in case of intercourse
!if $typename iswordof level
!exit
!endif
!if $typename issametext course
class_parent=!defof class_parent in wimshome/log/classes/$uclass/.def
!if $class_parent!=$empty
i=!defof class_ocourses in wimshome/log/classes/$class_parent/.def
i=!makelist $wims_superclass/x for x in $i
!if $uclass isitemof $i
uclass=$class_parent
!goto mkstart
!endif
tn=!defof class_typename in wimshome/log/classes/$class_parent/.def
!!!if $tn=program
!! clist=$class_parent
!!!endif
!endif
clist=!listuniq $uclass
!else
!if / isin $uclass
class_lvl=!translate internal / to , in $uclass
class_lvl=$(class_lvl[1])/$(class_lvl[2])
!if $class_lvl=$uclass
class_lvl=
clist=$supclass,$uclass
!else
clist=$supclass,$class_lvl,$uclass
!endif
!else
clist=!listuniq $supclass,$uclass
!endif
!endif
!else
typename=class
clist=$uclass
supclass=$uclass
!endif
mul_userdir=wimshome/log/classes/$supclass/.users
mul_userdir2=$wims_home/log/classes/$supclass/.users
pack_size = 500
## On range la liste des utilisateurs par paquets de $pack_size (userlist_0, userlist_1, etc...)
start=0
userlist_$start=!sh cd $mul_userdir2; ls 2>/dev/null | head -$pack_size
userlist_$start=!words2items $(userlist_$start)
userlist_lastcnt=!itemcnt $(userlist_$start)
!while $userlist_lastcnt>$[$pack_size-1]
!advance start
userlist_$start=!sh cd $mul_userdir2; ls 2>/dev/null | tail -n +$[$start*$pack_size+1] | head -$pack_size
userlist_$start=!words2items $(userlist_$start)
userlist_lastcnt=!itemcnt $(userlist_$start)
!endwhile
## On supprime une eventuelle liste temporaire "userlist*.raw" dans chaque classe
## just junk
!for c in $clist
!sh rm -f $wims_home/log/classes/$c/.userlist.raw 2>/dev/null\
rm -f $wims_home/log/classes/$c/.userlist_external.raw 2>/dev/null
!next
## On parcourt nos paquets de $pack_size users
!for N=0 to $start
!for u in $(userlist_$N)
!reset user_firstname, user_lastname, user_supervisable,\
user_class, user_participate, user_exists, user_external_auth
!readdef $mul_userdir/$u
!!TODO better to make a special list for user_supervisable who participates
!!(suppress to add supervisor who are registered as participant to appear in userlist)
!if $user_exists=yes and $user_supervisable!=yes
userline=:$user_lastname,$user_firstname,$u
!reset userline_external
!if $user_external_auth!=$empty
userline_external=$user_external_auth:$u
!endif
!if $typename=course
!readdef wimshome/log/classes/$uclass/.users/$u
!if $user_class=$empty
obl=!defof class_ocourses in wimshome/log/classes/$class_parent/.def
obl=!makelist $wims_superclass/x for x in $obl
!if $uclass isitemof $user_participate and $uclass notitemof $obl
user_class=!replace internal $supclass/ by in $class_parent
!setdef !set user_class=$user_class in wimshome/log/classes/$uclass/.users/$u
!endif
!endif
!if $user_class!=$empty
!appendfile wimshome/log/classes/$uclass/.userlist.raw $userline,$user_class
!if $userline_external!=$empty
!appendfile wimshome/log/classes/$uclass/.userlist_external.raw $userline_external
!endif
!endif
!else
!if $supclass=$uclass or $uclass isitemof $user_participate
!appendfile wimshome/log/classes/$uclass/.userlist.raw $userline
!if $userline_external!=$empty
!appendfile wimshome/log/classes/$uclass/.userlist_external.raw $userline_external
!endif
!endif
### do it for the $supclass ? could be done many times if not in a group ?
!if $supclass!=$uclass
!appendfile wimshome/log/classes/$supclass/.userlist.raw $userline
!if $userline_external!=$empty
!appendfile wimshome/log/classes/$supclass/.userlist_external.raw $userline_external
!endif
!if $class_lvl!=$empty and $class_lvl/ isin $user_participate
## do it for the intermediaire class ? could be done many times
!appendfile wimshome/log/classes/$class_lvl/.userlist.raw $userline
!if $userline_external!=$empty
!appendfile wimshome/log/classes/$class_lvl/.userlist_external.raw $userline_external
!endif
!endif
!endif
!endif
!endif
!next u
!next N
basedir=$wims_home/log/classes
basedir2=wimshome/log/classes
!for c in $clist
!sh sort -f $basedir/$c/.userlist.raw >$basedir/$c/.userlist 2>/dev/null\
rm -f $basedir/$c/.userlist.raw 2>/dev/null\
sort -f $basedir/$c/.userlist_external.raw > $basedir/$c/.userlist_external 2>/dev/null\
rm -f $basedir/$c/.userlist_external.raw 2>/dev/null
!next
## Now the files .userlist and .userlist_external are created in the classes of $clist,
## so in the sup classes of $uclass. Do we need to do that (it is done many times for
## the portal ...
## do now the .usernextlist and .userprevlist only in the class $uclass
## in fact, there is only one class in $uclass. Leave the loop for the moment
!for c in $uclass
!sh rm -f $basedir/$c/.usernextlist.raw 2>/dev/null\
rm -f $basedir/$c/.userprevlist.raw 2>/dev/null
!set nbuser_=!recordcnt $basedir2/$c/.userlist
!if $nbuser_=0
!break
!endif
record_start = 1
remaining = $nbuser_ - 1
## On parcourt nos users par paquets de $pack_size
!while $remaining > 0
nb_processing = $[min($remaining, $pack_size)]
record_end = $[$record_start+$nb_processing]
list_n=!record $record_start to $record_end of $basedir2/$c/.userlist
list_n=!column 3 of $list_n
nextuser=!makelist $$(list_n[x]), $$(list_n[x+1]); for x=1 to $nb_processing
nextuser=!nospace $nextuser
nextuser=!replace internal ;, by ; in $nextuser
prevuser=!nospace $(nextuser[;2,1])
prevuser=!rows2lines $prevuser
prevuser=!replace internal , by : in $prevuser
nextuser=!rows2lines $nextuser
nextuser=!replace internal , by : in $nextuser
!appendfile $basedir2/$c/.usernextlist.raw $nextuser
!appendfile $basedir2/$c/.userprevlist.raw $prevuser
record_start = $record_start + $nb_processing
remaining = $remaining - $nb_processing
!endwhile
first_user = !record 1 of $basedir2/$c/.userlist
first_user = !item 3 of $first_user
last_user = !record -1 of $basedir2/$c/.userlist
last_user = !item 3 of $last_user
!appendfile $basedir2/$c/.usernextlist.raw $last_user:$first_user
!appendfile $basedir2/$c/.userprevlist.raw $first_user:$last_user
!sh mv $basedir/$c/.usernextlist.raw $basedir/$c/.usernextlist\
mv $basedir/$c/.userprevlist.raw $basedir/$c/.userprevlist
!next c