2
0
mirror of https://github.com/frappe/books.git synced 2024-09-19 19:19:02 +00:00

Merge pull request #675 from frappe/revise-telemetry

fix: review telemetry
This commit is contained in:
Alan 2023-06-27 23:58:53 -07:00 committed by GitHub
commit fe3b8c4c16
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 61 additions and 40 deletions

View File

@ -1,5 +1,6 @@
import { Fyo } from 'fyo'; import { Fyo } from 'fyo';
import { Noun, Telemetry, Verb } from './types'; import { Noun, Telemetry, Verb } from './types';
import { ModelNameEnum } from 'models/types';
/** /**
* # Telemetry * # Telemetry
@ -26,6 +27,11 @@ import { Noun, Telemetry, Verb } from './types';
* the app is hidden. * the app is hidden.
*/ */
const ignoreList: string[] = [
ModelNameEnum.AccountingLedgerEntry,
ModelNameEnum.StockLedgerEntry,
];
export class TelemetryManager { export class TelemetryManager {
#url = ''; #url = '';
#token = ''; #token = '';
@ -80,7 +86,11 @@ export class TelemetryManager {
} }
#sendBeacon(verb: Verb, noun: Noun, more?: Record<string, unknown>) { #sendBeacon(verb: Verb, noun: Noun, more?: Record<string, unknown>) {
if (!this.hasCreds || this.fyo.store.skipTelemetryLogging) { if (
!this.hasCreds ||
this.fyo.store.skipTelemetryLogging ||
ignoreList.includes(noun)
) {
return; return;
} }

View File

@ -3,12 +3,15 @@ export type UniqueId = string;
export type Timestamp = string; export type Timestamp = string;
export enum Verb { export enum Verb {
Started = 'started',
Completed = 'completed',
Created = 'created', Created = 'created',
Deleted = 'deleted', Deleted = 'deleted',
Submitted = 'submitted', Submitted = 'submitted',
Cancelled = 'cancelled', Cancelled = 'cancelled',
Imported = 'imported', Imported = 'imported',
Exported = 'exported', Exported = 'exported',
Printed = 'printed',
Closed = 'closed', Closed = 'closed',
Opened = 'opened', Opened = 'opened',
Resumed = 'resumed', Resumed = 'resumed',

View File

@ -1,4 +1,3 @@
import { emitMainProcessError } from 'backend/helpers';
import { App, BrowserWindow } from 'electron'; import { App, BrowserWindow } from 'electron';
import fs from 'fs/promises'; import fs from 'fs/promises';
import path from 'path'; import path from 'path';
@ -31,29 +30,11 @@ export async function saveHtmlAsPdf(
printSelectionOnly: false, printSelectionOnly: false,
}; };
/** const data = await printWindow.webContents.printToPDF(printOptions);
* After the printWindow content is ready, save as pdf and await fs.writeFile(savePath, data);
* then close the window and delete the temp html file. printWindow.close();
*/ await fs.unlink(htmlPath);
return await new Promise((resolve) => { return true;
printWindow.webContents.once('did-finish-load', () => {
printWindow.webContents
.printToPDF(printOptions)
.then((data) => {
fs.writeFile(savePath, data)
.then(() => {
printWindow.close();
fs.unlink(htmlPath)
.then(() => {
resolve(true);
})
.catch((err) => emitMainProcessError(err));
})
.catch((err) => emitMainProcessError(err));
})
.catch((err) => emitMainProcessError(err));
});
});
} }
async function getInitializedPrintWindow( async function getInitializedPrintWindow(

View File

@ -26,7 +26,7 @@
<Int <Int
v-if="configFields.limit" v-if="configFields.limit"
:df="configFields.limit" :df="configFields.limit"
:value="limit" :value="limit ?? undefined"
:border="true" :border="true"
@change="(value: number) => (limit = value)" @change="(value: number) => (limit = value)"
/> />
@ -104,6 +104,7 @@ import Check from './Controls/Check.vue';
import Int from './Controls/Int.vue'; import Int from './Controls/Int.vue';
import Select from './Controls/Select.vue'; import Select from './Controls/Select.vue';
import FormHeader from './FormHeader.vue'; import FormHeader from './FormHeader.vue';
import { Verb } from 'fyo/telemetry/types';
interface ExportWizardData { interface ExportWizardData {
useListFilters: boolean; useListFilters: boolean;
@ -165,13 +166,13 @@ export default defineComponent({
fieldtype: 'Check', fieldtype: 'Check',
label: t`Use List Filters`, label: t`Use List Filters`,
fieldname: 'useListFilters', fieldname: 'useListFilters',
}, } as Field,
limit: { limit: {
placeholder: 'Limit number of rows', placeholder: 'Limit number of rows',
fieldtype: 'Int', fieldtype: 'Int',
label: t`Limit`, label: t`Limit`,
fieldname: 'limit', fieldname: 'limit',
}, } as Field,
exportFormat: { exportFormat: {
fieldtype: 'Select', fieldtype: 'Select',
label: t`Export Format`, label: t`Export Format`,
@ -180,7 +181,7 @@ export default defineComponent({
{ value: 'json', label: 'JSON' }, { value: 'json', label: 'JSON' },
{ value: 'csv', label: 'CSV' }, { value: 'csv', label: 'CSV' },
], ],
}, } as Field,
}; };
}, },
}, },
@ -257,6 +258,9 @@ export default defineComponent({
} }
await saveData(data, filePath); await saveData(data, filePath);
this.fyo.telemetry.log(Verb.Exported, this.schemaName, {
extension: this.exportFormat,
});
showExportInFolder(fyo.t`Export Successful`, filePath); showExportInFolder(fyo.t`Export Successful`, filePath);
}, },
getFileName() { getFileName() {

View File

@ -216,6 +216,7 @@
<script lang="ts"> <script lang="ts">
import { setupDummyInstance } from 'dummy'; import { setupDummyInstance } from 'dummy';
import { t } from 'fyo'; import { t } from 'fyo';
import { Verb } from 'fyo/telemetry/types';
import { DateTime } from 'luxon'; import { DateTime } from 'luxon';
import Button from 'src/components/Button.vue'; import Button from 'src/components/Button.vue';
import LanguageSelector from 'src/components/Controls/LanguageSelector.vue'; import LanguageSelector from 'src/components/Controls/LanguageSelector.vue';
@ -334,7 +335,7 @@ export default defineComponent({
updateConfigFiles(fyo); updateConfigFiles(fyo);
await fyo.purgeCache(); await fyo.purgeCache();
await this.setFiles(); await this.setFiles();
this.fyo.telemetry.log(Verb.Created, 'dummy-instance');
this.creatingDemo = false; this.creatingDemo = false;
}, },
async setFiles() { async setFiles() {

View File

@ -371,6 +371,7 @@
<script lang="ts"> <script lang="ts">
import { DocValue } from 'fyo/core/types'; import { DocValue } from 'fyo/core/types';
import { Action } from 'fyo/model/types'; import { Action } from 'fyo/model/types';
import { Verb } from 'fyo/telemetry/types';
import { ValidationError } from 'fyo/utils/errors'; import { ValidationError } from 'fyo/utils/errors';
import { ModelNameEnum } from 'models/types'; import { ModelNameEnum } from 'models/types';
import { OptionField, RawValue, SelectOption } from 'schemas/types'; import { OptionField, RawValue, SelectOption } from 'schemas/types';
@ -864,6 +865,7 @@ export default defineComponent({
} }
} }
this.fyo.telemetry.log(Verb.Imported, this.importer.schemaName);
this.isMakingEntries = false; this.isMakingEntries = false;
this.complete = true; this.complete = true;
}, },

