1
- from odoo import fields , models
1
+ from odoo import api , fields , models
2
2
3
3
4
4
class MembershipGroupMember (models .Model ):
5
5
_name = "membership.group.member"
6
6
_description = "Membership Group Member"
7
7
8
+ active = fields .Boolean (default = True )
8
9
partner_id = fields .Many2one ("res.partner" , required = True , ondelete = "cascade" )
9
10
group_id = fields .Many2one ("membership.group" , required = True , ondelete = "cascade" )
10
11
wants_to_collaborate = fields .Boolean ()
@@ -18,11 +19,55 @@ class MembershipGroupMember(models.Model):
18
19
("committee" , "Committee" ),
19
20
],
20
21
)
22
+ date_from = fields .Date (
23
+ default = fields .Date .context_today ,
24
+ help = "Start date of the membership" ,
25
+ )
26
+ date_to = fields .Date (
27
+ compute = "_compute_date_to" ,
28
+ store = True ,
29
+ readonly = False ,
30
+ precompute = True ,
31
+ help = "Planned end date of the membership" ,
32
+ )
33
+ date_end = fields .Date (
34
+ help = "End date of the membership" ,
35
+ )
36
+ can_revoke_membership = fields .Boolean (compute = "_compute_can_revoke_membership" )
21
37
22
38
_sql_constraints = [
23
39
(
24
40
"partner_group_uniq" ,
25
- "unique(partner_id, group_id)" ,
41
+ "unique(active, partner_id, group_id)" ,
26
42
"Member already exists for this group!" ,
27
43
)
28
44
]
45
+
46
+ @api .depends ("group_id" )
47
+ def _compute_date_to (self ):
48
+ for record in self :
49
+ if (
50
+ not record .date_to
51
+ and record .group_id
52
+ and record .group_id ._has_termination_cycle ()
53
+ ):
54
+ record .date_to = record .group_id .next_termination_date
55
+
56
+ @api .depends ("date_to" )
57
+ def _compute_can_revoke_membership (self ):
58
+ for record in self :
59
+ record .can_revoke_membership = record ._can_revoke_membership ()
60
+
61
+ def _can_revoke_membership (self ):
62
+ self .ensure_one ()
63
+ return self .date_to < fields .Date .today () if self .date_to else True
64
+
65
+ def action_revoke_membership (self ):
66
+ if active_records := self .filtered (lambda x : x .active ):
67
+ active_records .active = False
68
+ active_records .date_end = fields .Date .today ()
69
+ return True
70
+
71
+ @api .model
72
+ def _cron_revoke_membership (self ):
73
+ self .search ([("date_to" , "<=" , fields .date .today ())]).action_revoke_membership ()
0 commit comments