diff --git a/migrations/versions/35d477d67b7_.py b/migrations/versions/35d477d67b7_.py new file mode 100644 index 00000000..42de5393 --- /dev/null +++ b/migrations/versions/35d477d67b7_.py @@ -0,0 +1,33 @@ +"""empty message + +Revision ID: 35d477d67b7 +Revises: 33e499db410 +Create Date: 2024-12-06 10:16:54.464973 + +""" + +# revision identifiers, used by Alembic. +revision = '35d477d67b7' +down_revision = '33e499db410' + +from alembic import op +import sqlalchemy as sa + + +def upgrade(): + ### commands auto generated by Alembic - please adjust! ### + op.create_table('bill_file', + sa.Column('id', sa.Integer(), nullable=False), + sa.Column('bill_id', sa.Integer(), nullable=False), + sa.Column('file_id', sa.Integer(), nullable=False), + sa.ForeignKeyConstraint(['bill_id'], ['bill.id'], name=op.f('fk_bill_file_bill_id_bill')), + sa.ForeignKeyConstraint(['file_id'], ['file.id'], name=op.f('fk_bill_file_file_id_file')), + sa.PrimaryKeyConstraint('id', name=op.f('pk_bill_file')) + ) + ### end Alembic commands ### + + +def downgrade(): + ### commands auto generated by Alembic - please adjust! ### + op.drop_table('bill_file') + ### end Alembic commands ### diff --git a/pmg/admin/__init__.py b/pmg/admin/__init__.py index 65843c43..50cb1500 100644 --- a/pmg/admin/__init__.py +++ b/pmg/admin/__init__.py @@ -1260,6 +1260,18 @@ def get_list(self, term, offset=0, limit=DEFAULT_PAGE_SIZE): return query.offset(offset).limit(limit).all() +class InlineBillFileForm(InlineFormAdmin): + form_columns = ( + "id", + "file", + ) + form_ajax_refs = { + "file": { + "fields": ("title", "file_path"), + "page_size": 10, + }, + } + class BillsView(MyModelView): column_list = ( @@ -1289,13 +1301,14 @@ class BillsView(MyModelView): "date_of_assent", "effective_date", "act_name", - "versions", + "versions" ) column_default_sort = ("year", True) column_searchable_list = ("title",) inline_models = [ InlineBillEventsForm(Event), InlineBillVersionForm(BillVersion), + InlineBillFileForm(BillFile), ] form_args = { "events": {"widget": widgets.InlineBillEventsWidget()}, diff --git a/pmg/api/schemas.py b/pmg/api/schemas.py index 1330b584..732d2c53 100644 --- a/pmg/api/schemas.py +++ b/pmg/api/schemas.py @@ -18,6 +18,7 @@ Bill, BillType, BillVersion, + BillFile, BillStatus, Event, QuestionReply, @@ -396,6 +397,7 @@ class Meta: "effective_date", "act_name", "versions", + "bill_files", "events", "created_at", "updated_at", @@ -405,6 +407,7 @@ class Meta: status = fields.Nested("BillStatusSchema") place_of_introduction = fields.Nested("HouseSchema") versions = fields.Nested("BillVersionSchema", many=True) + bill_files = fields.Nested("BillFileSchema", many=True) events = PolyField(serialization_schema_selector=choose_event_schema, many=True) _links = ma.Hyperlinks({"self": AbsoluteUrlFor("api2.bills", id=""),}) @@ -428,3 +431,10 @@ class Meta: fields = ("id", "title", "file", "date", "enacted") file = fields.Nested("FileSchema") + +class BillFileSchema(ma.ModelSchema): + class Meta: + model = BillFile + fields = ("id", "file_id", "file") + + file = fields.Nested("FileSchema") diff --git a/pmg/models/resources.py b/pmg/models/resources.py index 928640a4..c6144b6e 100644 --- a/pmg/models/resources.py +++ b/pmg/models/resources.py @@ -163,6 +163,7 @@ class Bill(ApiResource, db.Model): versions = db.relationship( "BillVersion", backref="bill", cascade="all, delete, delete-orphan" ) + bill_files = db.relationship("BillFile", back_populates="bill", cascade="all, delete-orphan") @property def code(self): @@ -224,6 +225,15 @@ class BillVersion(db.Model): db.Boolean, default=False, server_default=sql.expression.false(), nullable=False ) +class BillFile(db.Model): + __tablename__ = 'bill_file' + id = db.Column(db.Integer, primary_key=True) + bill_id = db.Column(db.Integer, db.ForeignKey('bill.id'), nullable=False) + file_id = db.Column(db.Integer, db.ForeignKey('file.id'), nullable=False) + + bill = db.relationship("Bill", back_populates="bill_files") + file = db.relationship("File") + class File(db.Model): diff --git a/pmg/templates/bills/detail.html b/pmg/templates/bills/detail.html index 1c3c973f..7d244ab6 100644 --- a/pmg/templates/bills/detail.html +++ b/pmg/templates/bills/detail.html @@ -36,6 +36,7 @@

{% endif %} + {% if bill.status %} {% if bill.status.name in ["enacted", "president", "ncop", "na", "returned-to-na", "introduced"] -%}
@@ -169,6 +170,21 @@

{{ version.title }}

{% endif %} +{% if bill.bill_files %} + +{% endif %} + {% endblock %} {% block javascript %} diff --git a/pmg/templates/user_management/committee_subscriptions.html b/pmg/templates/user_management/committee_subscriptions.html index e603833c..3dcde007 100644 --- a/pmg/templates/user_management/committee_subscriptions.html +++ b/pmg/templates/user_management/committee_subscriptions.html @@ -44,46 +44,47 @@

Committee subscriptions

{% endif %}
+ {% include "_premium_committees.html" %} +

Subscription Options

- Annual Subscription: R6 800 + R1020 (VAT) = R7 820
- Choose 4 of the above committees and receive comprehensive minutes and documents for 12 months. - Should your organization require access to more than 4 of the above committees, this is possible - according to the list below. + Annual Subscription: R7 300 + R1095 (VAT) = R8 395 + Choose 4 of the above committees and receive comprehensive minutes and documents for 12 months. Should your organization require access to more than 4 of the above committees, this is possible according to the list below.

- Short access: R2 200 + R330 (VAT) = R2 530
+ Short access: R2 300 + R345 (VAT) = R2 645 Subscribe to one committee for 3 months.

- Single meeting report plus documents: R530 + R79.50 (VAT) = R609.50
+ Single meeting report plus documents: R580 + R87 (VAT) = R667 Send an email to subscribe@pmg.org.za and receive the meeting report immediately upon proof of payment.

- 2024 Price List
- -

+ 2025 Price List +

+ + -

+

How To Subscribe