class TabledDocument(ParliamentaryItem): """ Tabled documents: a tabled document captures metadata about the document (owner, date, title, description) and can have multiple physical documents attached. The tabled documents form should have the following : -Document title -Document link -Upload field (s) -Document source / author agency (who is providing the document) (=> new table agencies) -Document submitter (who is submitting the document) (a person -> normally mp can be other user) It must be possible to schedule a tabled document for a sitting. """ consignatory = one2many("consignatory", "bungeni.models.domain.ConsignatoryContainer", "item_id") event = one2many("event", "bungeni.models.domain.EventItemContainer", "item_id") versions = one2many( "versions", "bungeni.models.domain.TabledDocumentVersionContainer", "content_id") listings_class = ListTabledDocument
class Ministry(Group): """ a government ministry """ ministers = one2many("ministers", "bungeni.models.domain.MinisterContainer", "group_id") questions = one2many("questions", "bungeni.models.domain.QuestionContainer", "ministry_id") bills = one2many("bills", "bungeni.models.domain.BillContainer", "ministry_id")
class Constituency(Entity): """ a locality region, which elects an MP """ cdetail = one2many("cdetail", "bungeni.models.domain.ConstituencyDetailContainer", "constituency_id") sort_replace = {'province_id': ['province'], 'region_id': ['region']} parliamentmembers = one2many( "parliamentmembers", "bungeni.models.domain.MemberOfParliamentContainer", "constituency_id") listings_class = ListConstituency interface.implements(interfaces.ITranslatable)
class Motion(ParliamentaryItem): consignatory = one2many("consignatory", "bungeni.models.domain.ConsignatoryContainer", "item_id") event = one2many("event", "bungeni.models.domain.EventItemContainer", "item_id") versions = one2many("versions", "bungeni.models.domain.MotionVersionContainer", "content_id") sort_on = ['motion_number', 'submission_date'] sort_dir = 'desc' listings_class = ListMotion
class Bill(ParliamentaryItem): consignatory = one2many("consignatory", "bungeni.models.domain.ConsignatoryContainer", "item_id") event = one2many("event", "bungeni.models.domain.EventItemContainer", "item_id") assignedgroups = one2many( "assignedgroups", "bungeni.models.domain.GroupGroupItemAssignmentContainer", "item_id") versions = one2many("versions", "bungeni.models.domain.BillVersionContainer", "content_id") sort_on = ['submission_date'] sort_dir = 'desc' listings_class = ListBill
class Sitting(GroupSitting): """ A Sitting """ interface.implements(interfaces.IBungeniTranscriptsSitting) transcripts2 = one2many("transcripts2", "bungeni.transcripts.domain.TranscriptContainer", "sitting_id")
class Minister(GroupMembership): """ A Minister defined by its user_group_membership in a ministry (group) """ titles = one2many("titles", "bungeni.models.domain.MemberRoleTitleContainer", "membership_id") listings_class = ListMinister
class Government(Group): """ a government """ sort_on = ['start_date'] ministries = one2many("ministries", "bungeni.models.domain.MinistryContainer", "parent_group_id") listings_class = ListGovernment
class PartyMember(GroupMembership): """ Member of a political party or group, defined by its group membership """ titles = one2many("titles", "bungeni.models.domain.MemberRoleTitleContainer", "membership_id") listings_class = ListPartyMember
class CommitteeMember(GroupMembership): """ A Member of a committee defined by its membership to a committee (group)""" titles = one2many("titles", "bungeni.models.domain.MemberRoleTitleContainer", "membership_id") listings_class = ListCommitteeMember
class ParliamentaryItem(Entity): """ """ interface.implements(interfaces.IBungeniContent, interfaces.ITranslatable) # interfaces.IHeadFileAttachments) sort_replace = {'owner_id': ['last_name', 'first_name']} files = one2many("files", "bungeni.models.domain.AttachedFileContainer", "item_id")
class CommitteeStaff(GroupMembership): """ Comittee Staff """ titles = one2many("titles", "bungeni.models.domain.MemberRoleTitleContainer", "membership_id") listings_class = ListCommitteeStaff
class Province(Entity): """ Province of the Constituency """ constituencies = one2many("constituencies", "bungeni.models.domain.ConstituencyContainer", "province_id") interface.implements(interfaces.ITranslatable)
class Region(Entity): """ Region of the constituency """ constituencies = one2many("constituencies", "bungeni.models.domain.ConstituencyContainer", "region_id") interface.implements(interfaces.ITranslatable)
class AgendaItem(ParliamentaryItem): """ Generic Agenda Item that can be scheduled on a sitting """ versions = one2many("versions", "bungeni.models.domain.AgendaItemVersionContainer", "content_id") listings_class = ListAgendaItem
class GroupSitting(Entity): """Scheduled meeting for a group (parliament, committee, etc)""" interface.implements(interfaces.ITranslatable) attendance = one2many( "attendance", "bungeni.models.domain.GroupSittingAttendanceContainer", "sitting_id") items = one2many("items", "bungeni.models.domain.ItemScheduleContainer", "sitting_id") sreports = one2many("sreports", "bungeni.models.domain.Report4SittingContainer", "sitting_id") @property def short_name(self): return self.start_date.strftime('%d %b %y %H:%M')
class Transcript(ParliamentaryItem): """ A Transcript """ #interface.implements( interfaces.IAgendaItem ) #interface.implements( bmi.IBungeniContent, interfaces.IBungeniTranscript ) versions = one2many( "versions", "bungeni.transcripts.domain.TranscriptVersionContainer", "content_id")
class Question(ParliamentaryItem): #supplementaryquestions = one2many("supplementaryquestions", #"bungeni.models.domain.QuestionContainer", "supplement_parent_id") event = one2many("event", "bungeni.models.domain.EventItemContainer", "item_id") consignatory = one2many("consignatory", "bungeni.models.domain.ConsignatoryContainer", "item_id") versions = one2many("versions", "bungeni.models.domain.QuestionVersionContainer", "content_id") sort_on = ['question_number', 'submission_date'] sort_dir = 'desc' listings_class = ListQuestion def getParentQuestion(self): if self.supplement_parent_id: session = Session() parent = session.query(Question).get(self.supplement_parent_id) return parent.short_name
class MemberOfParliament(GroupMembership): """ defined by groupmembership and additional data """ sort_on = ['last_name', 'first_name', 'middle_name'] sort_replace = { "user_id": ["last_name", "first_name"], "constituency_id": ["name"], "party_id": ["name"] } titles = one2many("titles", "bungeni.models.domain.MemberRoleTitleContainer", "membership_id") listings_class = ListMemberOfParliament
class Committee(Group): """ a parliamentary committee of MPs """ committeemembers = one2many( "committeemembers", "bungeni.models.domain.CommitteeMemberContainer", "group_id") committeestaff = one2many("committeestaff", "bungeni.models.domain.CommitteeStaffContainer", "group_id") agendaitems = one2many("agendaitems", "bungeni.models.domain.AgendaItemContainer", "group_id") sittings = one2many("sittings", "bungeni.models.domain.GroupSittingContainer", "group_id") sort_replace = { 'committee_type_id': [ 'committee_type', ] } assigneditems = one2many( "assigneditems", "bungeni.models.domain.ItemGroupItemAssignmentContainer", "group_id") listings_class = ListCommittee
class ItemSchedule(Entity): """ for which sitting was a parliamentary item scheduled """ discussions = one2many( "discussions", "bungeni.models.domain.ScheduledItemDiscussionContainer", "schedule_id") @property def getItem(self): session = Session() s_item = self.item s_item.__parent__ = self return s_item @property def getDiscussion(self): session = Session() s_discussion = self.discussion s_discussion.__parent__ = self return s_discussion
class Parliament(Group): """ a parliament """ sort_on = ['start_date'] sessions = one2many("sessions", "bungeni.models.domain.ParliamentSessionContainer", "parliament_id") committees = one2many("committees", "bungeni.models.domain.CommitteeContainer", "parent_group_id") governments = one2many("governments", "bungeni.models.domain.GovernmentContainer", "parent_group_id") parliamentmembers = one2many( "parliamentmembers", "bungeni.models.domain.MemberOfParliamentContainer", "group_id") politicalgroups = one2many( "politicalgroups", "bungeni.models.domain.PoliticalGroupContainer", "parent_group_id") bills = one2many("bills", "bungeni.models.domain.BillContainer", "parliament_id") questions = one2many("questions", "bungeni.models.domain.QuestionContainer", "parliament_id") motions = one2many("motions", "bungeni.models.domain.MotionContainer", "parliament_id") sittings = one2many("sittings", "bungeni.models.domain.GroupSittingContainer", "group_id") offices = one2many("offices", "bungeni.models.domain.OfficeContainer", "parent_group_id") agendaitems = one2many("agendaitems", "bungeni.models.domain.AgendaItemContainer", "group_id") tableddocuments = one2many( "tableddocuments", "bungeni.models.domain.TabledDocumentContainer", "parliament_id") preports = one2many("preports", "bungeni.models.domain.ReportContainer", "group_id") listings_class = ListParliament
class PoliticalParty(PoliticalEntity): """ a political party (ouside the parliament) """ partymembers = one2many("partymembers", "bungeni.models.domain.PartyMemberContainer", "group_id")
class User(Entity): """Domain Object For A User. General representation of a person """ interface.implements(interfaces.IBungeniUser, interfaces.ITranslatable) def __init__(self, login=None, **kw): if login: self.login = login super(User, self).__init__(**kw) self.salt = self._makeSalt() def _makeSalt(self): return ''.join(random.sample(string.letters[:52], 12)) def setPassword(self, password): self.password = self.encode(password) def getPassword(self): return None def encode(self, password): return md5.md5(password + self.salt).hexdigest() def checkPassword(self, password_attempt): attempt = self.encode(password_attempt) return attempt == self.password def _get_status(self): return self.active_p def _set_status(self, value): self.active_p = value status = property(_get_status, _set_status) @property def fullname(self): return "%s %s" % (self.first_name, self.last_name) sort_on = ['last_name', 'first_name', 'middle_name'] sort_replace = {'user_id': ['last_name', 'first_name']} addresses = one2many("addresses", "bungeni.models.domain.UserAddressContainer", "user_id") delegations = one2many("delegations", "bungeni.models.domain.UserDelegationContainer", "user_id") _password = property(getPassword, setPassword) bills = one2many("bills", "bungeni.models.domain.BillContainer", "owner_id") questions = one2many("questions", "bungeni.models.domain.QuestionContainer", "owner_id") motions = one2many("motions", "bungeni.models.domain.MotionContainer", "owner_id") agendaitems = one2many("agendaitems", "bungeni.models.domain.AgendaItemContainer", "owner_id") tableddocuments = one2many( "tableddocuments", "bungeni.models.domain.TabledDocumentContainer", "owner_id")
class PoliticalGroup(PoliticalEntity): """ a political group in a parliament """ partymembers = one2many("partymembers", "bungeni.models.domain.PartyMemberContainer", "group_id")
class AttachedFile(Entity): "Files attached to a parliamentary item" versions = one2many("versions", "bungeni.models.domain.AttachedFileVersionContainer", "content_id")
class OfficeMember(GroupMembership): """ clerks, .... """ titles = one2many("titles", "bungeni.models.domain.MemberRoleTitleContainer", "membership_id") listings_class = ListOfficeMember
class Office(Group): """ parliamentary Office like speakers office, clerks office etc. internal only""" officemembers = one2many("officemembers", "bungeni.models.domain.OfficeMemberContainer", "group_id")