Annotation of loncom/html/adm/helper/newslot.helper, revision 1.22
1.1 albertel 1: <helper title="Slot Creation" requiredpriv="mgq">
1.22 ! albertel 2: <state name="START" title="Specify Required Attributes"
! 3: help="Slot_RequiredAttributes">
1.13 albertel 4:
5: <nextstate>OPTIONAL</nextstate>
6:
1.5 albertel 7: <exec>
8: if (!exists($helper->{'VARS'}{'name'}) ||
9: $helper->{'VARS'}{'name'} !~ /\S/) {
10: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'});
11: if (exists($env{'form.name'}) ||
12: $env{'form.name'} =~ /\S/) {
13: $helper->{'VARS'}{'name'}=$env{'form.name'};
1.10 albertel 14: $helper->{VARS}{'origname'}=$env{'form.name'};
15: $helper->{DATA}{copy} = 1;
1.5 albertel 16: }
17: }
18: $helper->{DATA}{origslot} = sub {
19: my ($which,$default)=@_;
20: if (!exists($helper->{'VARS'}{'name'}) ||
21: $helper->{'VARS'}{'name'} !~ /\S/) {
22: return $default;
23: }
24: my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
25: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
1.10 albertel 26: my $name=$helper->{VARS}{'origname'};
1.5 albertel 27: my %slot=&Apache::lonnet::get('slots', [$name], $cdom, $cnum);
28: if (!ref($slot{$name})) { return $default; }
29: if (!exists($slot{$name}{$which})) { return $default; }
30: return $slot{$name}{$which};
31: }
32: </exec>
1.13 albertel 33: <message>
1.21 rezaferr 34: <br />Name: <br />
1.1 albertel 35: </message>
1.3 albertel 36: <string variable="name" size="30">
1.1 albertel 37: <validator>
38: if ($val=~/^\s*$/) { return 'Must specify a name'; }
1.9 albertel 39: if ($val=~/\s/) { return 'Must not contain spaces'; }
40: if ($val=~/\W/) { return 'Must contain only letters, numbers and _'; }
1.1 albertel 41: return undef;
42: </validator>
1.5 albertel 43: <defaultvalue>
44: return $helper->{'VARS'}{'name'};
45: </defaultvalue>
1.1 albertel 46: </string>
1.10 albertel 47: <condition>
48: <clause>$helper->{DATA}{copy}</clause>
1.13 albertel 49: <message>
1.10 albertel 50: <p>Changing the Name will create a new slot with the new name, and not rename the existing slot.</p>
51: </message>
52: </condition>
1.1 albertel 53: <message>
1.11 albertel 54: <br />Start time:<br />
1.1 albertel 55: </message>
1.5 albertel 56: <date variable="starttime" hoursminutes="1">
57: <defaultvalue>
58: return &{$helper->{DATA}{origslot}}('starttime');
59: </defaultvalue>
60: </date>
1.1 albertel 61: <message>
1.11 albertel 62: <br />End time:<br />
1.1 albertel 63: </message>
1.5 albertel 64: <date variable="endtime" hoursminutes="1">
65: <defaultvalue>
66: return &{$helper->{DATA}{origslot}}('endtime');
67: </defaultvalue>
1.15 albertel 68: <validator>
69: if ($val < $helper->{'VARS'}{'starttime'}) {
70: return 'End time must be later than the start time.';
71: }
72: return undef;
73: </validator>
1.5 albertel 74: </date>
1.1 albertel 75: <message>
1.11 albertel 76: <br />Type:
1.1 albertel 77: </message>
78: <choices variable="type">
79: <choice computer='preassigned'>Instructor asssignable.</choice>
1.5 albertel 80: <choice computer='schedulable_student'>Student selectable.</choice>
1.1 albertel 81: <defaultvalue>
1.5 albertel 82: return &{$helper->{DATA}{origslot}}('type','preassigned');
1.1 albertel 83: </defaultvalue>
84: </choices>
85: </state>
86:
1.13 albertel 87:
1.22 ! albertel 88: <state name="OPTIONAL" title="Specify Optional Attributes"
! 89: help="Slot_OptionalAttributes">
1.1 albertel 90: <message>
1.11 albertel 91: <p>Description:<br />
1.1 albertel 92: </message>
1.5 albertel 93: <string variable="description" size="60">
94: <defaultvalue>
95: return &{$helper->{DATA}{origslot}}('description');
96: </defaultvalue>
97: </string>
1.7 albertel 98: <condition>
99: <clause>$helper->{'VARS'}{'type'} eq 'schedulable_student'</clause>
100: <message>
1.11 albertel 101: </p><p>Time students can start reserving:<br />
1.7 albertel 102: </message>
103: <date variable="startreserve" hoursminutes="1" anytime="1">
104: <defaultvalue>
105: return &{$helper->{DATA}{origslot}}('startreserve','anytime');
106: </defaultvalue>
1.15 albertel 107: <validator>
108: if (defined($val) && $val > $helper->{'VARS'}{'starttime'}) {
109: return 'Reservation time must come before the slot has started.';
110: }
111: return undef;
112: </validator>
1.7 albertel 113: </date>
114: <message>
1.11 albertel 115: </p><p>Maxium number of students allowed in this slot:<br />
1.7 albertel 116: </message>
117: <string variable="maxspace" size="4">
118: <validator>
119: if ($val ne '' && $val=~/\D/) { return 'Must be numeric.'; }
120: return undef;
121: </validator>
122: <defaultvalue>
123: return &{$helper->{DATA}{origslot}}('maxspace');
124: </defaultvalue>
125: </string>
126: <message>
1.11 albertel 127: </p><p>Period of time in which this slot is can only be uniquely chosen:<br /> Start:
1.7 albertel 128: </message>
129: <date variable="startunique" hoursminutes="1" anytime="1">
130: <defaultvalue>
131: my $default=&{$helper->{DATA}{origslot}}('uniqueperiod','anytime');
132: if ($default eq 'anytime') { return 'anytime' };
133: if (ref($default)) { return $default->[0]; }
134: return 'anytime';
135: </defaultvalue>
136: </date>
1.11 albertel 137: <message><br /> End: </message>
1.7 albertel 138: <date variable="endunique" hoursminutes="1" anytime="1">
139: <defaultvalue>
140: my $default=&{$helper->{DATA}{origslot}}('uniqueperiod','anytime');
141: if ($default eq 'anytime') { return 'anytime' };
142: if (ref($default)) { return $default->[1]; }
143: return 'anytime';
144: </defaultvalue>
1.15 albertel 145: <validator>
146: if (defined($val) && $val < $helper->{'VARS'}{'startunique'}) {
147: return 'End time must be later than the start time.';
148: }
149: return undef;
150: </validator>
1.7 albertel 151: </date>
152: </condition>
153: <condition>
154: <clause>$helper->{'VARS'}{'type'} eq 'preassigned'</clause>
155: <exec>
156: delete($helper->{'VARS'}{'startreserve'});
157: delete($helper->{'VARS'}{'maxspace'});
158: delete($helper->{'VARS'}{'startunique'});
159: delete($helper->{'VARS'}{'endunique'});
160: </exec>
161: </condition>
1.20 albertel 162:
163: <message>
164: </p><p>Proctored access:
165: </message>
166: <choices variable="useproctor">
167: <choice computer='no'>No proctor checkin required for access.</choice>
168: <choice computer='yes'>Require proctored checkin for access.</choice>
169: <defaultvalue>
170: my $default=&{$helper->{DATA}{origslot}}('proctor');
171: if ($default) { return 'yes'; }
172: return 'no';
173: </defaultvalue>
174: </choices>
175:
1.1 albertel 176: <message>
1.11 albertel 177: </p><p>Secret word proctors use to checkin users:<br />
1.3 albertel 178: </message>
179: <string variable="secret" size="12">
180: <validator>
181: return undef;
182: </validator>
1.5 albertel 183: <defaultvalue>
184: return &{$helper->{DATA}{origslot}}('secret');
185: </defaultvalue>
1.3 albertel 186: </string>
187: <message>
1.11 albertel 188: </p><p>Slot is:
1.1 albertel 189: </message>
1.22 ! albertel 190: <helpicon file="Slot_ChoosingResources" />
1.21 rezaferr 191:
1.1 albertel 192: <choices variable="restricttosymb">
1.4 albertel 193: <choice nextstate="PROCTOR" computer='any'>usable for any resource.</choice>
1.1 albertel 194: <choice nextstate="RESOURCESELECT" computer='resource'>restricted to a specific resource.</choice>
1.5 albertel 195: <defaultvalue>
196: my $default=&{$helper->{DATA}{origslot}}('symb');
197: if ($default) { return 'resource'; }
198: return 'any';
199: </defaultvalue>
1.1 albertel 200: </choices>
1.21 rezaferr 201:
1.2 albertel 202: <message>
1.13 albertel 203: </p><p>IP restrictions:<br />
1.2 albertel 204: </message>
205: <string variable="ip" size="30">
206: <validator>
207: return undef;
208: </validator>
1.5 albertel 209: <defaultvalue>
210: return &{$helper->{DATA}{origslot}}('ip');
211: </defaultvalue>
1.2 albertel 212: </string>
1.11 albertel 213: <message> </p> </message>
1.1 albertel 214: </state>
1.13 albertel 215:
216:
1.1 albertel 217: <state name="RESOURCESELECT" title="Specify Optional Attributes">
1.13 albertel 218:
219: <nextstate>PROCTOR</nextstate>
220:
1.1 albertel 221: <resource variable="symb">
222: <filterfunc>return $res->is_problem()</filterfunc>
223: <valuefunc>return $res->symb()</valuefunc>
1.5 albertel 224: <defaultvalue>
225: return &{$helper->{DATA}{origslot}}('symb');
226: </defaultvalue>
1.1 albertel 227: </resource>
228: </state>
1.13 albertel 229:
230:
1.22 ! albertel 231: <state name="PROCTOR" title="Specify Proctors"
! 232: help="Slot_SpecifyProctors">
1.13 albertel 233:
1.20 albertel 234: <skip>
235: <clause>$helper->{'VARS'}{'useproctor'} eq 'no'</clause>
236: <nextstate>RESTRICTUSER</nextstate>
237: </skip>
1.13 albertel 238:
1.20 albertel 239: <nextstate>RESTRICTUSER</nextstate>
1.18 albertel 240:
1.4 albertel 241: <student variable="proctor" multichoice="1" coursepersonnel="1"
1.13 albertel 242: activeonly="1" emptyallowed="1">
1.5 albertel 243: <defaultvalue>
244: my @defaults;
245: my $default=&{$helper->{DATA}{origslot}}('proctor');
246: if ($default) {
247: @defaults=(split(',',$default));
248: }
249: return @defaults;
250: </defaultvalue>
1.4 albertel 251: </student>
252: </state>
1.13 albertel 253:
254:
1.22 ! albertel 255: <state name="RESTRICTUSER" title="Restrict slot availability"
! 256: help="Slot_RestrictAvailibility">
1.20 albertel 257: <skip>
258: <clause>$helper->{'VARS'}{'type'} ne 'schedulable_student'</clause>
259: <nextstate>FINISH</nextstate>
260: </skip>
261:
1.13 albertel 262: <nextstate>FINISH</nextstate>
263: <message>
264: <p>Slots are by default available to all users in a course, if you would like this slot to be restricted to a subset of users you can specify restrictions.</p>
265: </message>
266:
267: <message>
268: Select sections to limit slot availability to: <br />
269: </message>
270: <section variable="allowedsections" multichoice="1" allowempty="1">
271: <defaultvalue>
272: return join('|||',
273: split(',',&{$helper->{DATA}{origslot}}('allowedsections')));
274: </defaultvalue>
275: </section>
276: <message>
277: Select users to limit slot availability to: <br />
278: </message>
279: <student variable="allowedusers" multichoice="1" coursepersonnel="1"
280: activeonly="1" emptyallowed="1">
281: <defaultvalue>
282: return split(',',&{$helper->{DATA}{origslot}}('allowedusers'));
283: </defaultvalue>
284: </student>
285: </state>
286:
287:
1.3 albertel 288: <state name="FINISH" title="Creating/Modfying Slot">
1.11 albertel 289: <message> Created Slot </message>
1.3 albertel 290: <final>
291: <finalcode>
292: my $result;
293: if ($helper->{'STATE'} ne 'FINISH') { return; }
294: my %slot;
1.13 albertel 295:
1.3 albertel 296: foreach my $which ('type','starttime','endtime') {
297: $slot{$which} = $helper->{'VARS'}{$which};
298: }
1.13 albertel 299:
300: foreach my $which ('ip','description','maxspace','secret','symb') {
1.3 albertel 301: if ( $helper->{'VARS'}{$which} =~/\S/ ) {
302: $slot{$which} = $helper->{'VARS'}{$which};
303: }
304: }
1.13 albertel 305:
1.12 albertel 306: if ( $helper->{'VARS'}{'startreserve'} > 0) {
307: $slot{'startreserve'} = $helper->{'VARS'}{'startreserve'};
308: }
1.13 albertel 309:
1.3 albertel 310: if ( $helper->{'VARS'}{'startunique'} > 0 &&
311: $helper->{'VARS'}{'endunique'} > 0 ) {
312: $slot{'uniqueperiod'} = [$helper->{'VARS'}{'startunique'},
313: $helper->{'VARS'}{'endunique'}];
314: }
1.13 albertel 315:
1.19 albertel 316: if ( $helper->{'VARS'}{'useproctor'} eq 'yes'
317: && $helper->{'VARS'}{'proctor'} =~/\S/ ) {
1.4 albertel 318: my @names;
1.16 albertel 319: # just need the username/domain throw away the other data
320: # that <student> returns
1.4 albertel 321: foreach my $user (split(/\|\|\|/, $helper->{'VARS'}{'proctor'})) {
322: my ($uname,$udomain)=split(/:/,$user);
1.16 albertel 323: push(@names,"$uname:$udomain");
1.4 albertel 324: }
1.16 albertel 325: # make sure the usernmaes are unique
1.8 albertel 326: my %proctors = map { ($_,1) } @names;
327: $slot{'proctor'}=join(',',sort(keys(%proctors)));
1.4 albertel 328: }
1.13 albertel 329:
1.14 albertel 330: if ( $helper->{'VARS'}{'allowedsections'} =~/\S/ ) {
331: $slot{'allowedsections'}=
332: join(',',sort(split(/\|\|\|/,
333: $helper->{'VARS'}{'allowedsections'})));
1.13 albertel 334: }
335:
1.14 albertel 336: if ( $helper->{'VARS'}{'allowedusers'} =~/\S/ ) {
1.13 albertel 337: my @names;
1.16 albertel 338: # just need the username/domain throw away the other data
339: # that <student> returns
1.14 albertel 340: foreach my $item (split(/\|\|\|/,
341: $helper->{'VARS'}{'allowedusers'})) {
1.13 albertel 342: my ($uname,$udomain)=split(/:/,$item);
343: push(@names,"$uname:$udomain");
344: }
345:
346: # make sure the choices are unique
1.14 albertel 347: my %users = map { ($_,1) } @names;
348: $slot{'allowedusers'}=join(',',sort(keys(%users)));
1.13 albertel 349: }
350:
1.3 albertel 351: my $cname = $env{'course.'.$env{'request.course.id'}.'.num'};
352: my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
353:
354: my $ret = &Apache::lonnet::cput('slots',
355: {$helper->{'VARS'}{'name'} => \%slot},
356: $cdom,$cname);
1.5 albertel 357: $result.="\n ".'Name: '.&HTML::Entities::encode($helper->{'VARS'}{'name'}).'</li>'.
1.4 albertel 358: "\n".'<li> Starts: '.&Apache::lonlocal::locallocaltime($slot{'starttime'}).'</li>'.
359: "\n".'<li> Ends: '.&Apache::lonlocal::locallocaltime($slot{'endtime'}).'</li>'.
1.3 albertel 360: "\n".'<li> Type: '.$slot{'type'}.'</li>';
361: my %labels =
362: map {($_->[0],$_->[1])} &Apache::slotrequest::csvupload_fields();
1.13 albertel 363: foreach my $which ('ip','description','maxspace','secret','symb',
364: 'allowedsections','allowedusers') {
1.3 albertel 365: if (exists($slot{$which})) {
366: $result.="\n".'<li> '.$labels{$which}.': '.
367: &HTML::Entities::encode($slot{$which}).'</li>';
368: }
369: }
1.12 albertel 370: if (exists($slot{'startreserve'})) {
371: $result.="\n".'<li> '.$labels{'startreserve'}.': '.
372: &Apache::lonlocal::locallocaltime($slot{'startreserve'}).'</li>';
373: }
1.6 albertel 374: if (exists($slot{'proctor'})) {
375: my $proctors = $slot{'proctor'};
376: $proctors =~ s/,/, /g;
377: $result.="\n".'<li> '.$labels{'proctor'}.': '.
378: &HTML::Entities::encode($proctors).'</li>';
379: }
1.3 albertel 380: if (exists($slot{'uniqueperiod'})) {
381: $result.=
382: "\n".'<li> '.$labels{'uniqueperiod'}.': '.
383: &Apache::lonlocal::locallocaltime($slot{'uniqueperiod'}[0]).
384: ', '.
385: &Apache::lonlocal::locallocaltime($slot{'uniqueperiod'}[1]).
386: '</li>';
387: }
388: return $result;
389: </finalcode>
1.4 albertel 390: <exitpage>/adm/slotrequest?command=showslots</exitpage>
1.3 albertel 391: </final>
1.1 albertel 392: </state>
393: </helper>
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>