342 lines
18 KiB
Twig
342 lines
18 KiB
Twig
{% extends 'admin.twig' %}
|
|
|
|
{% set title %}{{ 'PrivacyManager_AnonymizeData'|translate }}{% endset %}
|
|
|
|
{% block content %}
|
|
{% import 'macros.twig' as piwik %}
|
|
|
|
<div piwik-content-intro>
|
|
<h2 piwik-enriched-headline help-url="https://matomo.org/docs/privacy/">{{ title }}</h2>
|
|
|
|
<p>{{ 'PrivacyManager_TeaserHeader'|translate('<a href="#anonymizeIPAnchor">',"</a>",'<a href="#deleteLogsAnchor">',"</a>",'<a href="#anonymizeHistoricalData">',"</a>")|raw }}
|
|
{{'PrivacyManager_SeeAlsoOurOfficialGuidePrivacy'|translate('<a href="https://matomo.org/privacy/" rel="noreferrer noopener" target="_blank">','</a>')|raw }}</p>
|
|
</div>
|
|
|
|
<div piwik-content-block
|
|
id="anonymizeIPAnchor"
|
|
content-title="{{ 'PrivacyManager_UseAnonymizeTrackingData'|translate|e('html_attr') }}">
|
|
<div piwik-form ng-controller="AnonymizeIpController as anonymizeIp">
|
|
|
|
<div piwik-field uicontrol="checkbox" name="anonymizeIpSettings"
|
|
ng-model="anonymizeIp.enabled"
|
|
title="{{ 'PrivacyManager_UseAnonymizeIp'|translate|e('html_attr') }}"
|
|
value="{{ anonymizeIP.enabled }}"
|
|
inline-help="{{ 'PrivacyManager_AnonymizeIpInlineHelp'|translate|e('html_attr') }} {{ 'PrivacyManager_AnonymizeIpDescription'|translate|e('html_attr') }}">
|
|
</div>
|
|
|
|
<div ng-show="anonymizeIp.enabled">
|
|
<div piwik-field uicontrol="radio" name="maskLength"
|
|
ng-model="anonymizeIp.maskLength"
|
|
title="{{ 'PrivacyManager_AnonymizeIpMaskLengtDescription'|translate|e('html_attr') }}"
|
|
value="{{ anonymizeIP.maskLength }}"
|
|
options="{{ maskLengthOptions|json_encode }}"
|
|
inline-help="{{ 'PrivacyManager_GeolocationAnonymizeIpNote'|translate|e('html_attr') }}">
|
|
</div>
|
|
|
|
<div piwik-field uicontrol="radio" name="useAnonymizedIpForVisitEnrichment"
|
|
ng-model="anonymizeIp.useAnonymizedIpForVisitEnrichment"
|
|
title="{{ 'PrivacyManager_UseAnonymizedIpForVisitEnrichment'|translate|e('html_attr') }}"
|
|
value="{% if anonymizeIP.useAnonymizedIpForVisitEnrichment %}1{% else %}0{% endif %}"
|
|
options="{{ useAnonymizedIpForVisitEnrichmentOptions|json_encode }}"
|
|
inline-help="{{ 'PrivacyManager_UseAnonymizedIpForVisitEnrichmentNote'|translate|e('html_attr') }}">
|
|
</div>
|
|
</div>
|
|
|
|
<div piwik-field uicontrol="checkbox" name="anonymizeUserId"
|
|
ng-model="anonymizeIp.anonymizeUserId"
|
|
title="{{ 'PrivacyManager_PseudonymizeUserId'|translate|e('html_attr') }}"
|
|
value="{{ anonymizeIP.anonymizeUserId }}"
|
|
inline-help="{{ 'PrivacyManager_PseudonymizeUserIdNote'|translate|e('html_attr') }}<br/><br/><em>{{ 'PrivacyManager_PseudonymizeUserIdNote2'|translate|e('html_attr') }}</em>">
|
|
</div>
|
|
|
|
<div piwik-field uicontrol="checkbox" name="anonymizeOrderId"
|
|
ng-model="anonymizeIp.anonymizeOrderId"
|
|
title="{{ 'PrivacyManager_UseAnonymizeOrderId'|translate|e('html_attr') }}"
|
|
value="{{ anonymizeIP.anonymizeOrderId }}"
|
|
inline-help="{{ 'PrivacyManager_AnonymizeOrderIdNote'|translate|e('html_attr') }}">
|
|
</div>
|
|
|
|
<div piwik-save-button onconfirm="anonymizeIp.save()" saving="anonymizeIp.isLoading"></div>
|
|
</div>
|
|
</div>
|
|
|
|
{% if isDataPurgeSettingsEnabled %}
|
|
<div piwik-content-block id="deleteLogsAnchor"
|
|
content-title="{{ 'PrivacyManager_DeleteOldRawData'|translate|e('html_attr') }}">
|
|
<div class="ui-confirm" id="confirmDeleteSettings">
|
|
<h2 id="deleteLogsConfirm">{{ 'PrivacyManager_DeleteLogsConfirm'|translate }}</h2>
|
|
|
|
<h2 id="deleteReportsConfirm">{{ 'PrivacyManager_DeleteReportsConfirm'|translate }}</h2>
|
|
|
|
<h2 id="deleteBothConfirm">{{ 'PrivacyManager_DeleteBothConfirm'|translate }}</h2>
|
|
<input role="yes" type="button" value="{{ 'General_Yes'|translate }}"/>
|
|
<input role="no" type="button" value="{{ 'General_No'|translate }}"/>
|
|
</div>
|
|
<div class="ui-confirm" id="saveSettingsBeforePurge">
|
|
<h2>{{ 'PrivacyManager_SaveSettingsBeforePurge'|translate }}</h2>
|
|
<input role="yes" type="button" value="{{ 'General_Ok'|translate }}"/>
|
|
</div>
|
|
<div class="ui-confirm" id="confirmPurgeNow">
|
|
<h2>{{ 'PrivacyManager_PurgeNowConfirm'|translate }}</h2>
|
|
<input role="yes" type="button" value="{{ 'General_Yes'|translate }}"/>
|
|
<input role="no" type="button" value="{{ 'General_No'|translate }}"/>
|
|
</div>
|
|
|
|
<p>{{ 'PrivacyManager_DeleteDataDescription'|translate }}</p>
|
|
|
|
<div piwik-form
|
|
ng-controller="DeleteOldLogsController as deleteOldLogs"
|
|
id="formDeleteSettings">
|
|
<div id="deleteLogSettingEnabled">
|
|
|
|
<div piwik-field uicontrol="checkbox" name="deleteEnable"
|
|
ng-model="deleteOldLogs.enabled"
|
|
ng-change="deleteOldLogs.reloadDbStats()"
|
|
title="{{ 'PrivacyManager_UseDeleteLog'|translate|e('html_attr') }}"
|
|
value="{{ deleteData.config.delete_logs_enable }}"
|
|
inline-help="{{ 'PrivacyManager_DeleteRawDataInfo'|translate|e('html_attr') }}">
|
|
</div>
|
|
|
|
<div class="alert alert-warning deleteOldLogsWarning" style="width: 50%;" ng-show="deleteOldLogs.enabled">
|
|
<a href="https://matomo.org/faq/general/#faq_125" rel="noreferrer noopener" target="_blank">
|
|
{{ 'General_ClickHere'|translate }}
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="deleteLogSettings" ng-show="deleteOldLogs.enabled">
|
|
<div piwik-field uicontrol="text" name="deleteOlderThan"
|
|
ng-model="deleteOldLogs.deleteOlderThan"
|
|
ng-change="deleteOldLogs.reloadDbStats()"
|
|
title="{{ 'PrivacyManager_DeleteLogsOlderThan'|translate|e('html_attr') }} ({{ 'Intl_PeriodDays'|translate }})"
|
|
value="{{ deleteData.config.delete_logs_older_than }}"
|
|
inline-help="{{ 'PrivacyManager_LeastDaysInput'|translate("1")|e('html_attr') }}">
|
|
</div>
|
|
</div>
|
|
|
|
<div piwik-save-button onconfirm="deleteOldLogs.save()" saving="deleteOldLogs.isLoading"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div piwik-content-block id="deleteReportsAnchor"
|
|
content-title="{{ 'PrivacyManager_DeleteOldAggregatedReports'|translate|e('html_attr') }}">
|
|
|
|
<div piwik-form
|
|
ng-controller="DeleteOldReportsController as deleteReports"
|
|
id="formDeleteSettings">
|
|
|
|
<div id="deleteReportsSettingEnabled">
|
|
|
|
<div piwik-field uicontrol="checkbox" name="deleteReportsEnable"
|
|
ng-model="deleteReports.enabled"
|
|
ng-change="deleteReports.reloadDbStats()"
|
|
title="{{ 'PrivacyManager_UseDeleteReports'|translate|e('html_attr') }}"
|
|
value="{{ deleteData.config.delete_reports_enable }}"
|
|
inline-help="{{ 'PrivacyManager_DeleteAggregateReportsDetailedInfo'|translate|e('html_attr') }}">
|
|
</div>
|
|
|
|
<div class="alert alert-warning" style="width: 50%;" ng-show="deleteReports.enabled">
|
|
{% set deleteOldLogs %}{{ 'PrivacyManager_UseDeleteLog'|translate }}{% endset %}
|
|
<span>
|
|
{{ 'PrivacyManager_DeleteReportsInfo2'|translate(deleteOldLogs) }}<br/><br/>
|
|
{{ 'PrivacyManager_DeleteReportsInfo3'|translate(deleteOldLogs) }}
|
|
</span>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div id="deleteReportsSettings" ng-show="deleteReports.enabled">
|
|
|
|
<div piwik-field uicontrol="text" name="deleteReportsOlderThan"
|
|
ng-model="deleteReports.deleteOlderThan"
|
|
ng-change="deleteReports.reloadDbStats()"
|
|
title="{{ 'PrivacyManager_DeleteReportsOlderThan'|translate|e('html_attr') }} ({{ 'Intl_PeriodMonths'|translate }})"
|
|
value="{{ deleteData.config.delete_reports_older_than }}"
|
|
inline-help="{{ 'PrivacyManager_LeastMonthsInput'|translate("1")|e('html_attr') }}">
|
|
</div>
|
|
|
|
<div piwik-field uicontrol="checkbox" name="deleteReportsKeepBasic"
|
|
ng-model="deleteReports.keepBasic"
|
|
ng-change="deleteReports.reloadDbStats()"
|
|
title="{{ 'PrivacyManager_KeepBasicMetrics'|translate|e('html_attr') }} ({{ 'General_Recommended'|translate|e('html_attr') }})"
|
|
value="{{ deleteData.config.delete_reports_keep_basic_metrics }}"
|
|
inline-help="{{ 'PrivacyManager_KeepBasicMetricsReportsDetailedInfo'|translate|e('html_attr') }}">
|
|
</div>
|
|
|
|
<h3>
|
|
{{ 'PrivacyManager_KeepDataFor'|translate }}
|
|
</h3>
|
|
<div>
|
|
|
|
<div piwik-field uicontrol="checkbox" name="deleteReportsKeepDay"
|
|
ng-model="deleteReports.keepDataForDay"
|
|
ng-change="deleteReports.reloadDbStats()"
|
|
title="{{ 'General_DailyReports'|translate|e('html_attr') }}"
|
|
value="{{ deleteData.config.delete_reports_keep_day_reports }}">
|
|
</div>
|
|
<div piwik-field uicontrol="checkbox" name="deleteReportsKeepWeek"
|
|
ng-model="deleteReports.keepDataForWeek"
|
|
ng-change="deleteReports.reloadDbStats()"
|
|
title="{{ 'General_WeeklyReports'|translate|e('html_attr') }}"
|
|
value="{{ deleteData.config.delete_reports_keep_week_reports }}">
|
|
</div>
|
|
<div piwik-field uicontrol="checkbox" name="deleteReportsKeepMonth"
|
|
ng-model="deleteReports.keepDataForMonth"
|
|
ng-change="deleteReports.reloadDbStats()"
|
|
title="{{ 'General_MonthlyReports'|translate|e('html_attr') }} ({{ 'General_Recommended'|translate|e('html_attr') }})"
|
|
value="{{ deleteData.config.delete_reports_keep_month_reports }}">
|
|
</div>
|
|
<div piwik-field uicontrol="checkbox" name="deleteReportsKeepYear"
|
|
ng-model="deleteReports.keepDataForYear"
|
|
ng-change="deleteReports.reloadDbStats()"
|
|
title="{{ 'General_YearlyReports'|translate|e('html_attr') }} ({{ 'General_Recommended'|translate|e('html_attr') }})"
|
|
value="{{ deleteData.config.delete_reports_keep_year_reports }}">
|
|
</div>
|
|
<div piwik-field uicontrol="checkbox" name="deleteReportsKeepRange"
|
|
ng-model="deleteReports.keepDataForRange"
|
|
ng-change="deleteReports.reloadDbStats()"
|
|
title="{{ 'General_RangeReports'|translate|e('html_attr') }}"
|
|
value="{{ deleteData.config.delete_reports_keep_range_reports }}">
|
|
</div>
|
|
<div piwik-field uicontrol="checkbox" name="deleteReportsKeepSegments"
|
|
ng-model="deleteReports.keepDataForSegments"
|
|
ng-change="deleteReports.reloadDbStats()"
|
|
title="{{ 'PrivacyManager_KeepReportSegments'|translate|e('html_attr') }}"
|
|
value="{{ deleteData.config.delete_reports_keep_segment_reports }}">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div piwik-save-button onconfirm="deleteReports.save()" saving="deleteReports.isLoading"></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div piwik-form
|
|
ng-controller="ScheduleReportDeletionController as reportDeletionSchedule"
|
|
id="formDeleteSettings">
|
|
|
|
<div piwik-content-block id="scheduleSettingsHeadline"
|
|
ng-show="reportDeletionSchedule.model.isEitherDeleteSectionEnabled()"
|
|
content-title="{{ 'PrivacyManager_DeleteSchedulingSettings'|translate|e('html_attr') }}">
|
|
|
|
<div id="deleteSchedulingSettings">
|
|
<div id="deleteSchedulingSettingsInlineHelp" class="inline-help-node">
|
|
{% if deleteData.lastRun %}<strong>{{ 'PrivacyManager_LastDelete'|translate }}:</strong>
|
|
{{ deleteData.lastRunPretty }}
|
|
<br/>
|
|
<br/>
|
|
{% endif %}
|
|
<strong>{{ 'PrivacyManager_NextDelete'|translate }}:</strong>
|
|
{{ deleteData.nextRunPretty|rawSafeDecoded }}
|
|
<br/>
|
|
<br/>
|
|
<a id="purgeDataNowLink" href="#"
|
|
ng-show="reportDeletionSchedule.showPurgeNowLink"
|
|
ng-click="reportDeletionSchedule.executeDataPurgeNow()">{{ 'PrivacyManager_PurgeNow'|translate }}</a>
|
|
|
|
<div piwik-activity-indicator
|
|
loading-message="'{{ 'PrivacyManager_PurgingData'|translate|e('html_attr') }}'"
|
|
loading="reportDeletionSchedule.loadingDataPurge"></div>
|
|
<span id="db-purged-message"
|
|
ng-show="reportDeletionSchedule.dataWasPurged"
|
|
>{{ 'PrivacyManager_DBPurged'|translate }}</span>
|
|
</div>
|
|
|
|
<div piwik-field uicontrol="select" name="deleteLowestInterval"
|
|
ng-model="reportDeletionSchedule.deleteLowestInterval"
|
|
options="{{ scheduleDeletionOptions|json_encode }}"
|
|
title="{{ 'PrivacyManager_DeleteDataInterval'|translate|e('html_attr') }}"
|
|
value="{{ deleteData.config.delete_logs_schedule_lowest_interval }}"
|
|
inline-help="#deleteSchedulingSettingsInlineHelp">
|
|
</div>
|
|
</div>
|
|
|
|
{% if deleteData.config.enable_database_size_estimate == '1' %}
|
|
<div id="deleteDataEstimateSect" class="form-group row">
|
|
|
|
<h3 class="col s12" id="databaseSizeHeadline">
|
|
{{ 'PrivacyManager_ReportsDataSavedEstimate'|translate }}
|
|
</h3>
|
|
<div class="col s12 m6">
|
|
<div id="deleteDataEstimate" ng-show="reportDeletionSchedule.model.showEstimate"
|
|
ng-bind-html="reportDeletionSchedule.model.estimation"></div>
|
|
|
|
<div piwik-activity-indicator loading="reportDeletionSchedule.model.loadingEstimation"></div>
|
|
</div>
|
|
<div class="col s12 m6">
|
|
{% if deleteData.config.enable_auto_database_size_estimate == '0' %}
|
|
<div class="form-help">
|
|
<a id="getPurgeEstimateLink"
|
|
ng-click="reportDeletionSchedule.model.reloadDbStats(true)"
|
|
href="#">{{ 'PrivacyManager_GetPurgeEstimate'|translate }}</a>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
|
|
<div piwik-save-button onconfirm="reportDeletionSchedule.save()" saving="reportDeletionSchedule.isLoading"></div>
|
|
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
|
|
<a name="anonymizeHistoricalData" id="anonymizeHistoricalData"></a>
|
|
|
|
<div piwik-content-block content-title="Anonymize previously tracked raw data" class="logDataAnonymizer">
|
|
<p>If you have tracked personal data such as the full visitor IP, you may
|
|
want to anonymize this data now in case you do not have consent for this data or no longer a legitimate
|
|
interest.
|
|
</p>
|
|
|
|
{% if isSuperUser %}
|
|
<div matomo-anonymize-log-data></div>
|
|
{% else %}
|
|
<p>Only a user with Super User access can anonymize previously tracked raw data.</p>
|
|
{% endif %}
|
|
|
|
<br />
|
|
<h3>Previous raw data anonymizations</h3>
|
|
<table piwik-content-table>
|
|
<thead>
|
|
<tr>
|
|
<th>Requester</th>
|
|
<th>Affected ID Sites</th>
|
|
<th>Affected date</th>
|
|
<th>Anonymize</th>
|
|
<th>Visit Columns</th>
|
|
<th>Link Visit Action Columns</th>
|
|
<th>Status</th>
|
|
</tr></thead>
|
|
<tbody>
|
|
{% for entry in anonymizations %}
|
|
{% set isStarted = entry.job_start_date or not entry.job_start_date is empty %}
|
|
{% set isFinished = entry.job_finish_date or not entry.job_finish_date is empty %}
|
|
<tr>
|
|
<td>{{ entry.requester }}</td>
|
|
<td>{{ entry.sites|join(', ') }}</td>
|
|
<td>{{ entry.date_start }} - {{ entry.date_end }}</td>
|
|
<td>{% if entry.anonymize_ip %}<span>IP address<br /></span>{% endif %}
|
|
{% if entry.anonymize_location %}<span>Location<br /></span>{% endif %}
|
|
{% if entry.anonymize_userid %}<span>User ID</span>{% endif %}
|
|
{% if not entry.anonymize_ip and not entry.anonymize_location and not entry.anonymize_userid %}-{% endif %}
|
|
</td>
|
|
<td>{{ entry.unset_visit_columns|join(', ') }}</td>
|
|
<td>{{ entry.unset_link_visit_action_columns|join(', ') }}</td>
|
|
<td>
|
|
{% if not isStarted %}
|
|
<span class="icon-info" style="cursor: help;" title="Scheduled date: {{ entry.scheduled_date|default('') }}."></span> Scheduled
|
|
{% elseif isStarted and not isFinished %}
|
|
<span class="icon-info" style="cursor: help;" title="Scheduled date: {{ entry.scheduled_date|default('') }}. Job Start Date: {{ entry.job_start_date }}. Current Output: {{ entry.output }}"></span> In progress
|
|
{% else %}
|
|
<span class="icon-info" style="cursor: help;" title="Scheduled date: {{ entry.scheduled_date|default('') }}. Job Start Date: {{ entry.job_start_date }}. Job Finish Date: {{ entry.job_finish_date }}. Output: {{ entry.output }}"></span> Done
|
|
{% endif %}
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
{% endblock %}
|