Skip to content

Commit

Permalink
MDL-62491 core_privacy: Add html files to the user data export.
Browse files Browse the repository at this point in the history
This adds html to the data export that allows for easier navigation
and reading of data.
  • Loading branch information
abgreeve committed Oct 9, 2018
1 parent 7daf207 commit 1db088f
Show file tree
Hide file tree
Showing 12 changed files with 1,315 additions and 11 deletions.
6 changes: 6 additions & 0 deletions lang/en/privacy.php
Expand Up @@ -22,6 +22,10 @@
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/

$string['broughtbymoodle'] = 'This data export provided by Moodle';
$string['exportfrom'] = 'Exported from {$a}';
$string['exporttime'] = 'Exported on {$a}';
$string['exportuser'] = 'Data for {$a}';
$string['privacy:metadata'] = 'The privacy subsystem does not store any data of its own and is designed to act as a channel between components and the interface used to describe, export, and remove their data.';
$string['trace:done'] = 'Complete';
$string['trace:exportcomplete'] = 'Export complete';
Expand All @@ -32,4 +36,6 @@
$string['trace:fetchcomponents'] = 'Fetching {$a->total} components ({$a->datetime})';
$string['trace:deletingapproved'] = 'Performing removal of approved {$a->total} contexts ({$a->datetime})';
$string['trace:deletingcontext'] = 'Performing removal of context from {$a->total} components ({$a->datetime})';
$string['navigation'] = 'Navigation';
$string['privacy:subsystem:empty'] = 'This subsystem does not store any data.';
$string['viewdata'] = 'Click on a link in the navigation to view data.';
2 changes: 2 additions & 0 deletions lib/jquery/readme_moodle.txt
Expand Up @@ -13,4 +13,6 @@ Description of import of various jQuery libraries into Moodle:

5/ open http://127.0.0.1/lib/tests/other/jquerypage.php

6/ Update the version of jquery in core_privacy\local\request\moodle_content_writer::write_html_data()

Petr Skoda
1 change: 1 addition & 0 deletions lib/requirejs/readme_moodle.txt
Expand Up @@ -2,3 +2,4 @@ Description of import into Moodle:
// Download from https://requirejs.org/docs/download.html
// Put the require.js and require.min.js and LICENSE file in this folder.
// Check if MDL-60458 workaround can be removed.
// Check that core_privacy\local\request\moodle_content_writer::write_html_data() does not need to be updated.
378 changes: 375 additions & 3 deletions privacy/classes/local/request/moodle_content_writer.php

Large diffs are not rendered by default.

87 changes: 87 additions & 0 deletions privacy/classes/output/exported_html_page.php
@@ -0,0 +1,87 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

/**
* Contains the navigation renderable for user data exports.
*
* @package core_privacy
* @copyright 2018 Adrian Greeve
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core_privacy\output;
defined('MOODLE_INTERNAL') || die();

use renderable;
use renderer_base;
use templatable;

/**
* Class containing the navigation renderable
*
* @copyright 2018 Adrian Greeve
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class exported_html_page implements renderable, templatable {

/** @var string $navigationdata navigation html to be displayed about the system. */
protected $navigationdata;

/** @var string $systemname systemname for the page. */
protected $systemname;

/** @var string $username The full name of the user. */
protected $username;

/** @var bool $rtl The direction to show the page (right to left) */
protected $rtl;

/** @var string $siteurl The url back to the site that created this export. */
protected $siteurl;

/**
* Constructor.
*
* @param string $navigationdata Navigation html to be displayed about the system.
* @param string $systemname systemname for the page.
* @param string $username The full name of the user.
* @param bool $righttoleft Is the language used right to left?
* @param string $siteurl The url to the site that created this export.
*/
public function __construct(string $navigationdata, string $systemname, string $username, bool $righttoleft, string $siteurl) {
$this->navigationdata = $navigationdata;
$this->systemname = $systemname;
$this->username = $username;
$this->rtl = $righttoleft;
$this->siteurl = $siteurl;
}

/**
* Export this data so it can be used as the context for a mustache template.
*
* @param renderer_base $output
* @return array
*/
public function export_for_template(renderer_base $output) : Array {
return [
'navigation' => $this->navigationdata,
'systemname' => $this->systemname,
'timegenerated' => time(),
'username' => $this->username,
'righttoleft' => $this->rtl,
'siteurl' => $this->siteurl
];
}
}
98 changes: 98 additions & 0 deletions privacy/classes/output/exported_navigation_page.php
@@ -0,0 +1,98 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

