diff --git a/mail_activity_team/__manifest__.py b/mail_activity_team/__manifest__.py index 453f33b82..9125afcac 100644 --- a/mail_activity_team/__manifest__.py +++ b/mail_activity_team/__manifest__.py @@ -19,8 +19,5 @@ "views/mail_activity_views.xml", "views/res_users_views.xml", ], - - 'qweb': [ - 'static/src/xml/systray.xml', - ], + "qweb": ["static/src/xml/systray.xml"], } diff --git a/mail_activity_team/models/__init__.py b/mail_activity_team/models/__init__.py index 5daf721d0..a3143d508 100644 --- a/mail_activity_team/models/__init__.py +++ b/mail_activity_team/models/__init__.py @@ -2,4 +2,3 @@ from . import mail_activity_team from . import mail_activity from . import mail_activity_mixin from . import res_users -from . import mail_activity_mixin diff --git a/mail_activity_team/models/mail_activity_mixin.py b/mail_activity_team/models/mail_activity_mixin.py index 6cc25c5a6..d9215cebd 100644 --- a/mail_activity_team/models/mail_activity_mixin.py +++ b/mail_activity_team/models/mail_activity_mixin.py @@ -1,13 +1,14 @@ # Copyright 2021 Tecnativa - David Vidal # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from odoo import api, models, fields +from odoo import api, fields, models class MailActivityMixin(models.AbstractModel): _inherit = "mail.activity.mixin" activity_team_user_ids = fields.Many2many( - comodel_name='res.users', string='test field', + comodel_name="res.users", + string="test field", compute="_compute_activity_team_user_ids", search="_search_activity_team_user_ids", ) @@ -15,12 +16,11 @@ class MailActivityMixin(models.AbstractModel): @api.depends("activity_ids") def _compute_activity_team_user_ids(self): for rec in self: - rec.activity_team_user_ids = rec.activity_ids.mapped( - "team_id.member_ids") + rec.activity_team_user_ids = rec.activity_ids.mapped("team_id.member_ids") @api.model def _search_activity_team_user_ids(self, operator, operand): - return [('activity_ids.team_id.member_ids', operator, operand)] + return [("activity_ids.team_id.member_ids", operator, operand)] def activity_schedule( self, act_type_xmlid="", date_deadline=None, summary="", note="", **act_values diff --git a/mail_activity_team/models/res_users.py b/mail_activity_team/models/res_users.py index 2f30d3406..6d881cc18 100644 --- a/mail_activity_team/models/res_users.py +++ b/mail_activity_team/models/res_users.py @@ -1,6 +1,6 @@ # Copyright 2018 ForgeFlow, S.L. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). -from odoo import models, fields, api, modules +from odoo import api, fields, models, modules class ResUsers(models.Model): @@ -13,9 +13,9 @@ class ResUsers(models.Model): ) @api.model - def activity_user_count(self, user_id=False): - if not self._context.get('team_activities', False): - return super().activity_user_count() + def systray_get_activities(self): + if not self._context.get("team_activities", False): + return super().systray_get_activities() query = """SELECT m.id, count(*), act.res_model as model, CASE WHEN %(today)s::date - @@ -35,35 +35,40 @@ class ResUsers(models.Model): ) GROUP BY m.id, states, act.res_model, act.user_id; """ - user = user_id if user_id else self.env.uid - self.env.cr.execute(query, { - 'today': fields.Date.context_today(self), - 'user_id': user, - }) + user = self.env.uid + self.env.cr.execute( + query, {"today": fields.Date.context_today(self), "user_id": user} + ) activity_data = self.env.cr.dictfetchall() - model_ids = [a['id'] for a in activity_data] - model_names = {n[0]: n[1] for n in - self.env['ir.model'].browse(model_ids).name_get()} + model_ids = [a["id"] for a in activity_data] + model_names = { + n[0]: n[1] for n in self.env["ir.model"].browse(model_ids).name_get() + } user_activities = {} for activity in activity_data: - if not user_activities.get(activity['model']): - user_activities[activity['model']] = { - 'name': model_names[activity['id']], - 'model': activity['model'], - 'icon': modules.module.get_module_icon( - self.env[activity['model']]._original_module), - 'total_count': 0, 'today_count': 0, 'overdue_count': 0, - 'planned_count': 0, + if not user_activities.get(activity["model"]): + user_activities[activity["model"]] = { + "name": model_names[activity["id"]], + "model": activity["model"], + "type": "activity", + "icon": modules.module.get_module_icon( + self.env[activity["model"]]._original_module + ), + "total_count": 0, + "today_count": 0, + "overdue_count": 0, + "planned_count": 0, } - user_activities[activity['model']][ - '%s_count' % activity['states']] += activity['count'] - if activity['states'] in ('today', 'overdue'): - user_activities[activity['model']]['total_count'] += activity[ - 'count'] - if activity['user_id'] == user: - user_activities[ - activity['model'] - ]['total_count'] -= activity['count'] + user_activities[activity["model"]][ + "%s_count" % activity["states"] + ] += activity["count"] + if activity["states"] in ("today", "overdue"): + user_activities[activity["model"]]["total_count"] += activity["count"] + if activity["user_id"] == user and activity["states"] in ( + "today", + "overdue", + ): + user_activities[activity["model"]]["total_count"] -= activity["count"] return list(user_activities.values()) diff --git a/mail_activity_team/static/src/js/systray.js b/mail_activity_team/static/src/js/systray.js index 3a64a7be4..331b06e83 100644 --- a/mail_activity_team/static/src/js/systray.js +++ b/mail_activity_team/static/src/js/systray.js @@ -1,99 +1,108 @@ -odoo.define('mail_activity_team.systray', function (require) { +odoo.define("mail_activity_team.systray.ActivityMenu", function(require) { "use strict"; - var systray = require('mail.systray'); + var ActivityMenu = require("mail.systray.ActivityMenu"); var session = require("web.session"); - systray.ActivityMenu.include({ - events: _.extend({}, systray.ActivityMenu.prototype.events, { - 'click .o_filter_button': 'on_click_filter_button', + ActivityMenu.include({ + events: _.extend({}, ActivityMenu.prototype.events, { + "click .o_filter_button": "_onClickFilterButton", }), - start: function () { + start: function() { this._super.apply(this, arguments); - this.$filter_buttons = this.$('.o_filter_button'); + this.$filter_buttons = this.$(".o_filter_button"); this.$my_activities = this.$filter_buttons.first(); - this.filter = 'my'; + this.filter = "my"; session.user_context = _.extend({}, session.user_context, { - 'team_activities': false + team_activities: false, }); }, - _updateCounter: function (data) { - this._super.apply(this, arguments); - this.$('.o_new_notification_counter').text(this.activityCounter); + _updateCounter: function(data) { + this._super.apply(this, data); + this.$(".o_notification_counter").text(this.activityCounter); }, - on_click_filter_button: function (event) { + _onClickFilterButton: function(event) { var self = this; - event.stopPropagation(); - self.$filter_buttons.removeClass('active'); + self.$filter_buttons.removeClass("active"); var $target = $(event.currentTarget); - $target.addClass('active'); - self.filter = $target.data('filter'); + $target.addClass("active"); + self.filter = $target.data("filter"); session.user_context = _.extend({}, session.user_context, { - 'team_activities': self.filter === 'team' + team_activities: self.filter === "team", }); self._updateActivityPreview(); - }, - _onActivityFilterClick: function (event) { - if (this.filter === 'my') { + _onActivityFilterClick: function(event) { + if (this.filter === "my") { this._super.apply(this, arguments); } - if (this.filter === 'team') { + if (this.filter === "team") { var data = _.extend( {}, $(event.currentTarget).data(), $(event.target).data() ); var context = {}; - if (data.filter === 'my') { + if (data.filter === "my") { context.search_default_activities_overdue = 1; context.search_default_activities_today = 1; } else { - context['search_default_activities_' + data.filter] = 1; + context["search_default_activities_" + data.filter] = 1; } this.do_action({ - type: 'ir.actions.act_window', + type: "ir.actions.act_window", name: data.model_name, - res_model: data.res_model, - views: [[false, 'kanban'], [false, 'form']], + res_model: data.res_model, + views: [ + [false, "kanban"], + [false, "form"], + ], search_view_id: [false], - domain: [ - ['activity_team_user_ids', 'in', session.uid] - ], - context:context, + domain: [["activity_team_user_ids", "in", session.uid]], + context: context, }); } }, - _getActivityData: function(){ + _open_boards_activities_domain: function() { + if (this.filter === "team") { + return {additional_context: {search_default_my_team_activities: 1}}; + } + return this._super.apply(this, arguments); + }, + _getActivityData: function() { var self = this; - return self._super.apply(self, arguments).then(function (data) { + return self._super.apply(self, arguments).then(function() { session.user_context = _.extend({}, session.user_context, { - 'team_activities': !session.user_context['team_activities'], + team_activities: !session.user_context.team_activities, }); self._rpc({ - model: 'res.users', - method: 'activity_user_count', + model: "res.users", + method: "systray_get_activities", + args: [], kwargs: { context: session.user_context, }, - }).then(function (data) { - self.activityCounter += _.reduce(data, function( - total_count, p_data - ){ return total_count + p_data.total_count; }, 0); - self.$('.o_new_notification_counter').text(self.activityCounter); - self.$el.toggleClass('o_no_notification', !self.activityCounter); + }).then(function(data) { + self.activityCounter += _.reduce( + data, + function(total_count, p_data) { + return total_count + p_data.total_count || 0; + }, + 0 + ); + self.$(".o_notification_counter").text(self.activityCounter); + self.$el.toggleClass("o_no_notification", !self.activityCounter); session.user_context = _.extend({}, session.user_context, { - 'team_activities': !session.user_context['team_activities'], + team_activities: !session.user_context.team_activities, }); }); }); - } + }, }); - }); diff --git a/mail_activity_team/static/src/less/systray.less b/mail_activity_team/static/src/less/systray.less deleted file mode 100644 index 9690aef14..000000000 --- a/mail_activity_team/static/src/less/systray.less +++ /dev/null @@ -1,7 +0,0 @@ -.o_new_notification_counter { - .o-position-absolute(@top: 20%, @right: 1px); - background: @odoo-brand-optional; - color: white; - padding: 0em 0.3em; - font-size: 0.7em; -} diff --git a/mail_activity_team/static/src/xml/systray.xml b/mail_activity_team/static/src/xml/systray.xml index 868f31e50..1f96514f5 100644 --- a/mail_activity_team/static/src/xml/systray.xml +++ b/mail_activity_team/static/src/xml/systray.xml @@ -1,11 +1,21 @@ - +
- - + +
diff --git a/mail_activity_team/tests/test_mail_activity_team.py b/mail_activity_team/tests/test_mail_activity_team.py index 5f9e00c7e..e8f248e07 100644 --- a/mail_activity_team/tests/test_mail_activity_team.py +++ b/mail_activity_team/tests/test_mail_activity_team.py @@ -191,9 +191,10 @@ class TestMailActivityTeam(TransactionCase): self.assertEqual(activity.team_id, self.team2) def test_activity_count(self): - res = self.env['res.users'].with_context( - {'team_activities': True} - ).activity_user_count( - user_id=self.employee.id + res = ( + self.env["res.users"] + .sudo(self.employee.id) + .with_context({"team_activities": True}) + .systray_get_activities() ) - self.assertEqual(res[0]['total_count'], 0) + self.assertEqual(res[0]["total_count"], 0) diff --git a/mail_activity_team/views/assets_backend.xml b/mail_activity_team/views/assets_backend.xml index 51f10ca88..f5f3eeee0 100644 --- a/mail_activity_team/views/assets_backend.xml +++ b/mail_activity_team/views/assets_backend.xml @@ -1,10 +1,11 @@ - + -