`Q<*n@bjsKgMqBGNs$JxFytI$)E$+%TA0GNs!$(99>Tl&T%(pMMubbHA7A+K
zWkF*$WC$Y0`z}eYy`@$7R{^jbKh@4+tFS+EQ5L@9u$8=_S-FyB82<-Isr=Kjt;I!d
zDQ`QR1>=aU4|XFk9HlN)4rbKMeT{#V+Spz-_J;eRKg(cBJf5Zq*cSO<&_!=#EJtk6
zx6+Xu7frJvZjt^o+IKQ_hn50`vbOo+)=JWy-z8MEZR9Xd*rqwFm?=YcMLcs0Ii`I}
zj$3gZtGs=U`Glfnl7`1%=%HpQ7I{D{9c;~$Y@VE-R5QPFwz;auSpI~zQ(NXDv8=}r
zQdVQFSq^O$*iRkVWcB}}=>)X4L%E92z3}ID%j~K!jE)xq5-Mvpp`t$85A3%_Z`3U|
z_mfD+Z_U>vNs*6hk&PX})%6n%^A|QW)1+04wKP%r((^n?&XXKB8FM9azaNY)UY@_0x7Uvrd2Yker2@P*8^o9r@)VN14D=0#ZmhP{I^=G6Ud6%;*k02fl8|u`G0`mg0
zbwwjz1L(%`>S=wAwiFn7fKPeoLixCF1B1DbhK!MpvV*2^DMaxjO6P)u>=4%}!nKRh
zYXnML1|4z;L}fM4<_^a$$>~NqUwX9P+&$}$zw0u~w8XRY+cnBdpcg42D>W1T6{%Y*U|J?nqQC@Ju$M4~q)PoHwr*NY|Oo!U_cUq)QE9WxIt7
zu`}SIkE2V`tV*2-a;&yp(HjW}We~mOIq_K0sdcih=M5qN5ToT3Ul^Z?dE&8g>n%Y2
zV~pS_U+TRNgH>ED4>T-S?NK8i+J*7?#ty-$eU@+X#XfCoHm1Y+Vl#_n_fb8@XWyUS
zTi3ktJP>mn(!J;=`?C>$=pMcbP*-C19i-H_BF`%$h%I}?)<0rAtRJJ&(gcprGsK*b
z==K|lG3~j@rp0j{8-T#SyUQ|mP8ABIO{$fntjf%CP(TL$T?u2kuce)eboTsk2mEtF
zar;GOQo6f^yFbuD{C(#o
z_`)S=%=3|fEAXaiyhxzL5#8eAyg}kr0vCkL_9QO(@B9?xjruX>Umt32uV(&VG5w#k
cQjyE?yb-=lO40g}r&`ToVRF@&hQ=iR2lB5=%K!iX
literal 0
HcmV?d00001
diff --git a/g2p_draft_publish/static/src/css/style.css b/g2p_draft_publish/static/src/css/style.css
new file mode 100644
index 0000000..9bbc042
--- /dev/null
+++ b/g2p_draft_publish/static/src/css/style.css
@@ -0,0 +1,4 @@
+.btn-close {
+ display: none !important;
+}
+
diff --git a/g2p_draft_publish/views/configurations.xml b/g2p_draft_publish/views/configurations.xml
new file mode 100644
index 0000000..eedc6e4
--- /dev/null
+++ b/g2p_draft_publish/views/configurations.xml
@@ -0,0 +1,40 @@
+
+
+
+ g2p.validation.status.tree
+ g2p.validation.status
+
+
+
+
+
+
+
+
+
+ g2p.validation.status.form
+ g2p.validation.status
+
+
+
+
+
+
+
+ Enrichment Status
+ g2p.validation.status
+ tree
+ {}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/g2p_draft_publish/views/draft_imported_records.xml b/g2p_draft_publish/views/draft_imported_records.xml
new file mode 100644
index 0000000..7bb55f9
--- /dev/null
+++ b/g2p_draft_publish/views/draft_imported_records.xml
@@ -0,0 +1,202 @@
+
+
+ draft.imported.record.tree
+ draft.imported.record
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ draft.imported.record
+ draft.imported.record
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ draft.imported.record.form
+ draft.imported.record
+
+
+
+
+
+
+
+ Validation Form View
+ res.partner
+
+ primary
+
+
+
+
+
+
+
+
+
+
+
+ Validation Tree View
+ res.partner
+
+
+
+
+
+
+
+
+
+ Draft
+ draft.imported.record
+ kanban,tree,form
+ [('state', '!=', 'submitted')]
+
+
+
+
+ Submitted
+ draft.imported.record
+ tree,form
+ ['|',('state', '=', 'submitted'),('state', '=', 'published')]
+
+ {'create': False}
+
+
+
+
+
+ draft.imported.record.form
+ draft.imported.record
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/g2p_draft_publish/views/imported_records.xml b/g2p_draft_publish/views/imported_records.xml
new file mode 100644
index 0000000..692c4b5
--- /dev/null
+++ b/g2p_draft_publish/views/imported_records.xml
@@ -0,0 +1,161 @@
+
+
+
+ g2p.imported.record.tree
+ g2p.imported.record
+
+
+
+
+
+
+
+
+
+
+
+
+
+ g2p.imported.record
+ g2p.imported.record
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ g2p.imported.record.form
+ g2p.imported.record
+
+
+
+
+
+
+
+ message.form
+ g2p.imported.record
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Imported
+ g2p.imported.record
+ tree,form,kanban
+
+
+
+
diff --git a/g2p_draft_publish/views/views.xml b/g2p_draft_publish/views/views.xml
new file mode 100644
index 0000000..ae4d89a
--- /dev/null
+++ b/g2p_draft_publish/views/views.xml
@@ -0,0 +1,323 @@
+
+
+
+ g2p.validation.status.tree
+ g2p.validation.status
+
+
+
+
+
+
+
+ g2p.validation.status.form
+ g2p.validation.status
+
+
+
+
+
+
+
+
+ g2p.partner.kanban
+ res.partner
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ g2p.partner.tree
+ res.partner
+ primary
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ G2PPartner Search
+ res.partner
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ res.model.form inherited2
+ res.partner
+ form
+ primary
+
+
+
+
+
+
+
+
+ G2P Partner
+ res.partner
+ kanban,tree,form
+
+ {}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Imported Farmer Records
+
+ code
+
+ action = model.view_imported_farmer_records()
+
+
+
+
+
+
+ Validation Status
+ g2p.validation.status
+ tree
+ {}
+
+
+
+
+
+
+
diff --git a/g2p_draft_publish/wizards/__init__.py b/g2p_draft_publish/wizards/__init__.py
new file mode 100644
index 0000000..ff44cb0
--- /dev/null
+++ b/g2p_draft_publish/wizards/__init__.py
@@ -0,0 +1,3 @@
+# from . import transient_res_partner
+from . import add_followers
+from . import rejection
\ No newline at end of file
diff --git a/g2p_draft_publish/wizards/add_followers.py b/g2p_draft_publish/wizards/add_followers.py
new file mode 100644
index 0000000..52876ac
--- /dev/null
+++ b/g2p_draft_publish/wizards/add_followers.py
@@ -0,0 +1,55 @@
+from odoo import models, fields, api
+from odoo.exceptions import UserError
+from odoo.tools import is_html_empty
+from odoo.exceptions import ValidationError
+
+
+# class MailFollowers(models.Model):
+# _inherit = 'mail.followers'
+
+# assignee_id = fields.Many2one('res.users', string='Assignee')
+
+
+
+class Invite(models.TransientModel):
+ _inherit = 'mail.wizard.invite'
+
+ def add_followers_for_multiple_records(self):
+ if not self.env.user.email:
+ raise UserError(_("Unable to post message, please configure the sender's email address."))
+
+ email_from = self.env.user.email_formatted
+
+ # Ensure active_model and active_ids are present in the context
+ if not self._context.get('active_model') or not self._context.get('active_ids'):
+ raise UserError(_("No active model or records specified in the context."))
+
+ active_model = self._context['active_model']
+ active_ids = self._context['active_ids']
+
+
+ # for record_id in active_ids:
+ # record = self.env[active_model].browse(record_id)
+ # record.assigned_to = self.env.user
+
+
+ Model = self.env[active_model]
+ documents = Model.browse(active_ids)
+
+ for wizard in self:
+ new_partners = wizard.partner_ids - documents.sudo().mapped('message_partner_ids')
+
+ # Add the partners as followers
+ documents.message_subscribe(partner_ids=new_partners.ids)
+
+ model_name = self.env['ir.model']._get(active_model).display_name
+
+ # Send a notification if the option is checked and if a message exists
+ if wizard.notify and wizard.message and not is_html_empty(wizard.message):
+ for document in documents:
+ message_values = wizard._prepare_message_values(document, model_name, email_from)
+ message_values['partner_ids'] = new_partners.ids
+ document.message_notify(**message_values)
+
+ return {'type': 'ir.actions.act_window_close'}
+
diff --git a/g2p_draft_publish/wizards/add_followers.xml b/g2p_draft_publish/wizards/add_followers.xml
new file mode 100644
index 0000000..13349e2
--- /dev/null
+++ b/g2p_draft_publish/wizards/add_followers.xml
@@ -0,0 +1,43 @@
+
+
+
+
+ Add Followers
+ mail.wizard.invite
+
+ primary
+
+
+
+
+
+
+
+
+
+
+ Add Followers
+
+
+ code
+
+
+ action = {
+ 'type': 'ir.actions.act_window',
+ 'name': 'Add Followers for Multiple Records',
+ 'res_model': 'mail.wizard.invite',
+ 'view_mode': 'form',
+ 'views': [(env.ref('g2p_draft_publish.mail_wizard_invite_form_multiple').id, 'form')],
+ 'target': 'new',
+ 'context': {
+ 'default_res_model': 'res.partner',
+ },
+ }
+
+
+
+
+
+
+
diff --git a/g2p_draft_publish/wizards/rejection.py b/g2p_draft_publish/wizards/rejection.py
new file mode 100644
index 0000000..3ccef00
--- /dev/null
+++ b/g2p_draft_publish/wizards/rejection.py
@@ -0,0 +1,56 @@
+import logging
+
+from odoo import fields, models
+
+_logger = logging.getLogger(__name__)
+
+
+
+class RejectWizard(models.TransientModel):
+ _name = 'reject.wizard'
+ _description = 'Reject Wizard'
+
+ rejection_reason = fields.Text(string="Reason for Rejection", required=True)
+
+ def confirm_rejection(self):
+ active_ids = self._context.get('active_ids')
+ self.ensure_one()
+ record = self.env['draft.imported.record'].browse(active_ids[0])
+
+ record.write({
+ 'state': 'in_enrichment',
+ 'rejection_reason': self.rejection_reason,
+ })
+
+ record.message_post(
+ body=f"Record rejected: {self.rejection_reason}"
+
+ )
+
+
+ validator_group = self.env.ref("g2p_ati_integrations.group_int_validator")
+ validator_users = validator_group.users
+ matching_users = validator_users.filtered(lambda user: user.partner_id.id in record.message_partner_ids.ids)
+
+
+
+
+ if matching_users:
+ for user in matching_users:
+ self.env["mail.activity"].create(
+ {
+ "activity_type_id": self.env.ref(
+ "mail.mail_activity_data_todo"
+ ).id,
+ "res_model_id": self.env["ir.model"]
+ .search([("model", "=", "draft.imported.record")])
+ .id,
+ "res_id": record.id,
+ "user_id": user.id,
+ # "date_deadline": fields.Date.context_today(self),
+ "summary": "Record Rejected",
+ "note": f"Reason: {self.rejection_reason}. Please review and sumbit again.",
+ }
+ )
+
+ return {'type': 'ir.actions.act_window_close'}
diff --git a/g2p_draft_publish/wizards/rejection.xml b/g2p_draft_publish/wizards/rejection.xml
new file mode 100644
index 0000000..7c23876
--- /dev/null
+++ b/g2p_draft_publish/wizards/rejection.xml
@@ -0,0 +1,48 @@
+
+
+
+
+ draft.imported.record.form
+ draft.imported.record
+
+
+
+
+
+
+
+
+ reject.wizard.form
+ reject.wizard
+
+
+
+
+
+
+
+
+ Confirm Rejection
+ reject.wizard
+ form
+ new
+
+
+
+
+
From e42b6888a8fdd69d3520bbb4ac25c1b34d32fb35 Mon Sep 17 00:00:00 2001
From: Eyuael Bezabeh <98238151+EyuaelB@users.noreply.github.com>
Date: Tue, 14 Jan 2025 03:37:33 +0300
Subject: [PATCH 2/3] Delete g2p_draft_publish/views/views.xml
---
g2p_draft_publish/views/views.xml | 323 ------------------------------
1 file changed, 323 deletions(-)
delete mode 100644 g2p_draft_publish/views/views.xml
diff --git a/g2p_draft_publish/views/views.xml b/g2p_draft_publish/views/views.xml
deleted file mode 100644
index ae4d89a..0000000
--- a/g2p_draft_publish/views/views.xml
+++ /dev/null
@@ -1,323 +0,0 @@
-
-
-
- g2p.validation.status.tree
- g2p.validation.status
-
-
-
-
-
-
-
- g2p.validation.status.form
- g2p.validation.status
-
-
-
-
-
-
-
-
- g2p.partner.kanban
- res.partner
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- g2p.partner.tree
- res.partner
- primary
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- G2PPartner Search
- res.partner
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- res.model.form inherited2
- res.partner
- form
- primary
-
-
-
-
-
-
-
-
- G2P Partner
- res.partner
- kanban,tree,form
-
- {}
-
-
-
-
-
-
-
-
-
-
-
-
-
- Imported Farmer Records
-
- code
-
- action = model.view_imported_farmer_records()
-
-
-
-
-
-
- Validation Status
- g2p.validation.status
- tree
- {}
-
-
-
-
-
-
-
From 411e1f1b4fbd6480ae57b6bb7b56a2fb56e680db Mon Sep 17 00:00:00 2001
From: EyuaelB
Date: Wed, 15 Jan 2025 04:26:48 +0300
Subject: [PATCH 3/3] raised issues fixed
---
README.md | 1 +
g2p_draft_publish/README.md | 2 +-
g2p_draft_publish/__init__.py | 2 +-
g2p_draft_publish/__manifest__.py | 38 +-
g2p_draft_publish/data/enrichment_status.xml | 4 +-
g2p_draft_publish/models/__init__.py | 2 +-
g2p_draft_publish/models/configurations.py | 8 +-
.../models/draft_import_records.py | 407 ++++++++++--------
.../models/imported_farmer_records.py | 129 +++---
g2p_draft_publish/pyproject.toml | 3 +
.../security/ir.model.access.csv | 9 +-
g2p_draft_publish/security/rules.xml | 46 +-
g2p_draft_publish/static/src/css/style.css | 1 -
g2p_draft_publish/views/configurations.xml | 33 +-
.../views/draft_imported_records.xml | 191 ++++++--
g2p_draft_publish/views/imported_records.xml | 107 +++--
g2p_draft_publish/wizards/__init__.py | 2 +-
g2p_draft_publish/wizards/add_followers.py | 30 +-
g2p_draft_publish/wizards/add_followers.xml | 26 +-
g2p_draft_publish/wizards/rejection.py | 81 ++--
g2p_draft_publish/wizards/rejection.xml | 28 +-
21 files changed, 682 insertions(+), 468 deletions(-)
create mode 100644 g2p_draft_publish/pyproject.toml
diff --git a/README.md b/README.md
index f36c242..b2a07d4 100644
--- a/README.md
+++ b/README.md
@@ -22,6 +22,7 @@ Available addons
----------------
addon | version | maintainers | summary
--- | --- | --- | ---
+[g2p_draft_publish](g2p_draft_publish/) | 17.0.0.0.0 | | Draft Publish Module
[g2p_registry_g2p_connect_rest_api](g2p_registry_g2p_connect_rest_api/) | 17.0.0.0.0 | | OpenG2P Registry: G2P Connect REST API
[g2p_registry_id_deduplication](g2p_registry_id_deduplication/) | 17.0.0.0.0 | | OpenG2P Registry ID Deduplication
[g2p_social_registry](g2p_social_registry/) | 17.0.0.0.0 | | OpenG2P Social Registry
diff --git a/g2p_draft_publish/README.md b/g2p_draft_publish/README.md
index 0b283ac..55e9600 100644
--- a/g2p_draft_publish/README.md
+++ b/g2p_draft_publish/README.md
@@ -1 +1 @@
-# g2p_ati_integrations
\ No newline at end of file
+# g2p_ati_integrations
diff --git a/g2p_draft_publish/__init__.py b/g2p_draft_publish/__init__.py
index 6ed2c21..aee8895 100644
--- a/g2p_draft_publish/__init__.py
+++ b/g2p_draft_publish/__init__.py
@@ -1,2 +1,2 @@
from . import models
-from . import wizards
\ No newline at end of file
+from . import wizards
diff --git a/g2p_draft_publish/__manifest__.py b/g2p_draft_publish/__manifest__.py
index 93b1498..78b8f25 100644
--- a/g2p_draft_publish/__manifest__.py
+++ b/g2p_draft_publish/__manifest__.py
@@ -1,24 +1,20 @@
{
- "name": "Draft Publish Module",
- "version": "17.0.0.2",
+ "name": "Draft Publish",
+ "version": "17.0.0.0.0",
"summary": "Draft Publish Module",
"category": "tools",
- "description": """
-""",
- "depends": ["base", 'mail','g2p_social_registry', 'g2p_registry_addl_info', 'web'],
+ "depends": ["base", "mail", "g2p_social_registry", "g2p_registry_addl_info", "web"],
"data": [
- "security/rules.xml",
- "security/ir.model.access.csv",
- "data/enrichment_status.xml",
- "views/configurations.xml",
- "views/draft_imported_records.xml",
- "views/imported_records.xml",
- "wizards/add_followers.xml",
- "wizards/rejection.xml"
-
- ],
-
- "assets": {
+ "security/rules.xml",
+ "security/ir.model.access.csv",
+ "data/enrichment_status.xml",
+ "views/configurations.xml",
+ "views/draft_imported_records.xml",
+ "views/imported_records.xml",
+ "wizards/add_followers.xml",
+ "wizards/rejection.xml",
+ ],
+ "assets": {
"web.assets_backend": [
"g2p_draft_publish/static/src/**/*.js",
"g2p_draft_publish/static/src/**/*.css",
@@ -26,11 +22,11 @@
"g2p_draft_publish/static/src/**/*.xml",
],
},
- "author": "",
- 'website': "",
+ "author": "OpenG2P",
+ "website": "https://openg2p.org",
"installable": True,
"application": False,
"auto_install": False,
# "images": ["static/description/Banner.gif"],
- "license":'',
-}
\ No newline at end of file
+ "license": "",
+}
diff --git a/g2p_draft_publish/data/enrichment_status.xml b/g2p_draft_publish/data/enrichment_status.xml
index f1f2f39..11d653a 100644
--- a/g2p_draft_publish/data/enrichment_status.xml
+++ b/g2p_draft_publish/data/enrichment_status.xml
@@ -1,10 +1,8 @@
-
-
+
Started
-
diff --git a/g2p_draft_publish/models/__init__.py b/g2p_draft_publish/models/__init__.py
index 3c46e5f..607aef1 100644
--- a/g2p_draft_publish/models/__init__.py
+++ b/g2p_draft_publish/models/__init__.py
@@ -1,4 +1,4 @@
# from . import res_partner
from . import imported_farmer_records
from . import configurations
-from . import draft_import_records
\ No newline at end of file
+from . import draft_import_records
diff --git a/g2p_draft_publish/models/configurations.py b/g2p_draft_publish/models/configurations.py
index de6f5e3..367f77f 100644
--- a/g2p_draft_publish/models/configurations.py
+++ b/g2p_draft_publish/models/configurations.py
@@ -1,9 +1,7 @@
-from odoo import models, fields, api, _
+from odoo import fields, models
class G2PValidationStatus(models.Model):
- _name = 'g2p.validation.status'
-
+ _name = "g2p.validation.status"
+
name = fields.Char()
-
-
diff --git a/g2p_draft_publish/models/draft_import_records.py b/g2p_draft_publish/models/draft_import_records.py
index 9df8d0f..aea7b20 100644
--- a/g2p_draft_publish/models/draft_import_records.py
+++ b/g2p_draft_publish/models/draft_import_records.py
@@ -1,21 +1,21 @@
-from odoo import models, fields, api
import json
-from odoo.exceptions import UserError, ValidationError
-from datetime import date, datetime
import logging
-from typing import Dict, List
+from datetime import date, datetime
+
+from odoo import _, fields, models
+from odoo.exceptions import UserError, ValidationError
+
_logger = logging.getLogger(__name__)
class BaseInherit(models.AbstractModel):
- _inherit = 'base'
+ _inherit = "base"
- def web_save(self, vals, specification: Dict[str, Dict], next_id=None) -> List[Dict]:
- if self._name == 'res.partner' and self.env.context.get('in_enrichment'):
+ def web_save(self, vals, specification: dict[str, dict], next_id=None) -> list[dict]:
+ if self._name == "res.partner" and self.env.context.get("in_enrichment"):
self.action_save_to_draft(vals)
return self
-
-
+
if self:
self.write(vals)
else:
@@ -28,238 +28,292 @@ def web_save(self, vals, specification: Dict[str, Dict], next_id=None) -> List[D
class G2PDraftImportedRecord(models.Model):
_name = "draft.imported.record"
_description = "Draft Imported Records"
- _inherit = ['mail.thread', 'mail.activity.mixin']
-
- name = fields.Char(string='Name')
- given_name = fields.Char(string="First Name")
- family_name = fields.Char(string="Father's Name")
- addl_name = fields.Char(string="Grand Father's Name")
- phone = fields.Char(string="Phone")
+ _inherit = ["mail.thread", "mail.activity.mixin"]
+
+ name = fields.Char()
+ given_name = fields.Char()
+ family_name = fields.Char()
+ addl_name = fields.Char()
+ phone = fields.Char()
gender = fields.Char()
- region = fields.Char(string="Region")
-
- partner_data = fields.Json(string='Partner Data (JSON)')
- validation_status = fields.Many2one('g2p.validation.status')
- state = fields.Selection(string='State', selection=[('in_enrichment', 'Enrichment'), ('submitted', 'Submitted'), ('published', 'Published')], default="in_enrichment")
- import_record_id = fields.Many2one('g2p.imported.record',string='Import Record')
+ region = fields.Char()
+
+ partner_data = fields.Json(string="Partner Data (JSON)")
+ validation_status = fields.Many2one("g2p.validation.status")
+ state = fields.Selection(
+ selection=[("in_enrichment", "Enrichment"), ("submitted", "Submitted"), ("published", "Published")],
+ default="in_enrichment",
+ )
+ import_record_id = fields.Many2one("g2p.imported.record", string="Import Record")
rejection_reason = fields.Text()
-
-
+
def action_publish(self):
self.ensure_one()
partner_data = json.loads(self.partner_data)
- res_partner_model = self.env['res.partner']
+ res_partner_model = self.env["res.partner"]
# Fetch all fields metadata from res.partner
fields_metadata = res_partner_model.fields_get()
# Dictionary to store valid fields and values
valid_data = {}
-
- given_name = partner_data.get('given_name', '')
- family_name = partner_data.get('family_name', '')
- gf_name_en = partner_data.get('addl_name', '')
+
+ given_name = partner_data.get("given_name", "")
+ family_name = partner_data.get("family_name", "")
+ gf_name_en = partner_data.get("addl_name", "")
for field_name, value in partner_data.items():
if field_name in fields_metadata:
field_info = fields_metadata[field_name]
- field_type = field_info.get('type')
+ field_type = field_info.get("type")
- # Validation based on field type
- if field_type == 'char' and isinstance(value, str):
+ if field_type == "char" and isinstance(value, str):
valid_data[field_name] = value
- elif field_type == 'integer' and isinstance(value, int):
+ elif field_type == "integer" and isinstance(value, int):
valid_data[field_name] = value
- elif field_type == 'float' and isinstance(value, (int, float)):
+ elif field_type == "float" and isinstance(value, int | float):
valid_data[field_name] = float(value)
- elif field_type == 'boolean' and isinstance(value, bool):
+ elif field_type == "boolean" and isinstance(value, bool):
valid_data[field_name] = value
- elif field_type == 'many2one' and isinstance(value, int):
+ elif field_type == "many2one" and isinstance(value, int):
# Check if the referenced record exists
- if self.env[field_info['relation']].browse(value).exists():
+ if self.env[field_info["relation"]].browse(value).exists():
valid_data[field_name] = value
- elif field_type == 'selection':
- selection_options = [option[0] for option in field_info.get('selection', [])]
+ elif field_type == "selection":
+ selection_options = [option[0] for option in field_info.get("selection", [])]
if value in selection_options:
valid_data[field_name] = value
# Create the res.partner record with valid data
if valid_data:
- valid_data['db_import'] = 'yes'
- valid_data['name'] = f"{given_name} {family_name} {gf_name_en}".upper()
-
- new_partner = res_partner_model.create(valid_data)
- self.write({'state':'published'})
+ valid_data["db_import"] = "yes"
+ valid_data["name"] = f"{given_name} {family_name} {gf_name_en}".upper()
+
+ res_partner_model.create(valid_data)
+ self.write({"state": "published"})
+
+ validator_group = self.env.ref("g2p_draft_publish.group_int_validator")
+ admin_group = self.env.ref("g2p_draft_publish.group_int_admin")
+ approver_group = self.env.ref("g2p_draft_publish.group_int_approver")
+ validator_users = validator_group.users
+ exclusive_validator_users = validator_users.filtered(
+ lambda user: user not in admin_group.users and user not in approver_group.users
+ )
+ matching_users = exclusive_validator_users.filtered(
+ lambda user: user.partner_id.id in self.message_partner_ids.ids
+ )
+
+ if matching_users:
+ for user in matching_users:
+ self.message_post(
+ _(
+ body="Record has been published",
+ subject="Record Published",
+ message_type="notification",
+ partner_ids=[user.partner_id.id],
+ )
+ )
+
+ # current_user_partner_id = self.env.user.partner_id.id
+ # filtered_partner_ids = [
+ # partner_id
+ # for partner_id in self.message_partner_ids.ids
+ # if partner_id != current_user_partner_id
+ # ]
+
+ # if filtered_partner_ids:
+ # for partner_id in filtered_partner_ids:
+ # self.message_post(
+ # body="Record has been published",
+ # subject="Record Published",
+ # message_type="notification",
+ # partner_ids=[partner_id],
+ # )
+
else:
raise ValueError("No valid data found to create a partner record.")
-
def action_submit(self):
- self.write({'state':'submitted'})
-
-
+ activities = self.env["mail.activity"].search(
+ [("res_model", "=", self._name), ("res_id", "in", self.ids)]
+ )
+ if activities:
+ activities.action_done()
+
+ self.write({"state": "submitted"})
+
def action_open_wizard(self):
-
self.ensure_one()
active_id = self.id
-
+
if not self.partner_data:
- raise UserError("No partner data available to edit.")
+ raise UserError(_("No partner data available to edit."))
+
try:
json_data = json.loads(self.partner_data)
-
- except json.JSONDecodeError:
- raise UserError("Invalid JSON data in partner_data.")
-
- partner_model_fields = self.env['res.partner']._fields
- _logger.info("the set of fields")
- _logger.info(self.env['res.partner']._fields)
- _logger.info("the set of the json")
- _logger.info(json_data.items())
- additional_g2p_info = {}
- context_data = {}
-
- # excluded = ["land_information_ids", "crop_information_ids", "livestock_information_ids", "phone_number_ids", "reg_ids"]
-
+ except json.JSONDecodeError as err:
+ raise UserError(_("Invalid JSON data in partner_data.")) from err
+
+ context_data, additional_g2p_info = self._process_json_data(json_data)
+
+ context_data["active_id"] = active_id
+
+ return {
+ "type": "ir.actions.act_window",
+ "name": "Record Data",
+ "view_mode": "form",
+ "res_model": "res.partner",
+ "view_id": self.env.ref("g2p_draft_publish.g2p_validation_form_view").id,
+ "target": "new",
+ "context": {
+ **context_data,
+ "default_additional_g2p_info": json.dumps(additional_g2p_info),
+ "in_enrichment": "yes",
+ "default_phone_number_ids": json_data.get("phone_number_ids", []),
+ "default_individual_membership_ids": json_data.get("individual_membership_ids", []),
+ "default_reg_ids": json_data.get("reg_ids", []),
+ },
+ }
+
+ def _process_json_data(self, json_data):
+ """Processes JSON data and returns context data and additional G2P info."""
+ partner_model_fields = self.env["res.partner"]._fields
+ _logger.info("The set of fields: %s", partner_model_fields)
+ _logger.info("The JSON data: %s", json_data.items())
+
+ additional_g2p_info = {}
+ context_data = {}
+
for field_name, field_value in json_data.items():
-
- if field_name not in partner_model_fields:
+ if field_name not in partner_model_fields:
additional_g2p_info[field_name] = field_value
continue
-
field = partner_model_fields[field_name]
-
- if field.type == 'datetime' and isinstance(field_value, str):
+
+ if field.type == "datetime" and isinstance(field_value, str):
_logger.info(f"the datetime field {field_name}")
- try:
- field_value = datetime.fromisoformat(field_value)
- context_data[f"default_{field_name}"] = field_value
- except ValueError:
- pass
-
- elif field.type == 'date' and isinstance(field_value, str):
- try:
- field_value = date.fromisoformat(field_value)
- context_data[f"default_{field_name}"] = field_value
- except ValueError:
- pass # If it's not a valid date string, leave it as is
-
- elif field.type == 'many2one':
- # _logger.info(f"the many2one field 01 {field_name}")
- try:
+ field_value = datetime.fromisoformat(field_value)
+ context_data[f"default_{field_name}"] = field_value
+
+ elif field.type == "date" and isinstance(field_value, str):
+ field_value = date.fromisoformat(field_value)
+ context_data[f"default_{field_name}"] = field_value
+
+ elif (field.type == "char" or field.type == "text") and isinstance(field_value, str):
+ _logger.info(f"the datetime field {field_name}")
+ context_data[f"default_{field_name}"] = field_value
+
+ elif field.type == "many2one":
+ if isinstance(field_value, int):
field_value = int(field_value)
- if isinstance(field_value, int):
- context_data[f"default_{field_name}"] = json_data[field_name]
- _logger.info(f"the many2one field {field_name}")
- except ValueError as e:
- if not isinstance(field_value, int):
- additional_g2p_info[field_name] = field_value
-
- elif field.type == 'many2many':
+ context_data[f"default_{field_name}"] = json_data[field_name]
+ _logger.info(f"the many2one field {field_name}")
+ else:
+ additional_g2p_info[field_name] = field_value
+
+ elif field.type == "many2many":
# _logger.info(f"the field {field_name}")
if isinstance(field_value, list):
if all(isinstance(val, int) for val in field_value):
- # If field_value is a list of IDs (int), update the many2many field
context_data[f"default_{field_name}"] = [(6, 0, field_value)]
- elif all(hasattr(val, 'id') for val in field_value):
- # If field_value is a list of records, extract their IDs
+ elif all(hasattr(val, "id") for val in field_value):
context_data[f"default_{field_name}"] = [(6, 0, [val.id for val in field_value])]
else:
additional_g2p_info[field_name] = field_value
- elif hasattr(field_value, 'id'): # If field_value is a single record
- # If field_value is a single record, update it as a list with one record
+ elif hasattr(field_value, "id"):
context_data[f"default_{field_name}"] = [(6, 0, [field_value.id])]
else:
additional_g2p_info[field_name] = field_value
-
-
- elif field.type == 'selection':
+
+ elif field.type == "selection":
_logger.info(f"the field {field_name}")
selection_values = field.get_values(env=self.env)
if field_value in selection_values:
context_data[f"default_{field_name}"] = field_value
if field_value not in selection_values:
additional_g2p_info[field_name] = field_value
-
+
else:
context_data[f"default_{field_name}"] = field_value
-
- context_data['active_id'] = active_id
-
+
+ _logger.info(f"The context data: {context_data}")
+
+ # except ValueError as e:
+ # _logger.error("A ValueError occurred: %s", str(e), exc_info=True)
+
+ return context_data, additional_g2p_info
+
+ def action_reject(self):
return {
- 'type': 'ir.actions.act_window',
- 'name': 'Record Data',
- 'view_mode': 'form',
- 'res_model': 'res.partner',
- 'view_id': self.env.ref('g2p_draft_publish.g2p_validation_form_view').id,
- 'target': 'new',
- # 'target': 'current',
- 'context': {**context_data, 'default_additional_g2p_info': json.dumps(additional_g2p_info),
- 'in_enrichment' : 'yes',
- 'default_phone_number_ids': json_data.get('phone_number_ids', []),
- 'default_individual_membership_ids': json_data.get('individual_membership_ids', []),
- 'default_reg_ids': json_data.get('reg_ids', [])
- },
+ "name": "Confirm Rejection",
+ "type": "ir.actions.act_window",
+ "res_model": "reject.wizard",
+ "view_mode": "form",
+ "target": "new",
}
-
-
-
- def action_reject(self):
- return {
- 'name': 'Confirm Rejection',
- 'type': 'ir.actions.act_window',
- 'res_model': 'reject.wizard',
- 'view_mode': 'form',
- 'target': 'new',
- }
class G2PRespartnerIntegration(models.Model):
- _inherit = 'res.partner'
-
- db_import = fields.Selection(string="Imported", index=True, selection=[("yes", "Yes"), ("no", "No")],default="no")
+ _inherit = "res.partner"
+
+ db_import = fields.Selection(
+ string="Imported", index=True, selection=[("yes", "Yes"), ("no", "No")], default="no"
+ )
def action_update(self):
return
-
-
- def action_save_to_draft(self,vals):
-
+
+ def action_save_to_draft(self, vals):
context = self.env.context
- model_name = context.get('active_model')
- record_id = context.get('active_id')
+ model_name = context.get("active_model")
+ record_id = context.get("active_id")
active_record = self.env[model_name].browse(record_id)
partner_data = json.loads(active_record.partner_data) or {}
-
-
+
m2m_fields = {
- 'tags_ids': 'tags_ids',
- }
+ "tags_ids": "tags_ids",
+ }
processed_m2m_fields = {}
- for field, key in m2m_fields.items():
+ for field in m2m_fields:
processed_m2m_fields[field] = [item[1] for item in vals.get(field, [])]
-
dynamic_fields = {
- 'is_company': False,
- 'is_group': False,
- 'is_registrant': True,
- 'db_import': 'yes',
- **processed_m2m_fields
-
+ "is_company": False,
+ "is_group": False,
+ "is_registrant": True,
+ "db_import": "yes",
+ **processed_m2m_fields,
}
static_fields = [
- 'given_name', 'family_name', 'address', 'addl_name', 'birthdate','region',
- 'email', 'gender', 'civil_status', 'district','occupation', 'birthdate_not_exact', 'income','brith_place'
- 'martial_status', 'education',
- 'is_disabled', 'phone_number_ids','related_1_ids', 'related_2_ids', 'individual_membership_ids','group_memebership_ids', 'reg_ids',
- 'additional_g2p_info'
+ "given_name",
+ "family_name",
+ "address",
+ "addl_name",
+ "birthdate",
+ "region",
+ "email",
+ "gender",
+ "civil_status",
+ "district",
+ "occupation",
+ "birthdate_not_exact",
+ "income",
+ "birth_place",
+ "martial_status",
+ "education",
+ "is_disabled",
+ "phone_number_ids",
+ "related_1_ids",
+ "related_2_ids",
+ "individual_membership_ids",
+ "group_memebership_ids",
+ "reg_ids",
+ "additional_g2p_info",
]
-
draft_record = {}
draft_record.update(dynamic_fields)
@@ -271,37 +325,32 @@ def action_save_to_draft(self,vals):
if vals.get(field):
draft_record[field] = vals[field]
- if vals.get('given_name') or vals.get('family_name') or vals.get('addl_name'):
- draft_record['name'] = f"{vals.get('given_name', '').upper()} {vals.get('family_name', '').upper()} {vals.get('addl_name', '').upper()}".strip()
+ if vals.get("given_name") or vals.get("family_name") or vals.get("addl_name"):
+ name_parts = [
+ vals.get("given_name", "").upper(),
+ vals.get("family_name", "").upper(),
+ vals.get("addl_name", "").upper(),
+ ]
+ draft_record["name"] = " ".join(filter(None, name_parts)).strip()
-
- active_record.write({
- 'partner_data': json.dumps(draft_record)
- })
-
-
-
+ active_record.write({"partner_data": json.dumps(draft_record)})
def action_publish(self):
context = self.env.context
- model_name = context.get('active_model')
- record_id = context.get('active_id')
+ model_name = context.get("active_model")
+ record_id = context.get("active_id")
record = self.env[model_name].browse(record_id)
- if record.state=='published':
- raise ValidationError("Record already has been published")
+ if record.state == "published":
+ raise ValidationError(_("Record already has been published"))
else:
record.action_publish()
-
-
+
def action_submit(self):
context = self.env.context
- model_name = context.get('active_model')
- record_id = context.get('active_id')
+ model_name = context.get("active_model")
+ record_id = context.get("active_id")
record = self.env[model_name].browse(record_id)
- if record.state=='submitted':
- raise ValidationError("Record already has been Submitted")
+ if record.state == "submitted":
+ raise ValidationError(_("Record already has been Submitted"))
else:
record.action_submit()
-
-
-
diff --git a/g2p_draft_publish/models/imported_farmer_records.py b/g2p_draft_publish/models/imported_farmer_records.py
index 0376785..452f0de 100644
--- a/g2p_draft_publish/models/imported_farmer_records.py
+++ b/g2p_draft_publish/models/imported_farmer_records.py
@@ -1,28 +1,27 @@
-from odoo import models, fields, api
import json
+
+from odoo import _, api, fields, models
from odoo.exceptions import ValidationError
class G2PImportedRecord(models.Model):
- _name = 'g2p.imported.record'
- _description = 'Imported Record'
- _inherit = ['mail.thread', 'mail.activity.mixin']
+ _name = "g2p.imported.record"
+ _description = "Imported Record"
+ _inherit = ["mail.thread", "mail.activity.mixin"]
- name = fields.Char(string="Name")
+ name = fields.Char()
given_name = fields.Char(string="First Name")
family_name = fields.Char(string="Father's Name")
gf_name_eng = fields.Char(string="Grand Father's Name")
- phone = fields.Char(string="Phone")
+ phone = fields.Char()
gender = fields.Char()
- region = fields.Char(string="Region")
- state = fields.Selection(string='State', selection=[('draft', 'Draft'), ('moved', 'Created')], default="draft")
+ region = fields.Char()
+ state = fields.Selection(selection=[("draft", "Draft"), ("moved", "Created")], default="draft")
language = fields.Char()
record_from = fields.Char()
- record_type = fields.Selection(selection=[('single', 'Single Source'),('composed', 'Composed')])
+ record_type = fields.Selection(selection=[("single", "Single Source"), ("composed", "Composed")])
db_import = fields.Boolean("Imported", default=False)
-
-
@api.onchange("family_name", "given_name", "gf_name_eng")
def name_change_farmer(self):
name = ""
@@ -32,83 +31,73 @@ def name_change_farmer(self):
name += self.family_name + " "
if self.gf_name_eng:
name += self.gf_name_eng
-
+
self.name = name.upper()
-
-
+
def action_view_draft_records(self):
return {
- 'name': 'Draft Records',
- 'type': 'ir.actions.act_window',
- 'res_model': 'draft.imported.record',
- 'view_mode': 'kanban,form',
- 'domain': [('import_record_id', '=', self.id)],
- 'context': dict(self.env.context, default_import_record_id=self.id),
+ "name": "Draft Records",
+ "type": "ir.actions.act_window",
+ "res_model": "draft.imported.record",
+ "view_mode": "kanban,form",
+ "domain": [("import_record_id", "=", self.id)],
+ "context": dict(self.env.context, default_import_record_id=self.id),
}
-
-
def action_to_draft(self):
for record in self:
- associated_records = self.env['draft.imported.record'].sudo().search([
- ('import_record_id', '=', record.id)
- ])
-
- if any(rec.state == 'published' for rec in associated_records):
+ associated_records = (
+ self.env["draft.imported.record"].sudo().search([("import_record_id", "=", record.id)])
+ )
+
+ if any(rec.state == "published" for rec in associated_records):
raise ValidationError(
- "Cannot set to draft. There are associated records that are already published."
+ _("Cannot set to draft. There are associated records that are already published.")
)
-
+
associated_records.unlink()
- record.write({'state': 'draft'})
+ record.write({"state": "draft"})
-
-
-
def action_move(self):
self.write({"state": "moved"})
-
+
def create_draft_imported_record(self):
- self.ensure_one()
-
- enrichment_started = self.env.ref('g2p_draft_publish.enrichment_started')
-
+ self.ensure_one()
+
+ enrichment_started = self.env.ref("g2p_draft_publish.enrichment_started")
+
partner_data = {
- 'given_name': self.given_name,
- 'family_name': self.family_name,
- 'addl_name': self.gf_name_eng,
- 'phone': self.phone,
- 'gender': self.gender,
- 'region': self.region
+ "given_name": self.given_name,
+ "family_name": self.family_name,
+ "addl_name": self.gf_name_eng,
+ "phone": self.phone,
+ "gender": self.gender,
+ "region": self.region,
}
-
+
data = {
- 'name': self.name,
- 'given_name': self.given_name,
- 'family_name': self.family_name,
- 'addl_name': self.gf_name_eng,
- 'phone': self.phone,
- 'gender': self.gender,
- 'region': self.region,
- 'import_record_id': self.id,
- 'partner_data' : json.dumps(partner_data),
- 'validation_status': enrichment_started.id
-
+ "name": self.name,
+ "given_name": self.given_name,
+ "family_name": self.family_name,
+ "addl_name": self.gf_name_eng,
+ "phone": self.phone,
+ "gender": self.gender,
+ "region": self.region,
+ "import_record_id": self.id,
+ "partner_data": json.dumps(partner_data),
+ "validation_status": enrichment_started.id,
}
-
- new_record = self.env['draft.imported.record'].sudo().create(data)
- new_record.sudo().write({
- 'message_partner_ids': [(6, 0, self.message_partner_ids.ids)]
- })
-
+
+ new_record = self.env["draft.imported.record"].sudo().create(data)
+ new_record.sudo().write({"message_partner_ids": [(6, 0, self.message_partner_ids.ids)]})
+
self.write({"state": "moved"})
-
+
return {
- 'name': 'Draft Records',
- 'type': 'ir.actions.act_window',
- 'res_model': 'draft.imported.record',
- 'view_mode': 'kanban,form,tree',
- 'domain': [('import_record_id', '=', self.id)],
- 'context': dict(self.env.context, default_import_record_id=self.id),
+ "name": "Draft Records",
+ "type": "ir.actions.act_window",
+ "res_model": "draft.imported.record",
+ "view_mode": "kanban,form,tree",
+ "domain": [("import_record_id", "=", self.id)],
+ "context": dict(self.env.context, default_import_record_id=self.id),
}
-
diff --git a/g2p_draft_publish/pyproject.toml b/g2p_draft_publish/pyproject.toml
new file mode 100644
index 0000000..4231d0c
--- /dev/null
+++ b/g2p_draft_publish/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["whool"]
+build-backend = "whool.buildapi"
diff --git a/g2p_draft_publish/security/ir.model.access.csv b/g2p_draft_publish/security/ir.model.access.csv
index aa9585e..0c4cf0c 100644
--- a/g2p_draft_publish/security/ir.model.access.csv
+++ b/g2p_draft_publish/security/ir.model.access.csv
@@ -2,19 +2,16 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_imported_record_user,access_imported_record_user,model_g2p_imported_record,g2p_draft_publish.group_int_validator,1,1,0,0
access_imported_record_admin,access_imported_record_admin,model_g2p_imported_record,g2p_draft_publish.group_int_admin,1,1,1,1
access_draft_imported_record_user,access_draft_imported_record_user,model_draft_imported_record,g2p_draft_publish.group_int_validator,1,1,1,1
-access_g2p_validation_status,status_manager,model_g2p_validation_status,g2p_draft_publish.group_int_admin,1,1,1,1
+access_g2p_validation_status_admin,status_manager,model_g2p_validation_status,g2p_draft_publish.group_int_admin,1,1,1,1
access_g2p_validation_status,status_manager_validator,model_g2p_validation_status,g2p_draft_publish.group_int_validator,1,1,1,1
access_res_partner_val,resp_manager_val,model_res_partner,g2p_draft_publish.group_int_validator,1,1,1,1
access_reject_wizard,group_reject_wizard_all,model_reject_wizard,g2p_draft_publish.group_int_validator,1,1,1,1
+access_tag_val,group_tag_val,g2p_registry_base.model_g2p_registrant_tags,g2p_draft_publish.group_int_validator,1,1,1,1
access_reg_id_group_base_val,g2p_reg_id_group_base_val_access,g2p_registry_base.model_g2p_reg_id,g2p_draft_publish.group_int_validator,1,1,1,1
+access_id_type_group_base_val,g2p_id_type_group_base_val_access,g2p_registry_base.model_g2p_id_type,g2p_draft_publish.group_int_validator,1,1,0,1
access_memebershp_base_val,g2p_memebershp_group_base_val_access,g2p_registry_membership.model_g2p_group_membership,g2p_draft_publish.group_int_validator,1,1,1,1
-
access_reg_rel_group_base_val,g2p_reg_rel_group_base_val_access,g2p_registry_base.model_g2p_reg_rel,g2p_draft_publish.group_int_validator,1,1,1,1
g2p_phone_number_val,Phone Number val Access,g2p_registry_base.model_g2p_phone_number,g2p_draft_publish.group_int_validator,1,1,1,1
-
-
-
-
diff --git a/g2p_draft_publish/security/rules.xml b/g2p_draft_publish/security/rules.xml
index 377dd7a..f928ee3 100644
--- a/g2p_draft_publish/security/rules.xml
+++ b/g2p_draft_publish/security/rules.xml
@@ -9,46 +9,56 @@
Validator
-
+
Approver
-
-
+
+
Admin
-
-
+
+
Imported Records Follower
-
- ['|', ('message_partner_ids', 'in', [user.partner_id.id]), ('message_partner_ids','=',False) ]
-
+
+ ['|', ('message_partner_ids', 'in', [user.partner_id.id]), ('message_partner_ids','=',False) ]
+
Draft Records Follower
-
- ['|', ('message_partner_ids', 'in', [user.partner_id.id]), ('message_partner_ids','=',False) ]
-
+
+ ['|', ('message_partner_ids', 'in', [user.partner_id.id]), ('message_partner_ids','=',False) ]
+
Admin Can View ALL Imported Records
-
-
+
+
Admin Can View ALL Draft Imported Records
-
-
-
-
+
+
+
+
-
\ No newline at end of file
+
diff --git a/g2p_draft_publish/static/src/css/style.css b/g2p_draft_publish/static/src/css/style.css
index 9bbc042..326a69c 100644
--- a/g2p_draft_publish/static/src/css/style.css
+++ b/g2p_draft_publish/static/src/css/style.css
@@ -1,4 +1,3 @@
.btn-close {
display: none !important;
}
-
diff --git a/g2p_draft_publish/views/configurations.xml b/g2p_draft_publish/views/configurations.xml
index eedc6e4..5e46a6c 100644
--- a/g2p_draft_publish/views/configurations.xml
+++ b/g2p_draft_publish/views/configurations.xml
@@ -5,7 +5,7 @@
g2p.validation.status
-
+
@@ -17,7 +17,7 @@
@@ -31,10 +31,25 @@
{}
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
diff --git a/g2p_draft_publish/views/draft_imported_records.xml b/g2p_draft_publish/views/draft_imported_records.xml
index 7bb55f9..792f0b4 100644
--- a/g2p_draft_publish/views/draft_imported_records.xml
+++ b/g2p_draft_publish/views/draft_imported_records.xml
@@ -6,20 +6,49 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -29,9 +58,16 @@
draft.imported.record
draft.imported.record
-
+
-
+
@@ -40,12 +76,17 @@
-
+
-
+
@@ -58,12 +99,36 @@
@@ -98,7 +163,14 @@
-
+
@@ -112,8 +184,13 @@
-
-
+
+
@@ -125,16 +202,22 @@
Validation Form View
res.partner
-
+
primary
-
+
@@ -145,10 +228,16 @@
Validation Tree View
res.partner
-
+
-
+
@@ -158,10 +247,13 @@
draft.imported.record
kanban,tree,form
[('state', '!=', 'submitted')]
-
+ (0,0,{'view_mode': 'form', 'view_id': ref('view_draft_imported_record_form')})]"
+ />
@@ -169,9 +261,12 @@
draft.imported.record
tree,form
['|',('state', '=', 'submitted'),('state', '=', 'published')]
-
+ (0,0,{'view_mode': 'form', 'view_id': ref('view_draft_imported_record_form')})]"
+ />
{'create': False}
@@ -183,20 +278,30 @@
-
-
+
+
-
-
diff --git a/g2p_draft_publish/views/imported_records.xml b/g2p_draft_publish/views/imported_records.xml
index 692c4b5..3b4514c 100644
--- a/g2p_draft_publish/views/imported_records.xml
+++ b/g2p_draft_publish/views/imported_records.xml
@@ -4,13 +4,13 @@
g2p.imported.record.tree
g2p.imported.record
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -21,29 +21,37 @@
-
-
+
+
@@ -85,44 +93,75 @@
-->
-
+
g2p.imported.record.form
g2p.imported.record
@@ -137,7 +176,9 @@
@@ -157,5 +198,11 @@
tree,form,kanban
-
+
diff --git a/g2p_draft_publish/wizards/__init__.py b/g2p_draft_publish/wizards/__init__.py
index ff44cb0..e3e5a05 100644
--- a/g2p_draft_publish/wizards/__init__.py
+++ b/g2p_draft_publish/wizards/__init__.py
@@ -1,3 +1,3 @@
# from . import transient_res_partner
from . import add_followers
-from . import rejection
\ No newline at end of file
+from . import rejection
diff --git a/g2p_draft_publish/wizards/add_followers.py b/g2p_draft_publish/wizards/add_followers.py
index 52876ac..7d3102c 100644
--- a/g2p_draft_publish/wizards/add_followers.py
+++ b/g2p_draft_publish/wizards/add_followers.py
@@ -1,19 +1,16 @@
-from odoo import models, fields, api
+from odoo import _, models
from odoo.exceptions import UserError
from odoo.tools import is_html_empty
-from odoo.exceptions import ValidationError
-
# class MailFollowers(models.Model):
# _inherit = 'mail.followers'
-
+
# assignee_id = fields.Many2one('res.users', string='Assignee')
-
class Invite(models.TransientModel):
- _inherit = 'mail.wizard.invite'
-
+ _inherit = "mail.wizard.invite"
+
def add_followers_for_multiple_records(self):
if not self.env.user.email:
raise UserError(_("Unable to post message, please configure the sender's email address."))
@@ -21,35 +18,32 @@ def add_followers_for_multiple_records(self):
email_from = self.env.user.email_formatted
# Ensure active_model and active_ids are present in the context
- if not self._context.get('active_model') or not self._context.get('active_ids'):
+ if not self._context.get("active_model") or not self._context.get("active_ids"):
raise UserError(_("No active model or records specified in the context."))
- active_model = self._context['active_model']
- active_ids = self._context['active_ids']
-
-
+ active_model = self._context["active_model"]
+ active_ids = self._context["active_ids"]
+
# for record_id in active_ids:
# record = self.env[active_model].browse(record_id)
# record.assigned_to = self.env.user
-
Model = self.env[active_model]
documents = Model.browse(active_ids)
for wizard in self:
- new_partners = wizard.partner_ids - documents.sudo().mapped('message_partner_ids')
+ new_partners = wizard.partner_ids - documents.sudo().mapped("message_partner_ids")
# Add the partners as followers
documents.message_subscribe(partner_ids=new_partners.ids)
- model_name = self.env['ir.model']._get(active_model).display_name
+ model_name = self.env["ir.model"]._get(active_model).display_name
# Send a notification if the option is checked and if a message exists
if wizard.notify and wizard.message and not is_html_empty(wizard.message):
for document in documents:
message_values = wizard._prepare_message_values(document, model_name, email_from)
- message_values['partner_ids'] = new_partners.ids
+ message_values["partner_ids"] = new_partners.ids
document.message_notify(**message_values)
- return {'type': 'ir.actions.act_window_close'}
-
+ return {"type": "ir.actions.act_window_close"}
diff --git a/g2p_draft_publish/wizards/add_followers.xml b/g2p_draft_publish/wizards/add_followers.xml
index 13349e2..e2e67d7 100644
--- a/g2p_draft_publish/wizards/add_followers.xml
+++ b/g2p_draft_publish/wizards/add_followers.xml
@@ -1,23 +1,37 @@
-
+
Add Followers
mail.wizard.invite
-
+
primary
-
-
+
+
+ 1
+
+
+
+
+
+
+
+
- Add Followers
+ Add Followers
code
diff --git a/g2p_draft_publish/wizards/rejection.py b/g2p_draft_publish/wizards/rejection.py
index 3ccef00..1b440b5 100644
--- a/g2p_draft_publish/wizards/rejection.py
+++ b/g2p_draft_publish/wizards/rejection.py
@@ -5,52 +5,57 @@
_logger = logging.getLogger(__name__)
-
class RejectWizard(models.TransientModel):
- _name = 'reject.wizard'
- _description = 'Reject Wizard'
+ _name = "reject.wizard"
+ _description = "Reject Wizard"
rejection_reason = fields.Text(string="Reason for Rejection", required=True)
def confirm_rejection(self):
- active_ids = self._context.get('active_ids')
+ active_ids = self._context.get("active_ids")
self.ensure_one()
- record = self.env['draft.imported.record'].browse(active_ids[0])
-
- record.write({
- 'state': 'in_enrichment',
- 'rejection_reason': self.rejection_reason,
- })
-
- record.message_post(
- body=f"Record rejected: {self.rejection_reason}"
-
+ record = self.env["draft.imported.record"].browse(active_ids[0])
+
+ record.write(
+ {
+ "state": "in_enrichment",
+ "rejection_reason": self.rejection_reason,
+ }
)
-
-
- validator_group = self.env.ref("g2p_ati_integrations.group_int_validator")
+
+ record.message_post(body=f"Record rejected: {self.rejection_reason}")
+
+ # validator_group = self.env.ref("g2p_draft_publish.group_int_validator")
+ # validator_users = validator_group.users
+ # matching_users = validator_users.filtered(
+ # lambda user: user.partner_id.id in record.message_partner_ids.ids
+ # )
+
+ validator_group = self.env.ref("g2p_draft_publish.group_int_validator")
+ admin_group = self.env.ref("g2p_draft_publish.group_int_admin")
+ approver_group = self.env.ref("g2p_draft_publish.group_int_approver")
validator_users = validator_group.users
- matching_users = validator_users.filtered(lambda user: user.partner_id.id in record.message_partner_ids.ids)
-
-
-
-
+ exclusive_validator_users = validator_users.filtered(
+ lambda user: user not in admin_group.users and user not in approver_group.users
+ )
+ matching_users = exclusive_validator_users.filtered(
+ lambda user: user.partner_id.id in record.message_partner_ids.ids
+ )
+
if matching_users:
for user in matching_users:
self.env["mail.activity"].create(
- {
- "activity_type_id": self.env.ref(
- "mail.mail_activity_data_todo"
- ).id,
- "res_model_id": self.env["ir.model"]
- .search([("model", "=", "draft.imported.record")])
- .id,
- "res_id": record.id,
- "user_id": user.id,
- # "date_deadline": fields.Date.context_today(self),
- "summary": "Record Rejected",
- "note": f"Reason: {self.rejection_reason}. Please review and sumbit again.",
- }
- )
-
- return {'type': 'ir.actions.act_window_close'}
+ {
+ "activity_type_id": self.env.ref("mail.mail_activity_data_todo").id,
+ "res_model_id": self.env["ir.model"]
+ .search([("model", "=", "draft.imported.record")])
+ .id,
+ "res_id": record.id,
+ "user_id": user.id,
+ # "date_deadline": fields.Date.context_today(self),
+ "summary": "Record Rejected",
+ "note": f"Reason: {self.rejection_reason}. Please review and sumbit again.",
+ }
+ )
+
+ return {"type": "ir.actions.act_window_close"}
diff --git a/g2p_draft_publish/wizards/rejection.xml b/g2p_draft_publish/wizards/rejection.xml
index 7c23876..a0222bc 100644
--- a/g2p_draft_publish/wizards/rejection.xml
+++ b/g2p_draft_publish/wizards/rejection.xml
@@ -1,21 +1,6 @@
-
- draft.imported.record.form
- draft.imported.record
-
-
-
-
@@ -25,10 +10,15 @@
@@ -36,6 +26,10 @@
+
+
+
+
Confirm Rejection
reject.wizard