"""Sheets for statements about relations between process content/comments."""
from colander import drop
from colander import OneOf
from adhocracy_core.interfaces import IPredicateSheet
from adhocracy_core.interfaces import ISheet
from adhocracy_core.interfaces import ISheetReferenceAutoUpdateMarker
from adhocracy_core.interfaces import SheetToSheet
from adhocracy_core.schema import MappingSchema
from adhocracy_core.schema import PostPool
from adhocracy_core.schema import Reference
from adhocracy_core.schema import SingleLine
from adhocracy_core.schema import UniqueReferences
from adhocracy_core.sheets import add_sheet_to_registry
from adhocracy_core.sheets import sheet_meta
[docs]class IPolarization(IPredicateSheet, ISheetReferenceAutoUpdateMarker):
"""Marker interface for the polarization sheet."""
[docs]class IPolarizable(ISheet, ISheetReferenceAutoUpdateMarker):
"""Marker interface for resources than can be polarized."""
[docs]class ICanPolarize(ISheet):
"""Marker interface for resources that can polarize."""
[docs]class Position(SingleLine):
"""Schema node for the side (pro or contra)."""
missing = drop
default = 'pro'
validator = OneOf(['pro', 'contra'])
[docs]class PolarizationSubjectReference(SheetToSheet):
"""Reference from polarization to polarize."""
source_isheet = IPolarization
source_isheet_field = 'subject'
target_isheet = ICanPolarize
[docs]class PolarizationObjectReference(SheetToSheet):
"""Reference from polarization to polarized resource."""
source_isheet = IPolarization
source_isheet_field = 'object'
target_isheet = IPolarizable
[docs]class PolarizationSchema(MappingSchema):
"""Polarizable sheet data structure.
`position`: the position in the debate, 'pro' or 'contra'.
"""
subject = Reference(reftype=PolarizationSubjectReference)
object = Reference(reftype=PolarizationObjectReference)
position = Position()
polarization_meta = sheet_meta._replace(isheet=IPolarization,
schema_class=PolarizationSchema,
create_mandatory=True)
[docs]class CanPolarizeSchema(MappingSchema):
"""CanPolarize sheet data structure."""
polarization = Reference(reftype=PolarizationSubjectReference,
backref=True,
readonly=True,)
can_polarize_meta = sheet_meta._replace(isheet=ICanPolarize,
schema_class=CanPolarizeSchema)
[docs]class PolarizableSchema(MappingSchema):
"""Polarizable sheet data structure.
`post_pool`: Pool to post :class:`adhocracy_core.resource.IPolarization`.
"""
polarizations = UniqueReferences(readonly=True,
backref=True,
reftype=PolarizationObjectReference)
post_pool = PostPool(iresource_or_service_name='relations')
polarizable_meta = sheet_meta._replace(
isheet=IPolarizable,
schema_class=PolarizableSchema,
editable=False,
creatable=False,
)
[docs]def includeme(config):
"""Register sheets, adapters and index views."""
add_sheet_to_registry(polarization_meta, config.registry)
add_sheet_to_registry(polarizable_meta, config.registry)
add_sheet_to_registry(can_polarize_meta, config.registry)