Loading __init__.py +21 −23 Original line number Diff line number Diff line Loading @@ -12,7 +12,8 @@ __all__ = ['register'] def register(): Pool.register(account.Move, Pool.register( account.Move, configuration.Configuration, configuration.MemberSequence, ir.Cron, Loading @@ -23,15 +24,12 @@ def register(): membership.Fee, membership.Line, membership.GenerateFeeStart, module='association', type_='model') Pool.register(member.MembersBookWizard, module='association', type_='model') Pool.register( member.MembersBookWizard, membership.PostFee, membership.GenerateFee, module='association', type_='wizard') Pool.register(member.MembersBookReport, module='association', type_='report') module='association', type_='wizard') Pool.register( member.MembersBookReport, module='association', type_='report') configuration.py +15 −17 Original line number Diff line number Diff line Loading @@ -14,21 +14,19 @@ class Configuration(ModelSingleton, ModelSQL, ModelView, """Association Configuration""" __name__ = 'association.configuration' member_sequence = fields.MultiValue( fields.Many2One('ir.sequence', "Member Sequence", required=True, fields.Many2One('ir.sequence', "Member Sequence", required=True, domain=[ ('company', 'in', [Eval('context', {}).get('company', -1), None]), ('code', '=', 'association.member'), ])) ], help="Used to generate the number given to association members.")) class MemberSequence(ModelSQL, CompanyValueMixin): """Member Configuration Sequence""" __name__ = 'association.configuration.member_sequence' member_sequence = fields.Many2One('ir.sequence', "Member Sequence", member_sequence = fields.Many2One('ir.sequence', "Member Sequence", required=True, domain=[ ('company', 'in', Loading configuration.xml +7 −11 Original line number Diff line number Diff line <?xml version="1.0" ?> <!-- This file is part of Tryton. The COPYRIGHT file at the top level of this repository contains the full copyright notices and license terms. --> <tryton> <data> <record model="ir.ui.view" id="association_configuration_view_form"> Loading @@ -10,25 +12,19 @@ <field name="name">Member Configuration</field> <field name="res_model">association.configuration</field> </record> <record model="ir.action.act_window.view" id="act_association_configuration_view1"> <record model="ir.action.act_window.view" id="act_association_configuration_view1"> <field name="sequence" eval="1"/> <field name="view" ref="association_configuration_view_form"/> <field name="act_window" ref="act_association_configuration_form"/> </record> <menuitem parent="menu_configuration" action="act_association_configuration_form" id="menu_association_configuration" sequence="0" icon="tryton-list"/> <record model="ir.ui.menu-res.group" id="menu_association_configuration_group_member_admin"> <menuitem parent="menu_configuration" action="act_association_configuration_form" id="menu_association_configuration" sequence="0" icon="tryton-list"/> <record model="ir.ui.menu-res.group" id="menu_association_configuration_group_member_admin"> <field name="menu" ref="menu_association_configuration"/> <field name="group" ref="group_association_admin"/> </record> </data> <data noupdate="1"> <record model="association.configuration.member_sequence" id="configuration_member_sequence"> <record model="association.configuration.member_sequence" id="configuration_member_sequence"> <field name="member_sequence" ref="sequence_member"/> </record> </data> Loading icons/tryton-association.svg 0 → 100644 +1 −0 Original line number Diff line number Diff line <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M0 0h24v24H0z" fill="none"/><path d="M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z"/></svg> No newline at end of file member.py +38 −52 Original line number Diff line number Diff line # This file is part of Tryton. The COPYRIGHT file at the top level of # this repository contains the full copyright notices and license terms. from trytond.model import Workflow, ModelView, ModelSQL, fields, Unique from trytond.pyson import Eval, If from trytond.transaction import Transaction Loading @@ -8,6 +7,7 @@ from trytond.pool import Pool from trytond.i18n import gettext from trytond.wizard import Wizard, StateView, Button, StateReport from trytond.report import Report from .exceptions import MemberUnpaidFeeError __all__ = [ Loading Loading @@ -35,59 +35,45 @@ class Member(Workflow, ModelSQL, ModelView): 'on_change_with_party_name', searcher='search_party_member') state = fields.Selection(STATES, 'State', readonly=True) code = fields.Char('Code', required=True, select=True, code = fields.Char('Code', required=True, select=True, states={'readonly': Eval('code_readonly', True)}, depends=['code_readonly'], help="The unique identifier of the associate.") help="The internal identifier for the associate.") code_readonly = fields.Function(fields.Boolean('Code Readonly'), 'get_code_readonly') company = fields.Many2One('company.company', 'Company', states=_STATE, company = fields.Many2One('company.company', 'Company', states=_STATE, depends=_DEPENDS, required=True, help="The association this member belongs to") party = fields.Many2One('party.party', 'Party', states=_STATE, help="The association this member belongs to.") party = fields.Many2One('party.party', 'Party', states=_STATE, depends=_DEPENDS, required=True, help="The party representing this member") help="The party that represents the member.") join_date = fields.Date('Join Date', states={'readonly': Eval('state') != 'draft'}, domain=[ If( (Eval('join_date')) & (Eval('leave_date')), ('join_date', '<=', Eval('leave_date')), (), ) ], )], depends=['leave_date', 'state'], states={'readonly': Eval('state') != 'draft'}, help="When the member joins the association.") help="The date the member joined the association.") leave_date = fields.Date('Leave Date', domain=[ If( (Eval('join_date')) & (Eval('leave_date')), (Eval('join_date')) & (Eval('leave_date')), ('leave_date', '>=', Eval('join_date')), (), ) ], )], depends=['join_date', 'state'], states={ 'readonly': Eval('state') != 'running', 'invisible': ~Eval('state').in_(['running', 'stopped']) 'readonly': Eval('state') != 'running', 'invisible': ~Eval('state').in_(['running', 'stopped']) }, help="When the member leaves the association.") memberships = fields.One2Many( 'association.membership.line', 'member', help="The date the member left the association.") memberships = fields.One2Many('association.membership.line', 'member', "Memberships", depends=['state'], states={'readonly': Eval('state') != 'draft'}) Loading Loading
__init__.py +21 −23 Original line number Diff line number Diff line Loading @@ -12,7 +12,8 @@ __all__ = ['register'] def register(): Pool.register(account.Move, Pool.register( account.Move, configuration.Configuration, configuration.MemberSequence, ir.Cron, Loading @@ -23,15 +24,12 @@ def register(): membership.Fee, membership.Line, membership.GenerateFeeStart, module='association', type_='model') Pool.register(member.MembersBookWizard, module='association', type_='model') Pool.register( member.MembersBookWizard, membership.PostFee, membership.GenerateFee, module='association', type_='wizard') Pool.register(member.MembersBookReport, module='association', type_='report') module='association', type_='wizard') Pool.register( member.MembersBookReport, module='association', type_='report')
configuration.py +15 −17 Original line number Diff line number Diff line Loading @@ -14,21 +14,19 @@ class Configuration(ModelSingleton, ModelSQL, ModelView, """Association Configuration""" __name__ = 'association.configuration' member_sequence = fields.MultiValue( fields.Many2One('ir.sequence', "Member Sequence", required=True, fields.Many2One('ir.sequence', "Member Sequence", required=True, domain=[ ('company', 'in', [Eval('context', {}).get('company', -1), None]), ('code', '=', 'association.member'), ])) ], help="Used to generate the number given to association members.")) class MemberSequence(ModelSQL, CompanyValueMixin): """Member Configuration Sequence""" __name__ = 'association.configuration.member_sequence' member_sequence = fields.Many2One('ir.sequence', "Member Sequence", member_sequence = fields.Many2One('ir.sequence', "Member Sequence", required=True, domain=[ ('company', 'in', Loading
configuration.xml +7 −11 Original line number Diff line number Diff line <?xml version="1.0" ?> <!-- This file is part of Tryton. The COPYRIGHT file at the top level of this repository contains the full copyright notices and license terms. --> <tryton> <data> <record model="ir.ui.view" id="association_configuration_view_form"> Loading @@ -10,25 +12,19 @@ <field name="name">Member Configuration</field> <field name="res_model">association.configuration</field> </record> <record model="ir.action.act_window.view" id="act_association_configuration_view1"> <record model="ir.action.act_window.view" id="act_association_configuration_view1"> <field name="sequence" eval="1"/> <field name="view" ref="association_configuration_view_form"/> <field name="act_window" ref="act_association_configuration_form"/> </record> <menuitem parent="menu_configuration" action="act_association_configuration_form" id="menu_association_configuration" sequence="0" icon="tryton-list"/> <record model="ir.ui.menu-res.group" id="menu_association_configuration_group_member_admin"> <menuitem parent="menu_configuration" action="act_association_configuration_form" id="menu_association_configuration" sequence="0" icon="tryton-list"/> <record model="ir.ui.menu-res.group" id="menu_association_configuration_group_member_admin"> <field name="menu" ref="menu_association_configuration"/> <field name="group" ref="group_association_admin"/> </record> </data> <data noupdate="1"> <record model="association.configuration.member_sequence" id="configuration_member_sequence"> <record model="association.configuration.member_sequence" id="configuration_member_sequence"> <field name="member_sequence" ref="sequence_member"/> </record> </data> Loading
icons/tryton-association.svg 0 → 100644 +1 −0 Original line number Diff line number Diff line <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M0 0h24v24H0z" fill="none"/><path d="M16 11c1.66 0 2.99-1.34 2.99-3S17.66 5 16 5c-1.66 0-3 1.34-3 3s1.34 3 3 3zm-8 0c1.66 0 2.99-1.34 2.99-3S9.66 5 8 5C6.34 5 5 6.34 5 8s1.34 3 3 3zm0 2c-2.33 0-7 1.17-7 3.5V19h14v-2.5c0-2.33-4.67-3.5-7-3.5zm8 0c-.29 0-.62.02-.97.05 1.16.84 1.97 1.97 1.97 3.45V19h6v-2.5c0-2.33-4.67-3.5-7-3.5z"/></svg> No newline at end of file
member.py +38 −52 Original line number Diff line number Diff line # This file is part of Tryton. The COPYRIGHT file at the top level of # this repository contains the full copyright notices and license terms. from trytond.model import Workflow, ModelView, ModelSQL, fields, Unique from trytond.pyson import Eval, If from trytond.transaction import Transaction Loading @@ -8,6 +7,7 @@ from trytond.pool import Pool from trytond.i18n import gettext from trytond.wizard import Wizard, StateView, Button, StateReport from trytond.report import Report from .exceptions import MemberUnpaidFeeError __all__ = [ Loading Loading @@ -35,59 +35,45 @@ class Member(Workflow, ModelSQL, ModelView): 'on_change_with_party_name', searcher='search_party_member') state = fields.Selection(STATES, 'State', readonly=True) code = fields.Char('Code', required=True, select=True, code = fields.Char('Code', required=True, select=True, states={'readonly': Eval('code_readonly', True)}, depends=['code_readonly'], help="The unique identifier of the associate.") help="The internal identifier for the associate.") code_readonly = fields.Function(fields.Boolean('Code Readonly'), 'get_code_readonly') company = fields.Many2One('company.company', 'Company', states=_STATE, company = fields.Many2One('company.company', 'Company', states=_STATE, depends=_DEPENDS, required=True, help="The association this member belongs to") party = fields.Many2One('party.party', 'Party', states=_STATE, help="The association this member belongs to.") party = fields.Many2One('party.party', 'Party', states=_STATE, depends=_DEPENDS, required=True, help="The party representing this member") help="The party that represents the member.") join_date = fields.Date('Join Date', states={'readonly': Eval('state') != 'draft'}, domain=[ If( (Eval('join_date')) & (Eval('leave_date')), ('join_date', '<=', Eval('leave_date')), (), ) ], )], depends=['leave_date', 'state'], states={'readonly': Eval('state') != 'draft'}, help="When the member joins the association.") help="The date the member joined the association.") leave_date = fields.Date('Leave Date', domain=[ If( (Eval('join_date')) & (Eval('leave_date')), (Eval('join_date')) & (Eval('leave_date')), ('leave_date', '>=', Eval('join_date')), (), ) ], )], depends=['join_date', 'state'], states={ 'readonly': Eval('state') != 'running', 'invisible': ~Eval('state').in_(['running', 'stopped']) 'readonly': Eval('state') != 'running', 'invisible': ~Eval('state').in_(['running', 'stopped']) }, help="When the member leaves the association.") memberships = fields.One2Many( 'association.membership.line', 'member', help="The date the member left the association.") memberships = fields.One2Many('association.membership.line', 'member', "Memberships", depends=['state'], states={'readonly': Eval('state') != 'draft'}) Loading