class Body(Model): """ A meeting body. This can be full council, a subcommittee, or "off-council" matters such as election debates. """ id = fields.IDField() name = fields.TextField(required=True) description = fields.TextField() start_datetime = fields.DateTime(required=True) end_datetime = fields.DateTime() is_active = fields.BooleanField(required=True) external_source_id = fields.TextField() class Meta: ignore_none_field = False @classmethod def Example(cls) -> Model: body = cls() body.name = "Full Council" body.is_active = True body.start_datetime = datetime.utcnow() return body _PRIMARY_KEYS = ("name", ) _INDEXES = ()
class Person(Model): """ Primarily the council members, this could technically include the mayor or city manager, or any other "normal" presenters and attendees of meetings. """ name = fields.TextField(required=True) router_string = fields.TextField( required=True, validator=validators.router_string_is_valid) email = fields.TextField(validator=validators.email_is_valid) phone = fields.NumberField() website = fields.TextField(validator=validators.resource_exists) picture_ref = fields.ReferenceField(File) is_active = fields.BooleanField(required=True) external_source_id = fields.TextField() @classmethod def Example(cls) -> Model: person = cls() person.name = "M. Lorena González" person.router_string = "lorena-gonzalez" person.is_active = True return person _PRIMARY_KEYS = ("name", ) _INDEXES = ()
class Person(Model): """ Primarily the council members, this could technically include the mayor or city manager, or any other "normal" presenters and attendees of meetings. """ id = fields.IDField() name = fields.TextField(required=True) router_string = fields.TextField( required=True, validator=validators.router_string_is_valid) email = fields.TextField(validator=validators.email_is_valid) phone = fields.TextField() website = fields.TextField(validator=validators.resource_exists) picture_ref = fields.ReferenceField(File, auto_load=False) is_active = fields.BooleanField(required=True) external_source_id = fields.TextField() class Meta: ignore_none_field = False def set_validator_kwargs(self, kwargs: Dict) -> None: field = fields.TextField( validator=validators.resource_exists, validator_kwargs=kwargs, ) field.contribute_to_model(Person, "website") @classmethod def Example(cls) -> Model: person = cls() person.name = "M. Lorena González" person.router_string = "lorena-gonzalez" person.is_active = True return person _PRIMARY_KEYS = ("name", ) _INDEXES = () @staticmethod def strip_accents(name: str) -> str: return "".join(char for char in unicodedata.normalize("NFKD", name) if unicodedata.category(char) != "Mn") @staticmethod def generate_router_string(name: str) -> str: non_accented = Person.strip_accents(name) char_cleaner = re.compile(r"[^a-zA-Z0-9\s\-]") char_cleaned = re.sub(char_cleaner, "", non_accented) whitespace_cleaner = re.compile(r"[\s]+") whitespace_cleaned = re.sub(whitespace_cleaner, " ", char_cleaned) spaces_replaced = whitespace_cleaned.replace(" ", "-") if spaces_replaced[-1] == "-": fully_cleaned = spaces_replaced[:-1] else: fully_cleaned = spaces_replaced return fully_cleaned.lower()
class Vote(Model): """ A reference tying a specific person and an event minutes item together. """ id = fields.IDField() matter_ref = fields.ReferenceField(Matter, required=True, auto_load=False) event_ref = fields.ReferenceField(Event, required=True, auto_load=False) event_minutes_item_ref = fields.ReferenceField(EventMinutesItem, required=True, auto_load=False) person_ref = fields.ReferenceField(Person, required=True, auto_load=False) decision = fields.TextField( required=True, validator=validators.create_constant_value_validator( VoteDecision, True), ) in_majority = fields.BooleanField() external_source_id = fields.TextField() class Meta: ignore_none_field = False @classmethod def Example(cls) -> Model: vote = cls() vote.matter_ref = Matter.Example() vote.event_ref = Event.Example() vote.event_minutes_item_ref = EventMinutesItem.Example() vote.person_ref = Person.Example() vote.decision = VoteDecision.APPROVE vote.in_majority = True return vote _PRIMARY_KEYS = ( "matter_ref", "event_ref", "event_minutes_item_ref", "person_ref", "decision", ) _INDEXES = (IndexedFieldSet(( IndexedField(name="event_ref", order=Order.ASCENDING), IndexedField(name="person_ref", order=Order.ASCENDING), )), )
class Vote(Model): """ A reference tying a specific person and an event minutes item together. """ matter_ref = fields.ReferenceField(Matter, required=True) event_ref = fields.ReferenceField(Event, required=True) event_minutes_item_ref = fields.ReferenceField(EventMinutesItem, required=True) person_ref = fields.ReferenceField(Person, required=True) decision = fields.TextField( required=True, validator=validators.create_constant_value_validator( VoteDecision, True), ) in_majority = fields.BooleanField(required=True) external_source_id = fields.TextField() @classmethod def Example(cls) -> Model: vote = cls() vote.matter_ref = Matter.Example() vote.event_ref = Event.Example() vote.event_minutes_item_ref = EventMinutesItem.Example() vote.person_ref = Person.Example() vote.decision = VoteDecision.APPROVE vote.in_majority = True return vote _PRIMARY_KEYS = ( "matter_ref", "event_ref", "event_minutes_item_ref", "person_ref", "decision", ) _INDEXES = ()