diff --git a/.copier-answers.yml b/.copier-answers.yml
index 3eaec745a8..fa5101156b 100644
--- a/.copier-answers.yml
+++ b/.copier-answers.yml
@@ -1,5 +1,5 @@
# Do NOT update manually; changes here will be overwritten by Copier
-_commit: v1.14.2
+_commit: v1.15.0
_src_path: https://github.com/OCA/oca-addons-repo-template.git
ci: GitHub
dependency_installation_mode: PIP
@@ -11,6 +11,7 @@ github_enable_makepot: true
github_enable_stale_action: true
github_enforce_dev_status_compatibility: true
include_wkhtmltopdf: false
+odoo_test_flavor: OCB
odoo_version: 12.0
org_name: Odoo Community Association (OCA)
org_slug: OCA
diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml
index f86d418269..6d54b60f45 100644
--- a/.github/workflows/pre-commit.yml
+++ b/.github/workflows/pre-commit.yml
@@ -13,7 +13,7 @@ jobs:
pre-commit:
runs-on: ubuntu-20.04
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- uses: actions/setup-python@v2
with:
python-version: "3.6"
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 20bf055d40..ba6443d81e 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest
name: Detect unreleased dependencies
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- run: |
for reqfile in requirements.txt test-requirements.txt ; do
if [ -f ${reqfile} ] ; then
@@ -35,11 +35,9 @@ jobs:
fail-fast: false
matrix:
include:
- - container: ghcr.io/oca/oca-ci/py3.6-odoo12.0:latest
- makepot: "true"
- name: test with Odoo
- container: ghcr.io/oca/oca-ci/py3.6-ocb12.0:latest
name: test with OCB
+ makepot: "true"
services:
postgres:
image: postgres:9.6
@@ -50,7 +48,7 @@ jobs:
ports:
- 5432:5432
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
with:
persist-credentials: false
- name: Install addons and dependencies
diff --git a/report_async/models/ir_report.py b/report_async/models/ir_report.py
index e70988bdd8..ad8df751f8 100644
--- a/report_async/models/ir_report.py
+++ b/report_async/models/ir_report.py
@@ -3,26 +3,24 @@
from odoo import api, models
-
# Define all supported report_type
-REPORT_TYPES = ['qweb-pdf', 'qweb-text',
- 'qweb-xml', 'csv',
- 'excel', 'xlsx']
+REPORT_TYPES = ["qweb-pdf", "qweb-text", "qweb-xml", "csv", "excel", "xlsx"]
class Report(models.Model):
- _inherit = 'ir.actions.report'
+ _inherit = "ir.actions.report"
@api.noguess
def report_action(self, docids, data=None, config=True):
- res = super(Report, self).report_action(docids, data=data,
- config=config)
- if res['context'].get('async_process', False):
- rpt_async_id = res['context']['active_id']
- report_async = self.env['report.async'].browse(rpt_async_id)
- if res['report_type'] in REPORT_TYPES:
- report_async.with_delay().run_report(
- res['context'].get('active_ids', []), data,
- self.id, self._uid)
+ res = super(Report, self).report_action(docids, data=data, config=config)
+ if res["context"].get("async_process", False):
+ rpt_async_id = res["context"]["active_id"]
+ report_async = self.env["report.async"].browse(rpt_async_id)
+ if res["report_type"] in REPORT_TYPES:
+ report_async.with_delay(
+ eta=res["context"].get("eta", False)
+ ).run_report(
+ res["context"].get("active_ids", []), data, self.id, self._uid
+ )
return {}
return res
diff --git a/report_async/models/report_async.py b/report_async/models/report_async.py
index 376acc71c2..b5925abc53 100644
--- a/report_async/models/report_async.py
+++ b/report_async/models/report_async.py
@@ -2,6 +2,7 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html)
import base64
+from datetime import datetime, timedelta
from odoo import api, fields, models, _
from odoo.tools.safe_eval import safe_eval
from odoo.exceptions import UserError
@@ -70,6 +71,8 @@ class ReportAsync(models.Model):
help="List all files created by this report background process",
)
+ schedule_time = fields.Char(string='Schedule time')
+
@api.multi
def _compute_job(self):
for rec in self:
@@ -110,6 +113,8 @@ def run_async(self):
result = action.read()[0]
ctx = safe_eval(result.get('context', {}))
ctx.update({'async_process': True})
+ if self.schedule_time:
+ ctx.update({'eta': self._get_next_schedule_time()})
result['context'] = ctx
return result
@@ -160,3 +165,11 @@ def _send_email(self, attachment):
template.send_mail(attachment.id,
notif_layout='mail.mail_notification_light',
force_send=False)
+
+ def _get_next_schedule_time(self):
+ target_time = datetime.strptime(self.schedule_time, "%H:%M").time()
+ now = fields.Datetime.now()
+ target_datetime = datetime.combine(now.date(), target_time)
+ if now.time() > target_time:
+ target_datetime += timedelta(days=1)
+ return target_datetime
diff --git a/report_async/views/report_async.xml b/report_async/views/report_async.xml
index f6d5f58f14..cbf6deaff0 100644
--- a/report_async/views/report_async.xml
+++ b/report_async/views/report_async.xml
@@ -73,6 +73,8 @@
+