= Membership Model Visualization = The newly proposed PSF membership model is a great idea and the echo from the PSF members is overwhelmingly positive. There are quite a few details. A picture may help to make these easier to understand. This is an attempt to visualize this. Instead of using a graphics drawing application, I generated the diagram below with a Python program. The source is also attached. So, just where does "the diagram below" appear? - SH This is by no means complete but can serve as a basis for coming up with further details. The advantage is that all these familiar tools and procedures such as version control, pull request and tests can be applied. So far there is no code in methods. It should be possible to add algorithms and make the membership rules executable. Since code is primarily a means of communication between humans and only in the second place instructions for the computer, this little program may help to better understand what we want to express. {{attachment:classes_membership_model.png||align="middle"}} {{{#!highlight python #! /usr/bin/env python3 """The new PSF membership model in code. """ import abc class Member(metaclass=abc.ABCMeta): """A member of the PSF. An abstract concept. """ class IndividualMember(Member): """A personal member. Anyone how would to be associated with the PSF can sign up. """ order_of_magnitude_range = 1e4, 1e5 class InstitutionalMember(Member, metaclass=abc.ABCMeta): """An institutional member of the PSF. An abstract concept. """ def vote(self): """Elect board members. """ class SponsorMember(InstitutionalMember): """Organization that pays to be a member. These can be companies or other institutions. """ order_of_magnitude_range = 1e1, 1e3 class OrganizationMember(InstitutionalMember): """National organizations that are somewhat equivalent to the PSF, but operate in other countries. These organizations should have or work comparable to having a non-profit status. """ order_of_magnitude_range = 1e1, 1e2 class VotingMember(IndividualMember, metaclass=abc.ABCMeta): """An individual member with voting rights. """ def vote(self): """Elect board members. """ class SupportingMember(VotingMember): """A member who gives money. """ order_of_magnitude_range = 1e1, 1e3 class ManagingMember(VotingMember): """A member who gives time. """ order_of_magnitude_range = 1e1, 1e2 class ContributingMember(VotingMember): """A member who gives code, documentation etc. """ order_of_magnitude_range = 1e1, 1e2 class Fellow(ManagingMember, ContributingMember): # No sequence of parents intended but need to specify one. """Elected from among the members. """ order_of_magnitude_range = 1e1, 1e2 class BoardMember(Fellow): # No sequence of parents intended but need to specify one. """Elected from among the fellows. """ order_of_magnitude_range = 1e0, 1e1 class WorkingGroup: """A working group. """ """ }}}