X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2Fstemmaweb%2FController%2FRoot.pm;h=51d7dff1255922c62704d22d70381120124a2bba;hb=4770d07784e75a7f842b061a359f7e4d5644fe51;hp=5ab5e922edda1fead54800a5b80eb3e2a4838a3d;hpb=f761f9a7802815a5e3aa1068cd7aa17dd83ff8e5;p=scpubgit%2Fstemmaweb.git diff --git a/lib/stemmaweb/Controller/Root.pm b/lib/stemmaweb/Controller/Root.pm index 5ab5e92..51d7dff 100644 --- a/lib/stemmaweb/Controller/Root.pm +++ b/lib/stemmaweb/Controller/Root.pm @@ -40,6 +40,28 @@ sub index :Path :Args(0) { $c->stash->{template} = 'index.tt'; } +=head2 about + +A general overview/documentation page for the site. + +=cut + +sub about :Local :Args(0) { + my( $self, $c ) = @_; + $c->stash->{template} = 'about.tt'; +} + +=head2 help/* + +A dispatcher for documentation of various aspects of the application. + +=cut + +sub help :Local :Args(1) { + my( $self, $c, $topic ) = @_; + $c->stash->{template} = "$topic.tt"; +} + =head1 Elements of index page =head2 directory @@ -119,7 +141,10 @@ sub newtradition :Local :Args(0) { } catch { $errmsg = "Unexpected parsing error"; } - last if $tradition; + if( $tradition ) { + $errmsg = undef; + last; + } } } elsif( $ext =~ /^(txt|csv|xls(x)?)$/ ) { # If it's Excel we need to pass excel => $ext; @@ -176,6 +201,9 @@ Returns information about a particular text. sub textinfo :Local :Args(1) { my( $self, $c, $textid ) = @_; my $tradition = $c->model('Directory')->tradition( $textid ); + ## Have to keep users in the same scope as tradition + my $newuser; + my $olduser; unless( $tradition ) { return _json_error( $c, 404, "No tradition with ID $textid" ); } @@ -203,7 +231,8 @@ sub textinfo :Local :Args(1) { } # Handle language param, making Default => null my $langval = delete $params->{language} || 'Default'; - unless( $tradition->language eq $langval ) { + + unless( $tradition->language eq $langval || !$tradition->can('language') ) { try { $tradition->language( $langval ); $changed = 1; @@ -223,20 +252,23 @@ sub textinfo :Local :Args(1) { } # Handle ownership change - my $newuser; if( exists $params->{'owner'} ) { # Only admins can update user / owner my $newownerid = delete $params->{'owner'}; unless( !$newownerid || - ( $tradition->has_user && $tradition->user->id eq $newownerid ) ) { + ( $tradition->has_user && $tradition->user->email eq $newownerid ) ) { unless( $c->user->get_object->is_admin ) { return _json_error( $c, 403, "Only admin users can change tradition ownership" ); } - $newuser = $m->find_user({ username => $newownerid }); + $newuser = $m->find_user({ email => $newownerid }); unless( $newuser ) { return _json_error( $c, 500, "No such user " . $newownerid ); } + if( $tradition->has_user ) { + $olduser = $tradition->user; + $olduser->remove_tradition( $tradition ); + } $newuser->add_tradition( $tradition ); $changed = 1; } @@ -255,12 +287,15 @@ sub textinfo :Local :Args(1) { my $textinfo = { textid => $textid, name => $tradition->name, - language => $tradition->language, - public => $tradition->public, - owner => $tradition->user ? $tradition->user->id : undef, + #language => $tradition->language, + public => $tradition->public || 0, + owner => $tradition->user ? $tradition->user->email : undef, witnesses => [ map { $_->sigil } $tradition->witnesses ], }; - my @stemmasvg = map { $_->as_svg({ size => [ 500, 375 ] }) } $tradition->stemmata; + if( $tradition->can('language') ) { + $textinfo->{'language'} = $tradition->language; + } + my @stemmasvg = map { $_->as_svg() } $tradition->stemmata; map { $_ =~ s/\n/ /mg } @stemmasvg; $textinfo->{stemmata} = \@stemmasvg; $c->stash->{'result'} = $textinfo; @@ -316,6 +351,11 @@ sub stemma :Local :Args(2) { if( $c->req->method eq 'POST' ) { if( $ok eq 'full' ) { my $dot = $c->request->body_params->{'dot'}; + # Graph::Reader::Dot does not handle bare unicode. We get around this + # by wrapping all words in double quotes, as long as they aren't already + # wrapped, and as long as they aren't the initial 'digraph stemma'. + # Horrible HACK. + $dot =~ s/(?stemma_count > $stemmaid ) { $stemma = $tradition->stemma( $stemmaid ); } - my $stemma_xml = $stemma ? $stemma->as_svg( { size => [ 500, 375 ] } ) : ''; + my $stemma_xml = $stemma ? $stemma->as_svg() : ''; # What was requested, XML or JSON? my $return_view = 'SVG'; if( my $accept_header = $c->req->header('Accept') ) { @@ -398,6 +438,30 @@ sub stemmadot :Local :Args(2) { $c->forward('View::JSON'); } +=head2 download + + GET /download/$textid + +Returns the full XML definition of the tradition and its stemmata, if any. + +=cut + +sub download :Local :Args(1) { + my( $self, $c, $textid ) = @_; + my $tradition = $c->model('Directory')->tradition( $textid ); + unless( $tradition ) { + return _json_error( $c, 404, "No tradition with ID $textid" ); + } + my $ok = _check_permission( $c, $tradition ); + return unless $ok; + try { + $c->stash->{'result'} = $tradition->collation->as_graphml(); + } catch( Text::Tradition::Error $e ) { + return _json_error( $c, 500, $e->message ); + } + $c->forward('View::GraphML'); +} + #################### ### Helper functions ####################