View File

@ -34,6 +34,7 @@
<PrintContainer <PrintContainer
v-if="printProps" v-if="printProps"
ref="printContainer" ref="printContainer"
:print-schema-name="schemaName"
:template="printProps.template" :template="printProps.template"
:values="printProps.values" :values="printProps.values"
:scale="scale" :scale="scale"
@ -55,11 +56,11 @@ import PageHeader from 'src/components/PageHeader.vue';
import { handleErrorWithDialog } from 'src/errorHandling'; import { handleErrorWithDialog } from 'src/errorHandling';
import { fyo } from 'src/initFyo'; import { fyo } from 'src/initFyo';
import { getPrintTemplatePropValues } from 'src/utils/printTemplates'; import { getPrintTemplatePropValues } from 'src/utils/printTemplates';
import { showSidebar } from 'src/utils/refs';
import { PrintValues } from 'src/utils/types'; import { PrintValues } from 'src/utils/types';
import { getFormRoute, openSettings, routeTo } from 'src/utils/ui'; import { getFormRoute, openSettings, routeTo } from 'src/utils/ui';
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import PrintContainer from '../TemplateBuilder/PrintContainer.vue'; import PrintContainer from '../TemplateBuilder/PrintContainer.vue';
import { showSidebar } from 'src/utils/refs';
export default defineComponent({ export default defineComponent({
name: 'PrintView', name: 'PrintView',
@ -244,16 +245,16 @@ export default defineComponent({
this.templateList = list.map(({ name }) => name); this.templateList = list.map(({ name }) => name);
}, },
savePDF() { async savePDF() {
const printContainer = this.$refs.printContainer as { const printContainer = this.$refs.printContainer as {
savePDF: (name?: string) => void; savePDF: (name?: string) => Promise<void>;
}; };
if (!printContainer?.savePDF) { if (!printContainer?.savePDF) {
return; return;
} }
printContainer.savePDF(this.doc?.name); await printContainer.savePDF(this.doc?.name);
}, },
async setTemplateFromDefault() { async setTemplateFromDefault() {
const defaultName = const defaultName =

View File

@ -145,20 +145,21 @@
</div> </div>
</template> </template>
<script lang="ts"> <script lang="ts">
import { Verb } from 'fyo/telemetry/types';
import { Report } from 'reports/Report'; import { Report } from 'reports/Report';
import { reports } from 'reports/index'; import { reports } from 'reports/index';
import { OptionField } from 'schemas/types';
import Button from 'src/components/Button.vue'; import Button from 'src/components/Button.vue';
import Check from 'src/components/Controls/Check.vue'; import Check from 'src/components/Controls/Check.vue';
import Int from 'src/components/Controls/Int.vue'; import Int from 'src/components/Controls/Int.vue';
import Select from 'src/components/Controls/Select.vue';
import PageHeader from 'src/components/PageHeader.vue'; import PageHeader from 'src/components/PageHeader.vue';
import { getReport } from 'src/utils/misc'; import { getReport } from 'src/utils/misc';
import { getPathAndMakePDF } from 'src/utils/printTemplates';
import { showSidebar } from 'src/utils/refs';
import { paperSizeMap, printSizes } from 'src/utils/ui';
import { PropType, defineComponent } from 'vue'; import { PropType, defineComponent } from 'vue';
import ScaledContainer from '../TemplateBuilder/ScaledContainer.vue'; import ScaledContainer from '../TemplateBuilder/ScaledContainer.vue';
import { getPathAndMakePDF } from 'src/utils/printTemplates';
import { OptionField } from 'schemas/types';
import { paperSizeMap, printSizes } from 'src/utils/ui';
import Select from 'src/components/Controls/Select.vue';
import { showSidebar } from 'src/utils/refs';
export default defineComponent({ export default defineComponent({
components: { PageHeader, Button, Check, Int, ScaledContainer, Select }, components: { PageHeader, Button, Check, Int, ScaledContainer, Select },
@ -276,6 +277,8 @@ export default defineComponent({
this.size.width, this.size.width,
this.size.height this.size.height
); );
this.fyo.telemetry.log(Verb.Printed, this.report!.reportName);
}, },
cellClasses(cIdx: number, rIdx: number): string[] { cellClasses(cIdx: number, rIdx: number): string[] {
const classes: string[] = []; const classes: string[] = [];

View File

@ -47,7 +47,7 @@
<p v-if="loading" class="text-base text-gray-600"> <p v-if="loading" class="text-base text-gray-600">
{{ t`Loading instance...` }} {{ t`Loading instance...` }}
</p> </p>
<Button v-if="!loading" class="w-24" @click="$emit('setup-canceled')">{{ <Button v-if="!loading" class="w-24" @click="cancel">{{
t`Cancel` t`Cancel`
}}</Button> }}</Button>
<Button <Button
@ -72,6 +72,8 @@
<script lang="ts"> <script lang="ts">
import { DocValue } from 'fyo/core/types'; import { DocValue } from 'fyo/core/types';
import { Doc } from 'fyo/model/doc'; import { Doc } from 'fyo/model/doc';
import { Verb } from 'fyo/telemetry/types';
import { ModelNameEnum } from 'models/types';
import { Field } from 'schemas/types'; import { Field } from 'schemas/types';
import Button from 'src/components/Button.vue'; import Button from 'src/components/Button.vue';
import FormContainer from 'src/components/FormContainer.vue'; import FormContainer from 'src/components/FormContainer.vue';
@ -153,6 +155,7 @@ export default defineComponent({
// @ts-ignore // @ts-ignore
window.sw = this; window.sw = this;
} }
this.fyo.telemetry.log(Verb.Started, ModelNameEnum.SetupWizard);
}, },
methods: { methods: {
async fill() { async fill() {
@ -198,8 +201,13 @@ export default defineComponent({
} }
this.loading = true; this.loading = true;
this.fyo.telemetry.log(Verb.Completed, ModelNameEnum.SetupWizard);
this.$emit('setup-complete', this.doc.getValidDict()); this.$emit('setup-complete', this.doc.getValidDict());
}, },
cancel() {
this.fyo.telemetry.log(Verb.Cancelled, ModelNameEnum.SetupWizard);
this.$emit('setup-canceled');
},
}, },
}); });
</script> </script>

View File

@ -49,6 +49,7 @@ import {
generateCodeFrame, generateCodeFrame,
SourceLocation, SourceLocation,
} from '@vue/compiler-dom'; } from '@vue/compiler-dom';
import { Verb } from 'fyo/telemetry/types';
import ErrorBoundary from 'src/components/ErrorBoundary.vue'; import ErrorBoundary from 'src/components/ErrorBoundary.vue';
import { getPathAndMakePDF } from 'src/utils/printTemplates'; import { getPathAndMakePDF } from 'src/utils/printTemplates';
import { PrintValues } from 'src/utils/types'; import { PrintValues } from 'src/utils/types';
@ -66,6 +67,7 @@ export default defineComponent({
components: { ScaledContainer, ErrorBoundary }, components: { ScaledContainer, ErrorBoundary },
props: { props: {
template: { type: String, required: true }, template: { type: String, required: true },
printSchemaName: { type: String, required: true },
scale: { type: Number, default: 0.65 }, scale: { type: Number, default: 0.65 },
width: { type: Number, default: 21 }, width: { type: Number, default: 21 },
height: { type: Number, default: 29.7 }, height: { type: Number, default: 29.7 },
@ -179,6 +181,8 @@ export default defineComponent({
this.width, this.width,
this.height this.height
); );
this.fyo.telemetry.log(Verb.Printed, this.printSchemaName);
}, },
}, },
}); });

