Annotation of loncom/interface/londependencies.pm, revision 1.1
1.1 ! raeburn 1: # The LearningOnline Network with CAPA
! 2: # Handler to manage dependencies for HTML files uploaded directly
! 3: # to a course.
! 4: #
! 5: # $Id: londependencies.pm,v 1.1 2012/04/11 21:36:30 raeburn Exp $
! 6: #
! 7: # Copyright Michigan State University Board of Trustees
! 8: #
! 9: # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
! 10: #
! 11: # LON-CAPA is free software; you can redistribute it and/or modify
! 12: # it under the terms of the GNU General Public License as published by
! 13: # the Free Software Foundation; either version 2 of the License, or
! 14: # (at your option) any later version.
! 15: #
! 16: # LON-CAPA is distributed in the hope that it will be useful,
! 17: # but WITHOUT ANY WARRANTY; without even the implied warranty of
! 18: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 19: # GNU General Public License for more details.
! 20: #
! 21: # You should have received a copy of the GNU General Public License
! 22: # along with LON-CAPA; if not, write to the Free Software
! 23: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA#
! 24: # /home/httpd/html/adm/gpl.txt
! 25: #
! 26: # http://www.lon-capa.org/
! 27: #
! 28: #
! 29: ###############################################################
! 30: ##############################################################
! 31:
! 32: =pod
! 33:
! 34: =head1 NAME
! 35:
! 36: londependencies- Handler to manage dependencies for HTML files
! 37: uploaded directly to a course.
! 38:
! 39: =head1 SYNOPSIS
! 40:
! 41: londependencies provides an interface for uploading, replacing
! 42: and deleting files which are dependencies for an HTML page
! 43: uploaded directly to a course.
! 44:
! 45: =head1 DESCRIPTION
! 46:
! 47: This module is used when editing a web page uploaded to a course,
! 48: in course context.
! 49:
! 50: =head1 INTERNAL SUBROUTINES
! 51:
! 52: =over
! 53:
! 54: =item process_changes()
! 55:
! 56: =item display_dependencies()
! 57:
! 58: =back
! 59:
! 60: =cut
! 61:
! 62: package Apache::londependencies;
! 63:
! 64: use strict;
! 65: use Apache::Constants qw(:common :http);
! 66: use Apache::lonnet;
! 67: use Apache::loncommon();
! 68: use Apache::lonhtmlcommon();
! 69: use Apache::lonlocal;
! 70: use LONCAPA qw(:DEFAULT :match);
! 71: use File::MMagic;
! 72:
! 73: sub handler {
! 74: my $r=shift;
! 75: if ($r->header_only) {
! 76: &Apache::loncommon::content_type($r,'text/html');
! 77: $r->send_http_header;
! 78: return OK;
! 79: }
! 80: my ($allowed,$cnum,$cdom,$chome);
! 81: if ($env{'request.course.id'}) {
! 82: $allowed = &Apache::lonnet::allowed('mdc',$env{'request.course.id'});
! 83: }
! 84: if (!$env{'request.course.fn'} || !$allowed) {
! 85: # Not in a course, or no mdc priv in course
! 86: $env{'user.error.msg'}="/adm/dependencies:mdc:0:0:Cannot display dependencies for page uploaded to course";
! 87: return HTTP_NOT_ACCEPTABLE;
! 88: } else {
! 89: $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
! 90: $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
! 91: $chome = $env{'course.'.$env{'request.course.id'}.'.home'};
! 92: }
! 93: &Apache::loncommon::content_type($r,'text/html');
! 94: $r->send_http_header;
! 95:
! 96: &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
! 97: ['action','symb','title']);
! 98: my $action = $env{'form.action'};
! 99: my $symb = $env{'form.symb'};
! 100: my $docs_title = $env{'form.title'};
! 101: my ($mimetype,$numpathchgs,$numrefchanges,%allfiles,%codebase);
! 102: my ($map,$id,$url) = &Apache::lonnet::decode_symb($symb);
! 103: my $title = &mt('Manage Dependencies');
! 104: my $state = '<input type="hidden" name="symb" value="'.$symb.'" />'."\n".
! 105: '<input type="hidden" name="title" value="'.$docs_title.'" />'."\n";
! 106: my $dir_root = '/userfiles';
! 107: my ($destination) =
! 108: ($url =~ m{^\Quploaded/$cdom/$cnum/\E((?:docs|supplemental)/(?:default|\d+)/\d+)/});
! 109: my $js = &Apache::loncommon::ask_embedded_js();
! 110: my $output = &Apache::loncommon::start_page($title,$js,
! 111: {'only_body' => 1});
! 112: if ($action eq 'modifyhrefs') {
! 113: my ($result,$count,$codebasecount) =
! 114: &Apache::loncommon::modify_html_refs('manage_dependencies',$destination,
! 115: $cnum,$cdom,$dir_root);
! 116: $output .= $result;
! 117: $numrefchanges = $count + $codebasecount;
! 118: } elsif ($action eq 'process_changes') {
! 119: (my $result,$numpathchgs) =
! 120: &process_changes($cdom,$cnum,$chome,$url,$destination,$dir_root,$state);
! 121: $output .= $result;
! 122: }
! 123: unless ((($action eq 'process_changes') && ($numpathchgs > 0)) ||
! 124: (($action eq 'modifyhrefs') && ($numrefchanges > 0))) {
! 125: if ($url =~ m{^\Quploaded/$cdom/$cnum/\E}) {
! 126: $output .= &display_dependencies($url,$state,$docs_title);
! 127: } else {
! 128: $output .= &mt('Cannot display dependency information - invalid file: [_1].',$url);
! 129: }
! 130: $output .= '<p><a href="javascript:window.close()">'.&mt('Close window').'</a>';
! 131: }
! 132: if (($action eq 'modifyhrefs') && ($numrefchanges > 0)) {
! 133: $output .= '<p><a href="javascript:window.opener.location.reload(true);javascript:window.close();">'.
! 134: &mt('Close pop-up window and reload page').'</a>';
! 135: }
! 136: $output .= &Apache::loncommon::end_page();
! 137: $r->print($output);
! 138: return OK;
! 139: }
! 140:
! 141: sub process_changes {
! 142: my ($cdom,$cnum,$chome,$url,$destination,$dir_root,$state) = @_;
! 143: my ($output,$numpathchgs);
! 144: my ($numnew,$numtodelete,$numtomod) = (0,0,0);
! 145: my $url_root = "/uploaded/$cdom/$cnum";
! 146: if ($destination ne '') {
! 147: my $actionurl = '/adm/dependencies';
! 148: my @deletions = &Apache::loncommon::get_env_multiple('form.del_upload_dep');
! 149: my @modifications = &Apache::loncommon::get_env_multiple('form.mod_upload_dep');
! 150: $numtodelete = scalar(@deletions);
! 151: $numtomod = scalar(@modifications);
! 152: $numnew = $env{'form.number_newemb_items'};
! 153: if ($numtodelete > 0) {
! 154: my ($outcome,$error);
! 155: my @ids=&Apache::lonnet::current_machine_ids();
! 156: my $dir;
! 157: if (grep(/^\Q$chome\E$/,@ids)) {
! 158: $dir = &LONCAPA::propath($cdom,$cnum)."$dir_root/$destination";
! 159: }
! 160: foreach my $todelete (@deletions) {
! 161: my $item = &unescape($env{'form.embedded_orig_'.$todelete});
! 162: if ($dir eq '') {
! 163: my $result =
! 164: &Apache::lonnet::removeuploadedurl("$url_root/$destination/$item");
! 165: if ($result eq 'ok') {
! 166: $outcome .= '<li><span class="LC_filename">'.$item.'</li>';
! 167: } else {
! 168: $error .= &mt('Error: [_1] occurred when removing [_2]',$result,$item).'<br />';
! 169: }
! 170: } else {
! 171: if (-e "$dir/$item") {
! 172: if (unlink("$dir/$item")) {
! 173: $outcome .= '<li><span class="LC_filename">'.$item.'</li>';
! 174: } else {
! 175: $error .= &mt('Removal failed for [_1].',$item).'<br />';
! 176: }
! 177: } else {
! 178: $error .= &mt('File: [_1] not found when attempting removal.',$item).'<br />';
! 179: }
! 180: }
! 181: }
! 182: if ($outcome ne '') {
! 183: $output .= '<h4>'.&mt('Deleted unused files').'</h4>'.
! 184: '<ul>'.$outcome.'</ul>';
! 185: }
! 186: if ($error ne '') {
! 187: $output .= '<h4>'.&mt('Error(s) deleting unused files').'</h4>'.
! 188: '<p class="LC_warning">'.$error.'</p>';
! 189: }
! 190: }
! 191: if ((@modifications > 0) || ($numnew > 0)) {
! 192: (my $result,my $flag,$numpathchgs) =
! 193: &Apache::loncommon::upload_embedded('coursedoc',$destination,$cnum,$cdom,
! 194: $dir_root,$url_root,undef,undef,undef,
! 195: $state,'/adm/dependencies');
! 196: $output .= '<h4>'.&mt('Uploaded files').'</h4>'.
! 197: $result;
! 198: }
! 199: } else {
! 200: $output .= '<span class="LC_warning">'.
! 201: &mt('Unable to process any requested dependency changes - invalid file: [_1].',$url).
! 202: '</span>';
! 203: }
! 204: if (!$numtodelete && !$numtomod && !$numnew) {
! 205: $output .= '<h4>'.&mt('No changes made.').'</h4>';
! 206: }
! 207: unless ($numpathchgs) {
! 208: $output .= '<hr />';
! 209: }
! 210: return ($output,$numpathchgs);
! 211: }
! 212:
! 213: sub display_dependencies {
! 214: my ($url,$state,$docs_title) = @_;
! 215: my ($mimetype,%allfiles,%codebase);
! 216: my $output;
! 217: if (&Apache::lonnet::repcopy_userfile("/$url") eq 'ok') {
! 218: my $file=&Apache::lonnet::filelocation("","/$url");
! 219: my $mm = new File::MMagic;
! 220: $mimetype = $mm->checktype_filename($file);
! 221: if ($mimetype eq 'text/html') {
! 222: my $parse_result = &Apache::lonnet::extract_embedded_items($file,\%allfiles,\%codebase);
! 223: if ($parse_result eq 'ok') {
! 224: my ($embedded,$num,$delnum) =
! 225: &Apache::loncommon::ask_for_embedded_content(
! 226: '/adm/dependencies',$state,\%allfiles,\%codebase,
! 227: {'error_on_invalid_names' => 1,
! 228: 'ignore_remote_references' => 1,
! 229: 'docs_url' => $url,
! 230: 'docs_title' => $docs_title});
! 231: if ($embedded) {
! 232: $output .= $embedded;
! 233: } else {
! 234: $output .= &mt('This file has no dependencies.').'<br />';
! 235: }
! 236: } else {
! 237: $output .= '<span class="LC_warning">'.
! 238: &mt('Could not parse HTML file: [_1] to identify existing dependencies.',"/$url").
! 239: '</span>';
! 240: }
! 241: } else {
! 242: $output .= '<span class="LC_warning">'.
! 243: &mt('File: [_1] does not appear to be an HTML file.',"/$url").
! 244: '</span>';
! 245: }
! 246: } else {
! 247: $output .= '<span class="LC_warning">'.
! 248: &mt('Failed to access HTML file: [_1] to identify existing dependencies.',
! 249: "/$url");
! 250: }
! 251: return $output;
! 252: }
! 253:
! 254: 1;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>