class Revisions(BaseMixin, db.Model): """ Collection of revisions of content. """ __tablename__ = 'revisions' #: All revisions of the content history = db.relationship( ContentRevision, primaryjoin='ContentRevision.parent_id == Revisions.id', order_by=ContentRevision.id.desc, backref=db.backref('parent', cascade='all')) #: Latest published revision published_id = db.Column(db.Integer, db.ForeignKey('content_revision.id'), nullable=True) published = db.relationship(ContentRevision, post_update=True, primaryjoin=published_id == ContentRevision.id) #: Latest draft revision draft_id = db.Column(db.Integer, db.ForeignKey('content_revision.id'), nullable=True) draft = db.relationship(ContentRevision, post_update=True, primaryjoin=draft_id == ContentRevision.id)
class ContentRevision(BaseMixin, db.Model): """ A single revision of any piece of content. """ __tablename__ = 'content_revision' parent_id = db.Column(db.Integer, db.ForeignKey('revisions.id', use_alter=True, name='fk_content_revision_parent_id'), nullable=False) #: Previous revision previous_id = db.Column(db.Integer, db.ForeignKey('content_revision.id'), nullable=True) previous = db.relationship('ContentRevision', remote_side='ContentRevision.id', uselist=False) #: User who made this content revision user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False, default=default_user_id) user = db.relationship(User) #: Title of the current revision title = db.Column(db.Unicode(250), nullable=False) #: Abstract that is shown in summaries. Plain text. description = db.Column(db.UnicodeText, nullable=False, default=u'') #: Page content. Rich text. _content = db.Column('content', db.UnicodeText, nullable=False, default=u'') #: Template with which this page will be rendered template = db.Column(db.Unicode(80), nullable=False, default=u'') def __init__(self, **kwargs): super(ContentRevision, self).__init__(**kwargs) if self.previous: # Copy over content from the previous revision if not self.user: self.user = self.previous.user if not self.title: self.title = self.previous.title if not self.description: self.description = self.previous.description if not self._content: self._content = self.previous._content if not self.template: self.template = self.previous.template @property def content(self): return Markup(self._content) @content.setter def content(self, value): self._content = value content = db.synonym('_content', descriptor=content)
class Participant(BaseMixin, db.Model): __tablename__ = 'participant' #: List that this participant is in participant_list_id = db.Column(None, db.ForeignKey('participant_list.id'), nullable=False) #: Datetime when this participant's record was created upstream datetime = db.Column(db.DateTime, nullable=True) #: Ticket no, the reference key ticket = db.Column(db.Unicode(80), nullable=True, unique=True) #: Participant's name fullname = db.Column(db.Unicode(80), nullable=True) #: Unvalidated email address email = db.Column(db.Unicode(80), nullable=True) #: Unvalidated phone number phone = db.Column(db.Unicode(80), nullable=True) #: Unvalidated Twitter id twitter = db.Column(db.Unicode(80), nullable=True) #: Ticket type, if the registration system had multiple tickets ticket_type = db.Column(db.Unicode(80), nullable=True) #: Job title jobtitle = db.Column(db.Unicode(80), nullable=True) #: Company company = db.Column(db.Unicode(80), nullable=True) #: Participant's city city = db.Column(db.Unicode(80), nullable=True) #: T-shirt size tshirt_size = db.Column(db.Unicode(4), nullable=True) #: Link to the user record user_id = db.Column(None, db.ForeignKey('user.id'), nullable=True) user = db.relationship(User) #: Access key for connecting to the user record (nulled when linked) access_key = db.Column(db.Unicode(44), nullable=True, default=newsecret, unique=True) #: Is listed in the public directory is_listed = db.Column(db.Boolean, default=False, nullable=False) #: Data fields the participant has chosen to reveal in public fields_directory = db.Column(db.Unicode(250), nullable=False, default=u'fullname company') #: Data fields the participant has chosen to reveal via ContactPoint fields_contactpoint = db.Column( db.Unicode(250), nullable=False, default=u'fullname email phone twitter jobtitle company city') participant_list = db.relationship(ParticipantList, backref=db.backref( 'participants', order_by=fullname, cascade='all, delete-orphan')) parent = db.synonym('participant_list')
class ListItem(BaseMixin, db.Model): __tablename__ = 'list_item' list_id = db.Column(None, db.ForeignKey('list.id'), nullable=False) name = db.Column(db.Unicode(80), nullable=True) title = db.Column(db.Unicode(250), nullable=True) url = db.Column(db.Unicode(250), nullable=True) node_id = db.Column(None, db.ForeignKey('node.id'), nullable=True) node = db.relationship(Node, backref=db.backref('lists', cascade='all, delete-orphan')) seq = db.Column(db.Integer, nullable=False) __table_args__ = ( db.UniqueConstraint( 'list_id', 'name'), # name, if present, must be unique in this list db.UniqueConstraint('list_id', 'node_id') # A node can only be in a list once ) @classmethod def get_or_new(cls, list, name=None, node=None): if name is None and node is None: return query = cls.query.filter_by(list=list) if name: query = query.filter_by(name=name) if node: query = query.filter_by(node=node) item = query.first() if item: return item else: item = cls(list=list, name=name, node=node) db.session.add(item) return item
class MapItem(BaseScopedNameMixin, db.Model): __tablename__ = 'map_item' map_id = db.Column(None, db.ForeignKey('map.id'), nullable=False) parent = db.synonym('map') url = db.Column(db.Unicode(250), nullable=True) latitude = db.Column(db.Numeric(7, 4), nullable=False) longitude = db.Column(db.Numeric(7, 4), nullable=False) zoomlevel = db.Column(db.Integer, nullable=True) marker = db.Column(db.Unicode(80), nullable=True) seq = db.Column(db.Integer, nullable=False) __table_args__ = (db.UniqueConstraint('map_id', 'name'),) @classmethod def get_or_new(cls, map, name=None): item = cls.query.filter_by(map=map, name=name).first() if item is None: item = cls(map=map, name=name) db.session.add(item) return item
def revisions_id(cls): return db.Column(db.Integer, db.ForeignKey('revisions.id'), nullable=False)