View File

@ -46,6 +46,7 @@
<div v-if="canDisplayPreview" class="p-4 overflow-auto custom-scroll"> <div v-if="canDisplayPreview" class="p-4 overflow-auto custom-scroll">
<PrintContainer <PrintContainer
ref="printContainer" ref="printContainer"
:print-schema-name="displayDoc!.schemaName"
:template="doc.template!" :template="doc.template!"
:values="values!" :values="values!"
:scale="scale" :scale="scale"

View File

@ -290,6 +290,8 @@ export async function updatePrintTemplates(fyo: Fyo) {
updateList.push(...updates); updateList.push(...updates);
} }
const isLogging = fyo.store.skipTelemetryLogging;
fyo.store.skipTelemetryLogging = true;
for (const { name, type, template } of updateList) { for (const { name, type, template } of updateList) {
const doc = await getDocFromNameIfExistsElseNew( const doc = await getDocFromNameIfExistsElseNew(
ModelNameEnum.PrintTemplate, ModelNameEnum.PrintTemplate,
@ -299,6 +301,7 @@ export async function updatePrintTemplates(fyo: Fyo) {
await doc.set({ name, type, template, isCustom: false }); await doc.set({ name, type, template, isCustom: false });
await doc.sync(); await doc.sync();
} }
fyo.store.skipTelemetryLogging = isLogging;
} }
function getPrintTemplateUpdateList( function getPrintTemplateUpdateList(