-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
WCM-285: new columns channel and subchannels
- Loading branch information
Showing
10 changed files
with
298 additions
and
95 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
WCM-285: add new columns channel and subchannels |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
from sqlalchemy.dialects.postgresql import JSONB | ||
import grokcore.component as grok | ||
import sqlalchemy | ||
import zope.interface | ||
|
||
import zeit.connector.interfaces | ||
|
||
|
||
@grok.implementer(zeit.connector.interfaces.IConverter) | ||
@grok.adapter(sqlalchemy.Column) | ||
def converter_from_column_type(column): | ||
return zeit.connector.interfaces.IConverter(column.type) | ||
|
||
|
||
@grok.implementer(zeit.connector.interfaces.IConverter) | ||
class DefaultConverter(grok.Adapter): | ||
grok.context(zope.interface.Interface) | ||
|
||
def serialize(self, value): | ||
return value | ||
|
||
def deserialize(self, value): | ||
return value | ||
|
||
|
||
class BoolConverter(DefaultConverter): | ||
grok.context(sqlalchemy.Boolean) | ||
|
||
def serialize(self, value): | ||
return zeit.cms.content.dav.BoolProperty._toProperty(value) | ||
|
||
def deserialize(self, value): | ||
return zeit.cms.content.dav.BoolProperty._fromProperty(value) | ||
|
||
|
||
class IntConverter(DefaultConverter): | ||
grok.context(sqlalchemy.Integer) | ||
|
||
def serialize(self, value): | ||
return str(value) | ||
|
||
def deserialize(self, value): | ||
return int(value) | ||
|
||
|
||
class DatetimeConverter(DefaultConverter): | ||
grok.context(sqlalchemy.TIMESTAMP) | ||
|
||
def serialize(self, value): | ||
return zeit.cms.content.dav.DatetimeProperty._toProperty(value) | ||
|
||
def deserialize(self, value): | ||
return zeit.cms.content.dav.DatetimeProperty._fromProperty(value) | ||
|
||
|
||
class ChannelsConverter(DefaultConverter): | ||
grok.context(JSONB) | ||
grok.name('channels') | ||
|
||
def serialize(self, value): | ||
if not value: | ||
return '' | ||
elements = [] | ||
for channel, subchannels in value.items(): | ||
if subchannels: | ||
elements.append(f"{channel} {' '.join(subchannels)}") | ||
else: | ||
elements.append(channel) | ||
return ';'.join(elements) | ||
|
||
def deserialize(self, value): | ||
channels = {} | ||
if value: | ||
elements = [i.split() for i in value.split(';') if i.strip()] | ||
for element in elements: | ||
channel = element[0] | ||
subchannels = element[1:] if len(element) > 1 else [] | ||
if channel in channels: | ||
channels[channel].extend(subchannels) | ||
else: | ||
channels[channel] = subchannels | ||
return channels |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
34 changes: 34 additions & 0 deletions
34
.../zeit/connector/migrations/postdeploy/20240912_1058-6cc99f5afdc5_add_channels_columns_.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
"""add channels columns index | ||
Revision ID: 6cc99f5afdc5 | ||
Revises: cf24009572b7 | ||
Create Date: 2024-09-12 10:58:00.181930 | ||
""" | ||
from typing import Sequence, Union | ||
|
||
from alembic import op | ||
|
||
|
||
# revision identifiers, used by Alembic. | ||
revision: str = '6cc99f5afdc5' | ||
down_revision: Union[str, None] = 'cf24009572b7' | ||
branch_labels: Union[str, Sequence[str], None] = None | ||
depends_on: Union[str, Sequence[str], None] = None | ||
|
||
|
||
def upgrade() -> None: | ||
with op.get_context().autocommit_block(): | ||
op.create_index( | ||
'ix_properties_channels', | ||
'properties', | ||
['channels'], | ||
unique=False, | ||
postgresql_using='gin', | ||
postgresql_concurrently=True, | ||
if_not_exists=True, | ||
) | ||
|
||
|
||
def downgrade() -> None: | ||
op.drop_index('ix_properties_channels', table_name='properties', postgresql_using='gin') |
27 changes: 27 additions & 0 deletions
27
...rc/zeit/connector/migrations/predeploy/20240912_1056-9aba9394d011_add_channels_columns.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
"""add channels columns | ||
Revision ID: 9aba9394d011 | ||
Revises: 5f2720a9a131 | ||
Create Date: 2024-09-12 10:56:52.266201 | ||
""" | ||
from typing import Sequence, Union | ||
|
||
from alembic import op | ||
from sqlalchemy.dialects.postgresql import JSONB | ||
import sqlalchemy as sa | ||
|
||
|
||
# revision identifiers, used by Alembic. | ||
revision: str = '9aba9394d011' | ||
down_revision: Union[str, None] = '5f2720a9a131' | ||
branch_labels: Union[str, Sequence[str], None] = None | ||
depends_on: Union[str, Sequence[str], None] = None | ||
|
||
|
||
def upgrade() -> None: | ||
op.add_column('properties', sa.Column('channels', JSONB(astext_type=sa.Text()), nullable=True)) | ||
|
||
|
||
def downgrade() -> None: | ||
op.drop_column('properties', 'channels') |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.