Compare commits
10 Commits
00a4d63344
...
3fc33dd3db
Author | SHA1 | Date | |
---|---|---|---|
![]() |
3fc33dd3db | ||
![]() |
247a411262 | ||
![]() |
1f06d252a4 | ||
![]() |
c934124b88 | ||
![]() |
b7bba814e3 | ||
![]() |
8c285968af | ||
![]() |
b91a5d9adf | ||
![]() |
17b281072f | ||
![]() |
d47555e3c2 | ||
![]() |
3f98f47256 |
150
.drone.yml
150
.drone.yml
@ -676,13 +676,13 @@ steps:
|
|||||||
image: plugins/s3
|
image: plugins/s3
|
||||||
pull: always
|
pull: always
|
||||||
settings:
|
settings:
|
||||||
bucket: vikunja-releases
|
bucket: vikunja
|
||||||
access_key:
|
access_key:
|
||||||
from_secret: aws_access_key_id
|
from_secret: hetzner_access_key_id
|
||||||
secret_key:
|
secret_key:
|
||||||
from_secret: aws_secret_access_key
|
from_secret: hetzner_secret_access_key
|
||||||
endpoint: https://s3.fr-par.scw.cloud
|
endpoint: https://fsn1.your-objectstorage.com
|
||||||
region: fr-par
|
region: fsn1
|
||||||
path_style: true
|
path_style: true
|
||||||
strip_prefix: dist/zip/
|
strip_prefix: dist/zip/
|
||||||
source: dist/zip/*
|
source: dist/zip/*
|
||||||
@ -698,13 +698,13 @@ steps:
|
|||||||
image: plugins/s3
|
image: plugins/s3
|
||||||
pull: always
|
pull: always
|
||||||
settings:
|
settings:
|
||||||
bucket: vikunja-releases
|
bucket: vikunja
|
||||||
access_key:
|
access_key:
|
||||||
from_secret: aws_access_key_id
|
from_secret: hetzner_access_key_id
|
||||||
secret_key:
|
secret_key:
|
||||||
from_secret: aws_secret_access_key
|
from_secret: hetzner_secret_access_key
|
||||||
endpoint: https://s3.fr-par.scw.cloud
|
endpoint: https://fsn1.your-objectstorage.com
|
||||||
region: fr-par
|
region: fsn1
|
||||||
path_style: true
|
path_style: true
|
||||||
strip_prefix: dist/zip/
|
strip_prefix: dist/zip/
|
||||||
source: dist/zip/*
|
source: dist/zip/*
|
||||||
@ -750,13 +750,13 @@ steps:
|
|||||||
image: plugins/s3
|
image: plugins/s3
|
||||||
pull: always
|
pull: always
|
||||||
settings:
|
settings:
|
||||||
bucket: vikunja-releases
|
bucket: vikunja
|
||||||
access_key:
|
access_key:
|
||||||
from_secret: aws_access_key_id
|
from_secret: hetzner_access_key_id
|
||||||
secret_key:
|
secret_key:
|
||||||
from_secret: aws_secret_access_key
|
from_secret: hetzner_secret_access_key
|
||||||
endpoint: https://s3.fr-par.scw.cloud
|
endpoint: https://fsn1.your-objectstorage.com
|
||||||
region: fr-par
|
region: fsn1
|
||||||
path_style: true
|
path_style: true
|
||||||
strip_prefix: dist/os-packages/
|
strip_prefix: dist/os-packages/
|
||||||
source: dist/os-packages/*
|
source: dist/os-packages/*
|
||||||
@ -772,13 +772,13 @@ steps:
|
|||||||
image: plugins/s3
|
image: plugins/s3
|
||||||
pull: always
|
pull: always
|
||||||
settings:
|
settings:
|
||||||
bucket: vikunja-releases
|
bucket: vikunja
|
||||||
access_key:
|
access_key:
|
||||||
from_secret: aws_access_key_id
|
from_secret: hetzner_access_key_id
|
||||||
secret_key:
|
secret_key:
|
||||||
from_secret: aws_secret_access_key
|
from_secret: hetzner_secret_access_key
|
||||||
endpoint: https://s3.fr-par.scw.cloud
|
endpoint: https://fsn1.your-objectstorage.com
|
||||||
region: fr-par
|
region: fsn1
|
||||||
path_style: true
|
path_style: true
|
||||||
strip_prefix: dist/os-packages/
|
strip_prefix: dist/os-packages/
|
||||||
source: dist/os-packages/*
|
source: dist/os-packages/*
|
||||||
@ -929,13 +929,13 @@ steps:
|
|||||||
image: plugins/s3
|
image: plugins/s3
|
||||||
pull: always
|
pull: always
|
||||||
settings:
|
settings:
|
||||||
bucket: vikunja-releases
|
bucket: vikunja
|
||||||
access_key:
|
access_key:
|
||||||
from_secret: aws_access_key_id
|
from_secret: hetzner_access_key_id
|
||||||
secret_key:
|
secret_key:
|
||||||
from_secret: aws_secret_access_key
|
from_secret: hetzner_secret_access_key
|
||||||
endpoint: https://s3.fr-par.scw.cloud
|
endpoint: https://fsn1.your-objectstorage.com
|
||||||
region: fr-par
|
region: fsn1
|
||||||
path_style: true
|
path_style: true
|
||||||
source: frontend/vikunja-frontend-unstable.zip
|
source: frontend/vikunja-frontend-unstable.zip
|
||||||
target: /
|
target: /
|
||||||
@ -988,13 +988,13 @@ steps:
|
|||||||
image: plugins/s3
|
image: plugins/s3
|
||||||
pull: always
|
pull: always
|
||||||
settings:
|
settings:
|
||||||
bucket: vikunja-releases
|
bucket: vikunja
|
||||||
access_key:
|
access_key:
|
||||||
from_secret: aws_access_key_id
|
from_secret: hetzner_access_key_id
|
||||||
secret_key:
|
secret_key:
|
||||||
from_secret: aws_secret_access_key
|
from_secret: hetzner_secret_access_key
|
||||||
endpoint: https://s3.fr-par.scw.cloud
|
endpoint: https://fsn1.your-objectstorage.com
|
||||||
region: fr-par
|
region: fsn1
|
||||||
path_style: true
|
path_style: true
|
||||||
source: frontend/vikunja-frontend-${DRONE_TAG##v}.zip
|
source: frontend/vikunja-frontend-${DRONE_TAG##v}.zip
|
||||||
target: /
|
target: /
|
||||||
@ -1093,8 +1093,8 @@ steps:
|
|||||||
# settings:
|
# settings:
|
||||||
# restore: true
|
# restore: true
|
||||||
# bucket: kolaente.dev-drone-dependency-cache
|
# bucket: kolaente.dev-drone-dependency-cache
|
||||||
# endpoint: https://s3.fr-par.scw.cloud
|
# endpoint: https://fsn1.your-objectstorage.com
|
||||||
# region: fr-par
|
# region: fsn1
|
||||||
# path_style: true
|
# path_style: true
|
||||||
# cache_key: '{{ .Repo.Name }}_{{ checksum "desktop/yarn.lock" }}_{{ arch }}_{{ os }}'
|
# cache_key: '{{ .Repo.Name }}_{{ checksum "desktop/yarn.lock" }}_{{ arch }}_{{ os }}'
|
||||||
# mount:
|
# mount:
|
||||||
@ -1131,8 +1131,8 @@ steps:
|
|||||||
# settings:
|
# settings:
|
||||||
# rebuild: true
|
# rebuild: true
|
||||||
# bucket: kolaente.dev-drone-dependency-cache
|
# bucket: kolaente.dev-drone-dependency-cache
|
||||||
# endpoint: https://s3.fr-par.scw.cloud
|
# endpoint: https://fsn1.your-objectstorage.com
|
||||||
# region: fr-par
|
# region: fsn1
|
||||||
# path_style: true
|
# path_style: true
|
||||||
# cache_key: '{{ .Repo.Name }}_{{ checksum "desktop/yarn.lock" }}_{{ arch }}_{{ os }}'
|
# cache_key: '{{ .Repo.Name }}_{{ checksum "desktop/yarn.lock" }}_{{ arch }}_{{ os }}'
|
||||||
# mount:
|
# mount:
|
||||||
@ -1174,8 +1174,8 @@ steps:
|
|||||||
# settings:
|
# settings:
|
||||||
# restore: true
|
# restore: true
|
||||||
# bucket: kolaente.dev-drone-dependency-cache
|
# bucket: kolaente.dev-drone-dependency-cache
|
||||||
# endpoint: https://s3.fr-par.scw.cloud
|
# endpoint: https://fsn1.your-objectstorage.com
|
||||||
# region: fr-par
|
# region: fsn1
|
||||||
# path_style: true
|
# path_style: true
|
||||||
# cache_key: '{{ .Repo.Name }}_{{ checksum "desktop/yarn.lock" }}_{{ arch }}_{{ os }}'
|
# cache_key: '{{ .Repo.Name }}_{{ checksum "desktop/yarn.lock" }}_{{ arch }}_{{ os }}'
|
||||||
# mount:
|
# mount:
|
||||||
@ -1198,30 +1198,30 @@ steps:
|
|||||||
- unzip vikunja-frontend-$$VERSION.zip -d frontend
|
- unzip vikunja-frontend-$$VERSION.zip -d frontend
|
||||||
- sed -i 's/\\/api\\/v1//g' frontend/index.html
|
- sed -i 's/\\/api\\/v1//g' frontend/index.html
|
||||||
- ./bumpp.sh
|
- ./bumpp.sh
|
||||||
- yarn install
|
- corepack enable && pnpm config set store-dir .cache/pnpm
|
||||||
- cat package.json
|
- pnpm install --fetch-timeout 100000
|
||||||
- yarn dist --linux --windows
|
- pnpm dist --linux --windows
|
||||||
|
|
||||||
# - name: rebuild-cache
|
|
||||||
# image: meltwater/drone-cache:dev
|
|
||||||
# pull: true
|
|
||||||
# environment:
|
|
||||||
# AWS_ACCESS_KEY_ID:
|
|
||||||
# from_secret: cache_aws_access_key_id
|
|
||||||
# AWS_SECRET_ACCESS_KEY:
|
|
||||||
# from_secret: cache_aws_secret_access_key
|
|
||||||
# settings:
|
|
||||||
# rebuild: true
|
|
||||||
# bucket: kolaente.dev-drone-dependency-cache
|
|
||||||
# endpoint: https://s3.fr-par.scw.cloud
|
|
||||||
# region: fr-par
|
|
||||||
# path_style: true
|
|
||||||
# cache_key: '{{ .Repo.Name }}_{{ checksum "desktop/yarn.lock" }}_{{ arch }}_{{ os }}'
|
|
||||||
# mount:
|
|
||||||
# - '.cache'
|
|
||||||
# depends_on:
|
|
||||||
# - build
|
|
||||||
|
|
||||||
|
# - name: rebuild-cache
|
||||||
|
# image: meltwater/drone-cache:dev
|
||||||
|
# pull: true
|
||||||
|
# environment:
|
||||||
|
# AWS_ACCESS_KEY_ID:
|
||||||
|
# from_secret: cache_aws_access_key_id
|
||||||
|
# AWS_SECRET_ACCESS_KEY:
|
||||||
|
# from_secret: cache_aws_secret_access_key
|
||||||
|
# settings:
|
||||||
|
# rebuild: true
|
||||||
|
# bucket: kolaente.dev-drone-dependency-cache
|
||||||
|
# endpoint: https://fsn1.your-objectstorage.com
|
||||||
|
# region: fsn1
|
||||||
|
# path_style: true
|
||||||
|
# cache_key: '{{ .Repo.Name }}_{{ checksum "desktop/yarn.lock" }}_{{ arch }}_{{ os }}'
|
||||||
|
# mount:
|
||||||
|
# - '.cache'
|
||||||
|
# depends_on:
|
||||||
|
# - build
|
||||||
|
|
||||||
- name: rename-unstable
|
- name: rename-unstable
|
||||||
image: bash
|
image: bash
|
||||||
pull: true
|
pull: true
|
||||||
@ -1239,13 +1239,13 @@ steps:
|
|||||||
image: plugins/s3
|
image: plugins/s3
|
||||||
pull: true
|
pull: true
|
||||||
settings:
|
settings:
|
||||||
bucket: vikunja-releases
|
bucket: vikunja
|
||||||
access_key:
|
access_key:
|
||||||
from_secret: aws_access_key_id
|
from_secret: hetzner_access_key_id
|
||||||
secret_key:
|
secret_key:
|
||||||
from_secret: aws_secret_access_key
|
from_secret: hetzner_secret_access_key
|
||||||
endpoint: https://s3.fr-par.scw.cloud
|
endpoint: https://fsn1.your-objectstorage.com
|
||||||
region: fr-par
|
region: fsn1
|
||||||
path_style: true
|
path_style: true
|
||||||
strip_prefix: desktop/dist/
|
strip_prefix: desktop/dist/
|
||||||
source: desktop/dist/Vikunja-Desktop*
|
source: desktop/dist/Vikunja-Desktop*
|
||||||
@ -1261,13 +1261,13 @@ steps:
|
|||||||
image: plugins/s3
|
image: plugins/s3
|
||||||
pull: true
|
pull: true
|
||||||
settings:
|
settings:
|
||||||
bucket: vikunja-releases
|
bucket: vikunja
|
||||||
access_key:
|
access_key:
|
||||||
from_secret: aws_access_key_id
|
from_secret: hetzner_access_key_id
|
||||||
secret_key:
|
secret_key:
|
||||||
from_secret: aws_secret_access_key
|
from_secret: hetzner_secret_access_key
|
||||||
endpoint: https://s3.fr-par.scw.cloud
|
endpoint: https://fsn1.your-objectstorage.com
|
||||||
region: fr-par
|
region: fsn1
|
||||||
path_style: true
|
path_style: true
|
||||||
strip_prefix: desktop/dist/
|
strip_prefix: desktop/dist/
|
||||||
source: desktop/dist/*
|
source: desktop/dist/*
|
||||||
@ -1296,9 +1296,9 @@ steps:
|
|||||||
# - name: build
|
# - name: build
|
||||||
# environment:
|
# environment:
|
||||||
# ACCESS_KEY:
|
# ACCESS_KEY:
|
||||||
# from_secret: aws_access_key_id
|
# from_secret: hetzner_access_key_id
|
||||||
# SECRET_KEY:
|
# SECRET_KEY:
|
||||||
# from_secret: aws_secret_access_key
|
# from_secret: hetzner_secret_access_key
|
||||||
# commands:
|
# commands:
|
||||||
# - git fetch --tags
|
# - git fetch --tags
|
||||||
# - export VERSION=${DRONE_TAG##v}
|
# - export VERSION=${DRONE_TAG##v}
|
||||||
@ -1311,9 +1311,9 @@ steps:
|
|||||||
# - sed -i '' "s/\$${version}/$$VERSION/g" package.json
|
# - sed -i '' "s/\$${version}/$$VERSION/g" package.json
|
||||||
# - yarn install
|
# - yarn install
|
||||||
# - yarn dist --mac
|
# - yarn dist --mac
|
||||||
# - mc config host add scw-fr-par https://s3.fr-par.scw.cloud $ACCESS_KEY $SECRET_KEY --api S3v4
|
# - mc config host add scw-fsn1 https://fsn1.your-objectstorage.com $ACCESS_KEY $SECRET_KEY --api S3v4
|
||||||
# - mc cp ./dist/*.dmg scw-fr-par/vikunja-releases/desktop/$VERSION/
|
# - mc cp ./dist/*.dmg scw-fsn1/vikunja/desktop/$VERSION/
|
||||||
# - mc cp ./dist/*.dmg.blockmap scw-fr-par/vikunja-releases/desktop/$VERSION/
|
# - mc cp ./dist/*.dmg.blockmap scw-fsn1/vikunja/desktop/$VERSION/
|
||||||
|
|
||||||
---
|
---
|
||||||
kind: pipeline
|
kind: pipeline
|
||||||
@ -1350,6 +1350,6 @@ steps:
|
|||||||
- failure
|
- failure
|
||||||
---
|
---
|
||||||
kind: signature
|
kind: signature
|
||||||
hmac: a06d088bd62507aeb2be9cd4bfcd313bdc6fe0629b82816bef81770f8a34a3ef
|
hmac: 02fb3097f3e50facb2579de5c3b94e513b97e535a049a28ddb67f85e494d65b1
|
||||||
|
|
||||||
...
|
...
|
||||||
|
16
CHANGELOG.md
16
CHANGELOG.md
@ -7,6 +7,22 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|||||||
|
|
||||||
All releases can be found on https://code.vikunja.io/vikunja/releases.
|
All releases can be found on https://code.vikunja.io/vikunja/releases.
|
||||||
|
|
||||||
|
## [0.24.6] - 2024-12-22
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* *(export)* Update only current user export file id
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* Use hetzner object storage for releases ([3f98f47](3f98f47256628ac559a947f6c9541c0bf03001b6))
|
||||||
|
|
||||||
|
### Miscellaneous Tasks
|
||||||
|
|
||||||
|
* Release preparation ([17b2810](17b281072f095730a0fbb28458d713fa883f43ec))
|
||||||
|
* Sign drone config ([b91a5d9](b91a5d9adfb7144126f5824224970ad4015dcd6a))
|
||||||
|
* Do not generate config yaml ([8c28596](8c285968afff7ebd087ce824b52b0a9f28a8ec20))
|
||||||
|
|
||||||
## [0.24.5] - 2024-11-21
|
## [0.24.5] - 2024-11-21
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
[](https://drone.kolaente.de/vikunja/vikunja)
|
[](https://drone.kolaente.de/vikunja/vikunja)
|
||||||
[](LICENSE)
|
[](LICENSE)
|
||||||
[](https://vikunja.io/docs/installing)
|
[](https://vikunja.io/docs/installing)
|
||||||
[](https://hub.docker.com/r/vikunja/vikunja/)
|
[](https://hub.docker.com/r/vikunja/vikunja/)
|
||||||
[](https://try.vikunja.io/api/v1/docs)
|
[](https://try.vikunja.io/api/v1/docs)
|
||||||
[](https://goreportcard.com/report/kolaente.dev/vikunja/vikunja)
|
[](https://goreportcard.com/report/kolaente.dev/vikunja/vikunja)
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -73,29 +73,29 @@ export default class NotificationModel extends AbstractModel<INotification> impl
|
|||||||
|
|
||||||
switch (this.name) {
|
switch (this.name) {
|
||||||
case NOTIFICATION_NAMES.TASK_COMMENT:
|
case NOTIFICATION_NAMES.TASK_COMMENT:
|
||||||
return `commented on ${this.notification.task.getTextIdentifier()}`
|
return `comentó en ${this.notification.task.getTextIdentifier()}`
|
||||||
case NOTIFICATION_NAMES.TASK_ASSIGNED:
|
case NOTIFICATION_NAMES.TASK_ASSIGNED:
|
||||||
who = `${getDisplayName(this.notification.assignee)}`
|
who = `${getDisplayName(this.notification.assignee)}`
|
||||||
|
|
||||||
if (user !== null && user.id === this.notification.assignee.id) {
|
if (user !== null && user.id === this.notification.assignee.id) {
|
||||||
who = 'you'
|
who = 'tú'
|
||||||
}
|
}
|
||||||
|
|
||||||
return `assigned ${who} to ${this.notification.task.getTextIdentifier()}`
|
return `asignó ${who} a ${this.notification.task.getTextIdentifier()}`
|
||||||
case NOTIFICATION_NAMES.TASK_DELETED:
|
case NOTIFICATION_NAMES.TASK_DELETED:
|
||||||
return `deleted ${this.notification.task.getTextIdentifier()}`
|
return `eliminó ${this.notification.task.getTextIdentifier()}`
|
||||||
case NOTIFICATION_NAMES.PROJECT_CREATED:
|
case NOTIFICATION_NAMES.PROJECT_CREATED:
|
||||||
return `created ${this.notification.project.title}`
|
return `creó ${this.notification.project.title}`
|
||||||
case NOTIFICATION_NAMES.TEAM_MEMBER_ADDED:
|
case NOTIFICATION_NAMES.TEAM_MEMBER_ADDED:
|
||||||
who = `${getDisplayName(this.notification.member)}`
|
who = `${getDisplayName(this.notification.member)}`
|
||||||
|
|
||||||
if (user !== null && user.id === this.notification.member.id) {
|
if (user !== null && user.id === this.notification.member.id) {
|
||||||
who = 'you'
|
who = 'tú'
|
||||||
}
|
}
|
||||||
|
|
||||||
return `added ${who} to the ${this.notification.team.name} team`
|
return `te añadió ${who} a el equipo ${this.notification.team.name}`
|
||||||
case NOTIFICATION_NAMES.TASK_REMINDER:
|
case NOTIFICATION_NAMES.TASK_REMINDER:
|
||||||
return `Reminder for ${this.notification.task.getTextIdentifier()} ${this.notification.task.title} (${this.notification.project.title})`
|
return `Recordatorio para ${this.notification.task.getTextIdentifier()} ${this.notification.task.title} (${this.notification.project.title})`
|
||||||
}
|
}
|
||||||
|
|
||||||
return ''
|
return ''
|
||||||
|
@ -36,6 +36,7 @@ import (
|
|||||||
"code.vikunja.io/api/pkg/user"
|
"code.vikunja.io/api/pkg/user"
|
||||||
"code.vikunja.io/api/pkg/utils"
|
"code.vikunja.io/api/pkg/utils"
|
||||||
"code.vikunja.io/api/pkg/version"
|
"code.vikunja.io/api/pkg/version"
|
||||||
|
|
||||||
"xorm.io/xorm"
|
"xorm.io/xorm"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -106,7 +107,10 @@ func ExportUserData(s *xorm.Session, u *user.User) (err error) {
|
|||||||
|
|
||||||
// Save the file id with the user
|
// Save the file id with the user
|
||||||
u.ExportFileID = exportFile.ID
|
u.ExportFileID = exportFile.ID
|
||||||
_, err = s.Cols("export_file_id").Update(u)
|
_, err = s.
|
||||||
|
Where("id = ?", u.ID).
|
||||||
|
Cols("export_file_id").
|
||||||
|
Update(u)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -39,11 +39,11 @@ type ReminderDueNotification struct {
|
|||||||
func (n *ReminderDueNotification) ToMail() *notifications.Mail {
|
func (n *ReminderDueNotification) ToMail() *notifications.Mail {
|
||||||
return notifications.NewMail().
|
return notifications.NewMail().
|
||||||
To(n.User.Email).
|
To(n.User.Email).
|
||||||
Subject(`Reminder for "`+n.Task.Title+`" (`+n.Project.Title+`)`).
|
Subject(`Recordatorio para "`+n.Task.Title+`" (`+n.Project.Title+`)`).
|
||||||
Greeting("Hi "+n.User.GetName()+",").
|
Greeting("Hola "+n.User.GetName()+",").
|
||||||
Line(`This is a friendly reminder of the task "`+n.Task.Title+`" (`+n.Project.Title+`).`).
|
Line(`Este es un amigable recordatorio de la tarea "`+n.Task.Title+`" (`+n.Project.Title+`).`).
|
||||||
Action("Open Task", config.ServicePublicURL.GetString()+"tasks/"+strconv.FormatInt(n.Task.ID, 10)).
|
Action("Abrir Tarea", config.ServicePublicURL.GetString()+"tasks/"+strconv.FormatInt(n.Task.ID, 10)).
|
||||||
Line("Have a nice day!")
|
Line("¡Qué tengas un buen día!")
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToDB returns the ReminderDueNotification notification in a format which can be saved in the db
|
// ToDB returns the ReminderDueNotification notification in a format which can be saved in the db
|
||||||
@ -80,14 +80,14 @@ func (n *TaskCommentNotification) ToMail() *notifications.Mail {
|
|||||||
|
|
||||||
if n.Mentioned {
|
if n.Mentioned {
|
||||||
mail.
|
mail.
|
||||||
Line("**" + n.Doer.GetName() + "** mentioned you in a comment:").
|
Line("**" + n.Doer.GetName() + "** te mencionó en un comentario:").
|
||||||
Subject(n.Doer.GetName() + ` mentioned you in a comment in "` + n.Task.Title + `"`)
|
Subject(n.Doer.GetName() + ` the mencionó en un comentario de la tarea "` + n.Task.Title + `"`)
|
||||||
}
|
}
|
||||||
|
|
||||||
mail.HTML(n.Comment.Comment)
|
mail.HTML(n.Comment.Comment)
|
||||||
|
|
||||||
return mail.
|
return mail.
|
||||||
Action("View Task", n.Task.GetFrontendURL())
|
Action("Ver Tarea", n.Task.GetFrontendURL())
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToDB returns the TaskCommentNotification notification in a format which can be saved in the db
|
// ToDB returns the TaskCommentNotification notification in a format which can be saved in the db
|
||||||
@ -112,15 +112,15 @@ type TaskAssignedNotification struct {
|
|||||||
func (n *TaskAssignedNotification) ToMail() *notifications.Mail {
|
func (n *TaskAssignedNotification) ToMail() *notifications.Mail {
|
||||||
if n.Target.ID == n.Assignee.ID {
|
if n.Target.ID == n.Assignee.ID {
|
||||||
return notifications.NewMail().
|
return notifications.NewMail().
|
||||||
Subject("You have been assigned to "+n.Task.Title+"("+n.Task.GetFullIdentifier()+")").
|
Subject("Has sido asignado a "+n.Task.Title+"("+n.Task.GetFullIdentifier()+")").
|
||||||
Line(n.Doer.GetName()+" has assigned you to "+n.Task.Title+".").
|
Line(n.Doer.GetName()+" te ha asignado a la tarea "+n.Task.Title+".").
|
||||||
Action("View Task", n.Task.GetFrontendURL())
|
Action("Ver Tarea", n.Task.GetFrontendURL())
|
||||||
}
|
}
|
||||||
|
|
||||||
return notifications.NewMail().
|
return notifications.NewMail().
|
||||||
Subject(n.Task.Title+"("+n.Task.GetFullIdentifier()+")"+" has been assigned to "+n.Assignee.GetName()).
|
Subject(n.Task.Title+"("+n.Task.GetFullIdentifier()+")"+" ha sido asignado a "+n.Assignee.GetName()).
|
||||||
Line(n.Doer.GetName()+" has assigned this task to "+n.Assignee.GetName()+".").
|
Line(n.Doer.GetName()+" ha asignado esta tarea a "+n.Assignee.GetName()+".").
|
||||||
Action("View Task", n.Task.GetFrontendURL())
|
Action("Ver Tarea", n.Task.GetFrontendURL())
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToDB returns the TaskAssignedNotification notification in a format which can be saved in the db
|
// ToDB returns the TaskAssignedNotification notification in a format which can be saved in the db
|
||||||
@ -142,8 +142,8 @@ type TaskDeletedNotification struct {
|
|||||||
// ToMail returns the mail notification for TaskDeletedNotification
|
// ToMail returns the mail notification for TaskDeletedNotification
|
||||||
func (n *TaskDeletedNotification) ToMail() *notifications.Mail {
|
func (n *TaskDeletedNotification) ToMail() *notifications.Mail {
|
||||||
return notifications.NewMail().
|
return notifications.NewMail().
|
||||||
Subject(n.Task.Title + " (" + n.Task.GetFullIdentifier() + ")" + " has been deleted").
|
Subject(n.Task.Title + " (" + n.Task.GetFullIdentifier() + ")" + " ha sido borrado").
|
||||||
Line(n.Doer.GetName() + " has deleted the task " + n.Task.Title + " (" + n.Task.GetFullIdentifier() + ")")
|
Line(n.Doer.GetName() + " ha borrado la tarea " + n.Task.Title + " (" + n.Task.GetFullIdentifier() + ")")
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToDB returns the TaskDeletedNotification notification in a format which can be saved in the db
|
// ToDB returns the TaskDeletedNotification notification in a format which can be saved in the db
|
||||||
@ -165,9 +165,9 @@ type ProjectCreatedNotification struct {
|
|||||||
// ToMail returns the mail notification for ProjectCreatedNotification
|
// ToMail returns the mail notification for ProjectCreatedNotification
|
||||||
func (n *ProjectCreatedNotification) ToMail() *notifications.Mail {
|
func (n *ProjectCreatedNotification) ToMail() *notifications.Mail {
|
||||||
return notifications.NewMail().
|
return notifications.NewMail().
|
||||||
Subject(n.Doer.GetName()+` created the project "`+n.Project.Title+`"`).
|
Subject(n.Doer.GetName()+` creó el proyecto "`+n.Project.Title+`"`).
|
||||||
Line(n.Doer.GetName()+` created the project "`+n.Project.Title+`"`).
|
Line(n.Doer.GetName()+` creó el proyecto "`+n.Project.Title+`"`).
|
||||||
Action("View Project", config.ServicePublicURL.GetString()+"projects/")
|
Action("Ver Proyecto", config.ServicePublicURL.GetString()+"projects/")
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToDB returns the ProjectCreatedNotification notification in a format which can be saved in the db
|
// ToDB returns the ProjectCreatedNotification notification in a format which can be saved in the db
|
||||||
@ -190,11 +190,11 @@ type TeamMemberAddedNotification struct {
|
|||||||
// ToMail returns the mail notification for TeamMemberAddedNotification
|
// ToMail returns the mail notification for TeamMemberAddedNotification
|
||||||
func (n *TeamMemberAddedNotification) ToMail() *notifications.Mail {
|
func (n *TeamMemberAddedNotification) ToMail() *notifications.Mail {
|
||||||
return notifications.NewMail().
|
return notifications.NewMail().
|
||||||
Subject(n.Doer.GetName()+" added you to the "+n.Team.Name+" team in Vikunja").
|
Subject(n.Doer.GetName()+" te añadió al equipo "+n.Team.Name).
|
||||||
From(n.Doer.GetNameAndFromEmail()).
|
From(n.Doer.GetNameAndFromEmail()).
|
||||||
Greeting("Hi "+n.Member.GetName()+",").
|
Greeting("Hi "+n.Member.GetName()+",").
|
||||||
Line(n.Doer.GetName()+" has just added you to the "+n.Team.Name+" team in Vikunja.").
|
Line(n.Doer.GetName()+" te acaba de añadir al equipo "+n.Team.Name+".").
|
||||||
Action("View Team", config.ServicePublicURL.GetString()+"teams/"+strconv.FormatInt(n.Team.ID, 10)+"/edit")
|
Action("Ver Equipo", config.ServicePublicURL.GetString()+"teams/"+strconv.FormatInt(n.Team.ID, 10)+"/edit")
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToDB returns the TeamMemberAddedNotification notification in a format which can be saved in the db
|
// ToDB returns the TeamMemberAddedNotification notification in a format which can be saved in the db
|
||||||
@ -218,11 +218,11 @@ type UndoneTaskOverdueNotification struct {
|
|||||||
func (n *UndoneTaskOverdueNotification) ToMail() *notifications.Mail {
|
func (n *UndoneTaskOverdueNotification) ToMail() *notifications.Mail {
|
||||||
until := time.Until(n.Task.DueDate).Round(1*time.Hour) * -1
|
until := time.Until(n.Task.DueDate).Round(1*time.Hour) * -1
|
||||||
return notifications.NewMail().
|
return notifications.NewMail().
|
||||||
Subject(`Task "`+n.Task.Title+`" (`+n.Project.Title+`) is overdue`).
|
Subject(`La tarea "`+n.Task.Title+`" (`+n.Project.Title+`) está vencida`).
|
||||||
Greeting("Hi "+n.User.GetName()+",").
|
Greeting("Hola "+n.User.GetName()+",").
|
||||||
Line(`This is a friendly reminder of the task "`+n.Task.Title+`" (`+n.Project.Title+`) which is overdue since `+utils.HumanizeDuration(until)+` and not yet done.`).
|
Line(`Este es un recordatorio amigable de que la tarea "`+n.Task.Title+`" (`+n.Project.Title+`) está vencida desde `+utils.HumanizeDuration(until)+` y aún no está completada.`).
|
||||||
Action("Open Task", config.ServicePublicURL.GetString()+"tasks/"+strconv.FormatInt(n.Task.ID, 10)).
|
Action("Abrir Tarea", config.ServicePublicURL.GetString()+"tasks/"+strconv.FormatInt(n.Task.ID, 10)).
|
||||||
Line("Have a nice day!")
|
Line("¡Qué tengas un buen día!")
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToDB returns the UndoneTaskOverdueNotification notification in a format which can be saved in the db
|
// ToDB returns the UndoneTaskOverdueNotification notification in a format which can be saved in the db
|
||||||
@ -257,16 +257,16 @@ func (n *UndoneTasksOverdueNotification) ToMail() *notifications.Mail {
|
|||||||
overdueLine := ""
|
overdueLine := ""
|
||||||
for _, task := range sortedTasks {
|
for _, task := range sortedTasks {
|
||||||
until := time.Until(task.DueDate).Round(1*time.Hour) * -1
|
until := time.Until(task.DueDate).Round(1*time.Hour) * -1
|
||||||
overdueLine += `* [` + task.Title + `](` + config.ServicePublicURL.GetString() + "tasks/" + strconv.FormatInt(task.ID, 10) + `) (` + n.Projects[task.ProjectID].Title + `), overdue since ` + utils.HumanizeDuration(until) + "\n"
|
overdueLine += `* [` + task.Title + `](` + config.ServicePublicURL.GetString() + "tasks/" + strconv.FormatInt(task.ID, 10) + `) (` + n.Projects[task.ProjectID].Title + `), vencida desde ` + utils.HumanizeDuration(until) + "\n"
|
||||||
}
|
}
|
||||||
|
|
||||||
return notifications.NewMail().
|
return notifications.NewMail().
|
||||||
Subject(`Your overdue tasks`).
|
Subject(`Tus tareas vencidas`).
|
||||||
Greeting("Hi "+n.User.GetName()+",").
|
Greeting("Hola "+n.User.GetName()+",").
|
||||||
Line("You have the following overdue tasks:").
|
Line("Tienes las siguientes tareas vencidas:").
|
||||||
Line(overdueLine).
|
Line(overdueLine).
|
||||||
Action("Open Vikunja", config.ServicePublicURL.GetString()).
|
Action("Abrir Tareas", config.ServicePublicURL.GetString()).
|
||||||
Line("Have a nice day!")
|
Line("¡Qué tengas un buen día!")
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToDB returns the UndoneTasksOverdueNotification notification in a format which can be saved in the db
|
// ToDB returns the UndoneTasksOverdueNotification notification in a format which can be saved in the db
|
||||||
@ -292,19 +292,19 @@ func (n *UserMentionedInTaskNotification) SubjectID() int64 {
|
|||||||
|
|
||||||
// ToMail returns the mail notification for UserMentionedInTaskNotification
|
// ToMail returns the mail notification for UserMentionedInTaskNotification
|
||||||
func (n *UserMentionedInTaskNotification) ToMail() *notifications.Mail {
|
func (n *UserMentionedInTaskNotification) ToMail() *notifications.Mail {
|
||||||
subject := n.Doer.GetName() + ` mentioned you in a new task "` + n.Task.Title + `"`
|
subject := n.Doer.GetName() + ` te mencionó en la nueva tarea "` + n.Task.Title + `"`
|
||||||
if n.IsNew {
|
if n.IsNew {
|
||||||
subject = n.Doer.GetName() + ` mentioned you in a task "` + n.Task.Title + `"`
|
subject = n.Doer.GetName() + ` te mencionó en la tarea "` + n.Task.Title + `"`
|
||||||
}
|
}
|
||||||
|
|
||||||
mail := notifications.NewMail().
|
mail := notifications.NewMail().
|
||||||
From(n.Doer.GetNameAndFromEmail()).
|
From(n.Doer.GetNameAndFromEmail()).
|
||||||
Subject(subject).
|
Subject(subject).
|
||||||
Line("**" + n.Doer.GetName() + "** mentioned you in a task:").
|
Line("**" + n.Doer.GetName() + "** te mencionó en la tarea:").
|
||||||
HTML(n.Task.Description)
|
HTML(n.Task.Description)
|
||||||
|
|
||||||
return mail.
|
return mail.
|
||||||
Action("View Task", n.Task.GetFrontendURL())
|
Action("Ver Tarea", n.Task.GetFrontendURL())
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToDB returns the UserMentionedInTaskNotification notification in a format which can be saved in the db
|
// ToDB returns the UserMentionedInTaskNotification notification in a format which can be saved in the db
|
||||||
@ -325,12 +325,12 @@ type DataExportReadyNotification struct {
|
|||||||
// ToMail returns the mail notification for DataExportReadyNotification
|
// ToMail returns the mail notification for DataExportReadyNotification
|
||||||
func (n *DataExportReadyNotification) ToMail() *notifications.Mail {
|
func (n *DataExportReadyNotification) ToMail() *notifications.Mail {
|
||||||
return notifications.NewMail().
|
return notifications.NewMail().
|
||||||
Subject("Your Vikunja Data Export is ready").
|
Subject("Tus datos exportados están listos").
|
||||||
Greeting("Hi "+n.User.GetName()+",").
|
Greeting("Hola "+n.User.GetName()+",").
|
||||||
Line("Your Vikunja Data Export is ready for you to download. Click the button below to download it:").
|
Line("Tus datos exportados están listos para descargar. Oprime el siguiente botón para descargarlos:").
|
||||||
Action("Download", config.ServicePublicURL.GetString()+"user/export/download").
|
Action("Descargar", config.ServicePublicURL.GetString()+"user/export/download").
|
||||||
Line("The download will be available for the next 7 days.").
|
Line("La descarga estará disponible por los siguientes 7 días.").
|
||||||
Line("Have a nice day!")
|
Line("¡Qué tengas un buen día!")
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToDB returns the DataExportReadyNotification notification in a format which can be saved in the db
|
// ToDB returns the DataExportReadyNotification notification in a format which can be saved in the db
|
||||||
|
@ -77,7 +77,7 @@ const mailTemplateHTML = `
|
|||||||
|
|
||||||
{{ if .ActionURL }}
|
{{ if .ActionURL }}
|
||||||
<p style="color: #9CA3AF;font-size:12px;border-top: 1px solid #dbdbdb;margin-top:20px;padding-top:20px;">
|
<p style="color: #9CA3AF;font-size:12px;border-top: 1px solid #dbdbdb;margin-top:20px;padding-top:20px;">
|
||||||
If the button above doesn't work, copy the url below and paste it in your browser's address bar:<br/>
|
Si el botón de arriba no funciona, copia el enlace de abajo y pégalo en la barra de búsqueda de tu navegador:<br/>
|
||||||
{{ .ActionURL }}
|
{{ .ActionURL }}
|
||||||
</p>
|
</p>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user