annotate pkg/imports/report.go @ 5335:dcd5692a2889 extented-report

Sending generated reports to receivers.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 01 Jun 2021 02:46:14 +0200
parents 45805c454436
children 2ec8a34ae683
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5326
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
1 // This is Free Software under GNU Affero General Public License v >= 3.0
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
2 // without warranty, see README.md and license for details.
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
3 //
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
4 // SPDX-License-Identifier: AGPL-3.0-or-later
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
5 // License-Filename: LICENSES/AGPL-3.0.txt
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
6 //
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
7 // Copyright (C) 2018 by via donau
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
8 // – Österreichische Wasserstraßen-Gesellschaft mbH
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
9 // Software engineering by Intevation GmbH
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
10 //
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
11 // Author(s):
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
12 // * Sascha L. Teichmann <sascha.teichmann@intevation.de>
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
13
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
14 package imports
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
15
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
16 import (
5335
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
17 "bytes"
5326
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
18 "context"
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
19 "database/sql"
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
20 "errors"
5334
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
21 "fmt"
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
22 "log"
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
23 "os"
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
24 "path/filepath"
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
25 "regexp"
5335
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
26 "strings"
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
27 "text/template"
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
28 "time"
5326
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
29
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
30 "gemma.intevation.de/gemma/pkg/common"
5334
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
31 "gemma.intevation.de/gemma/pkg/config"
5335
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
32 "gemma.intevation.de/gemma/pkg/misc"
5329
795a0a0b5047 Embed scheduling type into report import to ensure persistence of schedule data.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5328
diff changeset
33 "gemma.intevation.de/gemma/pkg/models"
5334
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
34 "gemma.intevation.de/gemma/pkg/xlsx"
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
35
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
36 "github.com/360EntSecGroup-Skylar/excelize/v2"
5326
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
37 )
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
38
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
39 type Report struct {
5329
795a0a0b5047 Embed scheduling type into report import to ensure persistence of schedule data.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5328
diff changeset
40 models.QueueConfigurationType
5326
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
41 Name string `json:"Name"`
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
42 }
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
43
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
44 const ReportJobKind JobKind = "report"
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
45
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
46 type reportJobCreator struct{}
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
47
5335
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
48 const selectReportUsersSQL = `
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
49 SELECT username, email_address
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
50 FROM users.list_users
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
51 WHERE report_reciever
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
52 ORDER BY country, username`
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
53
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
54 var reportMailTmpl = template.Must(template.New("report-mail").
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
55 Parse(`Dear {{ .User }}
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
56
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
57 this is an automatically generated report from the Gemma system.
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
58 You received this mail because you are marked a report receiver in
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
59 the system. Please contact the system adminstrator of the system
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
60 if your recieved this mail against you consent.
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
61
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
62 Find attached {{ .Attachment }} which contains the {{ .Report }} from {{ .When }}.
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
63
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
64 Kind Regards`))
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
65
5328
bc8c082487b2 Fixed compile errors. :-/
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5326
diff changeset
66 func init() { RegisterJobCreator(ReportJobKind, reportJobCreator{}) }
5326
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
67
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
68 func (reportJobCreator) Description() string { return "report" }
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
69
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
70 func (reportJobCreator) AutoAccept() bool { return true }
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
71
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
72 func (reportJobCreator) Create() Job { return new(Report) }
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
73
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
74 func (reportJobCreator) Depends() [2][]string { return [2][]string{{}, {}} }
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
75
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
76 func (reportJobCreator) StageDone(context.Context, *sql.Tx, int64, Feedback) error {
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
77 return nil
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
78 }
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
79
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
80 func (r *Report) Description() (string, error) { return r.Name, nil }
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
81
5328
bc8c082487b2 Fixed compile errors. :-/
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5326
diff changeset
82 func (*Report) CleanUp() error { return nil }
bc8c082487b2 Fixed compile errors. :-/
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5326
diff changeset
83
5326
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
84 func (r *Report) MarshalAttributes(attrs common.Attributes) error {
5329
795a0a0b5047 Embed scheduling type into report import to ensure persistence of schedule data.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5328
diff changeset
85 if err := r.QueueConfigurationType.MarshalAttributes(attrs); err != nil {
795a0a0b5047 Embed scheduling type into report import to ensure persistence of schedule data.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5328
diff changeset
86 return err
795a0a0b5047 Embed scheduling type into report import to ensure persistence of schedule data.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5328
diff changeset
87 }
5326
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
88 attrs.Set("name", r.Name)
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
89 return nil
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
90 }
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
91
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
92 func (r *Report) UnmarshalAttributes(attrs common.Attributes) error {
5329
795a0a0b5047 Embed scheduling type into report import to ensure persistence of schedule data.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5328
diff changeset
93 if err := r.QueueConfigurationType.UnmarshalAttributes(attrs); err != nil {
795a0a0b5047 Embed scheduling type into report import to ensure persistence of schedule data.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5328
diff changeset
94 return err
795a0a0b5047 Embed scheduling type into report import to ensure persistence of schedule data.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5328
diff changeset
95 }
5326
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
96 name, found := attrs.Get("name")
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
97 if !found {
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
98 return errors.New("missing 'name' attribute")
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
99 }
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
100 r.Name = name
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
101 return nil
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
102 }
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
103
5334
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
104 func (r *Report) loadTemplate() (*excelize.File, *xlsx.Action, error) {
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
105 path := config.ReportPath()
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
106 if path == "" {
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
107 return nil, nil, errors.New("no report dir configured")
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
108 }
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
109
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
110 if stat, err := os.Stat(path); err != nil {
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
111 if os.IsNotExist(err) {
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
112 return nil, nil, fmt.Errorf("report dir '%s' does not exists", path)
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
113 }
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
114 return nil, nil, err
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
115 } else if !stat.Mode().IsDir() {
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
116 return nil, nil, fmt.Errorf("report dir '%s' is not a directory", path)
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
117 }
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
118
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
119 // TODO: Prevent this earlier.
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
120 if match, _ := regexp.MatchString(`^[a-zA-Z0-9_]+$`, r.Name); !match {
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
121 return nil, nil, errors.New("invalid report name")
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
122 }
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
123
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
124 xlsxFilename := filepath.Join(path, r.Name+".xlsx")
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
125 yamlFilename := filepath.Join(path, r.Name+".yaml")
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
126
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
127 for _, check := range []string{xlsxFilename, yamlFilename} {
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
128 if _, err := os.Stat(check); err != nil {
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
129 if os.IsNotExist(err) {
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
130 return nil, nil, fmt.Errorf("'%s' does not exists", check)
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
131 }
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
132 return nil, nil, err
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
133 }
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
134 }
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
135
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
136 template, err := excelize.OpenFile(xlsxFilename)
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
137 if err != nil {
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
138 return nil, nil, err
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
139 }
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
140
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
141 action, err := xlsx.ActionFromFile(yamlFilename)
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
142 if err != nil {
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
143 return nil, nil, err
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
144 }
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
145
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
146 return template, action, nil
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
147 }
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
148
5326
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
149 func (r *Report) Do(
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
150 ctx context.Context,
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
151 importID int64,
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
152 conn *sql.Conn,
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
153 feedback Feedback,
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
154 ) (interface{}, error) {
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
155
5335
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
156 start := time.Now()
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
157
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
158 feedback.Info("Generating report %s.", r.Name)
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
159
5334
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
160 template, action, err := r.loadTemplate()
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
161 if err != nil {
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
162 return nil, err
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
163 }
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
164
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
165 tx, err := conn.BeginTx(ctx, &sql.TxOptions{ReadOnly: true})
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
166 if err != nil {
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
167 return nil, err
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
168 }
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
169 defer tx.Rollback()
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
170
5335
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
171 var users []misc.EmailReceiver
5334
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
172
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
173 if err := func() error {
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
174 rows, err := tx.QueryContext(ctx, selectReportUsersSQL)
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
175 if err != nil {
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
176 return err
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
177 }
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
178 defer rows.Close()
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
179
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
180 for rows.Next() {
5335
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
181 var u misc.EmailReceiver
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
182 if err := rows.Scan(&u.Name, &u.Address); err != nil {
5334
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
183 return err
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
184 }
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
185 users = append(users, u)
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
186 }
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
187 return rows.Err()
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
188 }(); err != nil {
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
189 return nil, err
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
190 }
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
191
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
192 if len(users) == 0 {
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
193 feedback.Warn("No users found to send reports to.")
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
194 return nil, nil
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
195 }
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
196
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
197 if err := action.Execute(ctx, tx, template); err != nil {
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
198 log.Printf("error: %v\n", err)
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
199 return nil, fmt.Errorf("Generating report failed: %v", err)
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
200 }
45805c454436 Load users from database who should receive a report.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5329
diff changeset
201
5335
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
202 var buf bytes.Buffer
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
203 if _, err := template.WriteTo(&buf); err != nil {
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
204 log.Printf("error: %v\n", err)
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
205 return nil, fmt.Errorf("generating report failed: %v", err)
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
206 }
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
207
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
208 feedback.Info("Sending reports to %d receivers.", len(users))
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
209
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
210 now := start.UTC().Format("2006-01-02")
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
211
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
212 attached := r.Name + "-" + now + ".xlsx"
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
213
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
214 attachments := []misc.EmailAttachment{{
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
215 Name: attached,
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
216 Content: buf.Bytes(),
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
217 }}
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
218
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
219 errorHandler := func(r misc.EmailReceiver, err error) error {
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
220 // We do not terminate the sending of the emails if
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
221 // sending failed. We only log it.
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
222 feedback.Warn("Sending report to %s failed: %v", r.Name, err)
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
223 return nil
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
224 }
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
225
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
226 body := func(u misc.EmailReceiver) (string, error) {
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
227 fill := struct {
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
228 User string
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
229 Attachment string
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
230 Report string
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
231 When string
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
232 }{
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
233 User: u.Name,
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
234 Attachment: attached,
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
235 Report: r.Name,
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
236 When: now,
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
237 }
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
238 var sb strings.Builder
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
239 if err := reportMailTmpl.Execute(&sb, &fill); err != nil {
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
240 return "", err
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
241 }
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
242 return sb.String(), nil
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
243 }
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
244
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
245 if err := misc.SendMailToAll(
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
246 users,
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
247 "Report "+r.Name+" from "+now,
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
248 body,
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
249 attachments,
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
250 errorHandler,
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
251 ); err != nil {
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
252 return nil, err
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
253 }
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
254
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
255 feedback.Info("Generating and sending report took %v.",
dcd5692a2889 Sending generated reports to receivers.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents: 5334
diff changeset
256 time.Since(start))
5326
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
257
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
258 return nil, nil
96ceb150ea46 Added infrastructure for report 'import'.
Sascha L. Teichmann <sascha.teichmann@intevation.de>
parents:
diff changeset
259 }