/**
* Contains the navigation renderable for user data exports.
*
* @package core_privacy
* @copyright 2018 Adrian Greeve
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace core_privacy\output;
defined('MOODLE_INTERNAL') || die();

use renderable;
use renderer_base;
use templatable;

/**
* Class containing the navigation renderable
*
* @copyright 2018 Adrian Greeve
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class exported_navigation_page implements renderable, templatable {

/** @var array $tree Full tree in multidimensional form. */
protected $tree;

/** @var boolean $firstelement This is used to create unique classes for the first elements in the navigation tree. */
protected $firstelement = true;

/**
* Constructor
*
* @param \stdClass $tree Full tree to create navigation out of.
*/
public function __construct(\stdClass $tree) {
$this->tree = $tree;
}

/**
* Creates the navigation list html. Why this and not a template? My attempts at trying to get a recursive template
* working failed.
*
* @param \stdClass $tree Full tree to create navigation out of.
* @return string navigation html.
*/
protected function create_navigation(\stdClass $tree) {
if ($this->firstelement) {
$html = \html_writer::start_tag('ul', ['class' => 'treeview parent block_tree list', 'id' => 'my-tree']);
$this->firstelement = false;
} else {
$html = \html_writer::start_tag('ul', ['class' => 'parent', 'role' => 'group']);
}
foreach ($tree->children as $child) {
if (isset($child->children)) {
$html .= \html_writer::start_tag('li', ['class' => 'menu-item', 'role' => 'treeitem', 'aria-expanded' => 'false']);
$html .= $child->name;
$html .= $this->create_navigation($child);
} else {
$html .= \html_writer::start_tag('li', ['class' => 'item', 'role' => 'treeitem', 'aria-expanded' => 'false']);
// Normal display.
if (isset($child->datavar)) {
$html .= \html_writer::link('#', $child->name, ['data-var' => $child->datavar]);
} else {
$html .= \html_writer::link($child->url, $child->name, ['target' => '_blank']);
}
}
$html .= \html_writer::end_tag('li');
}
$html .= \html_writer::end_tag('ul');
return $html;
}

/**
* Export this data so it can be used as the context for a mustache template.
*
* @param renderer_base $output
* @return array navigation data for the template.
*/
public function export_for_template(renderer_base $output) : Array {
$data = $this->create_navigation($this->tree);
return ['navigation' => $data];
}
}
58 changes: 58 additions & 0 deletions privacy/classes/output/renderer.php
@@ -0,0 +1,58 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.

/**
* Privacy renderer.
*
* @package core_privacy
* @copyright 2018 Adrian Greeve <adrian@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/

namespace core_privacy\output;
defined('MOODLE_INTERNAL') || die;
/**
* Privacy renderer's for privacy stuff.
*
* @since Moodle 3.6
* @package core_privacy
* @copyright 2018 Adrian Greeve <adrian@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class renderer extends \plugin_renderer_base {

/**
* Render the whole tree.
*
* @param navigation_page $page
* @return string
*/
public function render_navigation(exported_navigation_page $page) {
$data = $page->export_for_template($this);
return parent::render_from_template('core_privacy/navigation', $data);
}

/**
* Render the html page.
*
* @param html_page $page
* @return string
*/
public function render_html_page(exported_html_page $page) {
$data = $page->export_for_template($this);
return parent::render_from_template('core_privacy/htmlpage', $data);
}
}
50 changes: 50 additions & 0 deletions privacy/export_files/general.css
@@ -0,0 +1,50 @@
.hide {
display: none;
}

li.menu-item {
cursor: pointer;
}

li[aria-expanded=false]:not(.item) {
list-style-image: url('pix/collapsed.svg');
}

li[aria-expanded=true]:not(.item) {
list-style-image: url('pix/expanded.svg');
}

[aria-expanded="false"] > [role="group"] {
display: none;
}

#navigation {
display: inline-block;
width: 20%;
vertical-align: top;
overflow: scroll;
border-radius: 0.3rem;
}

[data-main-content] {
display: inline-block;
width: 69%;
vertical-align: top;
}

.title {
font-size: large;
font-weight: bold;
}

.block {
padding: 19px;
}

.item {
list-style-image: url('pix/navigationitem.svg');
}

.moodle-logo {
width: 110px;
}

0 comments on commit 1db088f

Please sign in to comment.