Skip to content

Commit 77bda71

Browse files
committed
[IMP] make event data more dynamic
1 parent 1ea278a commit 77bda71

22 files changed

+1783
-152
lines changed

spp_event_data/models/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
# Part of OpenSPP. See LICENSE file for full copyright and licensing details.
22

33
from . import event_data
4+
from . import event_mixin
5+
from . import ir_model
46
from . import registrant

spp_event_data/models/event_data.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,16 @@ def open_form(self):
8585
"edit": False,
8686
}
8787
res_model = rec.model
88-
view_id = self.env[res_model].get_view_id()
88+
89+
# Get view_id - check if model has get_view_id method or find it directly
90+
view_id = False
91+
if hasattr(self.env[res_model], "get_view_id"):
92+
view_id = self.env[res_model].get_view_id()
93+
else:
94+
# Fallback for dynamic models without the mixin
95+
view = self.env["ir.ui.view"].search([("model", "=", res_model), ("type", "=", "form")], limit=1)
96+
view_id = view.id if view else False
97+
8998
return {
9099
"name": rec.name,
91100
"view_mode": "form",
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# Part of OpenSPP. See LICENSE file for full copyright and licensing details.
2+
3+
from odoo import api, models
4+
5+
6+
class SPPEventMixin(models.AbstractModel):
7+
"""
8+
Mixin for event type models.
9+
Provides common functionality for all event types.
10+
"""
11+
12+
_name = "spp.event.mixin"
13+
_description = "SPP Event Mixin"
14+
15+
@api.model
16+
def _register_hook(self):
17+
"""
18+
Mark this model as an event model automatically.
19+
All models inheriting from this mixin will be registered as event types.
20+
"""
21+
super()._register_hook()
22+
ir_model = self.env["ir.model"].search([("model", "=", self._name)], limit=1)
23+
if ir_model and not ir_model.is_event_model:
24+
ir_model.sudo().write({"is_event_model": True})
25+
26+
def get_view_id(self):
27+
"""
28+
Retrieve the form view ID for this event model.
29+
This is used by the event wizard to open the appropriate form.
30+
"""
31+
return self.env["ir.ui.view"].search([("model", "=", self._name), ("type", "=", "form")], limit=1).id

spp_event_data/models/ir_model.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# Part of OpenSPP. See LICENSE file for full copyright and licensing details.
2+
3+
from odoo import fields, models
4+
5+
6+
class IrModel(models.Model):
7+
_inherit = "ir.model"
8+
9+
is_event_model = fields.Boolean(
10+
string="Is Event Model",
11+
default=False,
12+
help="Indicates if this model represents an event type for the event tracking system",
13+
)

spp_event_data/wizard/create_event_wizard.py

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,42 @@
11
# Part of OpenG2P. See LICENSE file for full copyright and licensing details.
22

3+
import logging
34
from datetime import date
45

5-
from odoo import _, fields, models
6+
from odoo import _, api, fields, models
7+
8+
_logger = logging.getLogger(__name__)
69

710

811
class SPPCreateEventWizard(models.TransientModel):
912
_name = "spp.create.event.wizard"
1013
_description = "Create Event Wizard"
1114

15+
@api.model
16+
def _get_event_data_model_selection(self):
17+
"""
18+
Dynamically get event types from models marked as event models.
19+
Returns a list of tuples (model_name, model_display_name).
20+
"""
21+
# Start with default
22+
selection = [("default", "None")]
23+
24+
# Query all models marked as event models
25+
event_models = self.env["ir.model"].search([("is_event_model", "=", True)], order="name")
26+
27+
for event_model in event_models:
28+
selection.append((event_model.model, event_model.name))
29+
_logger.debug(
30+
"Added event type to wizard: %s (%s)",
31+
event_model.model,
32+
event_model.name,
33+
)
34+
35+
return selection
36+
1237
event_data_model = fields.Selection(
13-
[("default", "None")],
14-
"Event Type",
38+
selection="_get_event_data_model_selection",
39+
string="Event Type",
1540
default="default",
1641
)
1742
partner_id = fields.Many2one("res.partner", domain=[("is_registrant", "=", True)])
@@ -50,6 +75,27 @@ def next_page(self):
5075
for split_wizard in wizard_list:
5176
wizard_model += "%s." % split_wizard
5277
wizard_model += "wizard"
78+
79+
# Check if specific wizard exists
80+
wizard_exists = wizard_model in self.env
81+
82+
if not wizard_exists:
83+
# Try to find a generic wizard (for dynamic models)
84+
generic_wizard = "%s.create.dynamic.event.wizard" % wizard_list[0]
85+
if generic_wizard in self.env:
86+
wizard_model = generic_wizard
87+
_logger.info(
88+
"Using generic wizard %s for model %s",
89+
wizard_model,
90+
model_name,
91+
)
92+
else:
93+
_logger.warning(
94+
"No wizard found for model %s, skipping wizard step",
95+
model_name,
96+
)
97+
return
98+
5399
view_id = rec.get_view_id(wizard_model)
54100

55101
# create the event data and pass it to event_data_model wizard

spp_event_demo/models/house_visit.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
class OpenSPPHouseVisit(models.Model):
88
_name = "spp.event.house.visit"
9+
_inherit = "spp.event.mixin"
910
_description = "House Visit"
1011

1112
summary = fields.Char()
@@ -17,9 +18,3 @@ class OpenSPPHouseVisit(models.Model):
1718
number_of_cows = fields.Integer()
1819
no_food_stock = fields.Integer()
1920
disabled = fields.Boolean(default=False)
20-
21-
def get_view_id(self):
22-
"""
23-
This retrieves the View ID of this model
24-
"""
25-
return self.env["ir.ui.view"].search([("model", "=", self._name), ("type", "=", "form")], limit=1).id

spp_event_demo/models/phone_survey.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,8 @@
66

77
class OpenSPPPhoneSurvey(models.Model):
88
_name = "spp.event.phone.survey"
9+
_inherit = "spp.event.mixin"
910
_description = "Phone Survey"
1011

1112
summary = fields.Char()
1213
description = fields.Text()
13-
14-
def get_view_id(self):
15-
"""
16-
This retrieves the View ID of this model
17-
"""
18-
return self.env["ir.ui.view"].search([("model", "=", self._name), ("type", "=", "form")], limit=1).id

spp_event_demo/models/school_enrolment.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,9 @@
66

77
class OpenSPPSchoolEnrolmentRecord(models.Model):
88
_name = "spp.event.schoolenrolment.record"
9+
_inherit = "spp.event.mixin"
910
_description = "School Enrolment Record"
1011

1112
school_name = fields.Char()
1213
enrolment_type = fields.Char()
1314
date = fields.Date()
14-
15-
def get_view_id(self):
16-
"""
17-
This retrieves the View ID of this model
18-
"""
19-
return self.env["ir.ui.view"].search([("model", "=", self._name), ("type", "=", "form")], limit=1).id

spp_event_demo/wizard/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
from . import create_event_wizard
21
from . import create_event_house_visit_wizard
32
from . import create_event_phone_survey_wizard
43
from . import create_event_school_enrolment_wizard

spp_event_demo/wizard/create_event_wizard.py

Lines changed: 0 additions & 15 deletions
This file was deleted.

0 commit comments

Comments
 (0)