from . import db from flask import url_for import random from sqlalchemy import event photos = db.Table('photos', db.Column('page_id', db.Integer, db.ForeignKey('page.id')), db.Column('photo_id', db.Integer, db.ForeignKey('photo.id')) ) thumbnails = db.Table('thumbnails', db.Column('page_id', db.Integer, db.ForeignKey('page.id')), db.Column('photo_id', db.Integer, db.ForeignKey('photo.id')) ) class Page(db.Model): __tablename__ = 'page' id = db.Column(db.Integer, primary_key=True) parent_id = db.Column(db.Integer, db.ForeignKey('page.id')) children = db.relationship("Page", backref=db.backref('parent', remote_side=[id])) name = db.Column(db.String(64), index=True, default="") permalink = db.Column(db.String(256), index=True, default="") title = db.Column(db.String(120), index=True, default="") description = db.Column(db.Text(), index=True, default="") thumbnail = db.relationship('Photo', secondary=thumbnails, uselist=False) photos = db.relationship('Photo', secondary=photos) endpoint = db.Column(db.Boolean, default=False) published = db.Column(db.Boolean, default=False) def update_permalink(self, name=None, parent_id=None): parent_id = parent_id or self.parent_id name = name or self.name if self.id == 1: self.permalink = "" return url = "" if parent_id: url = self.parent.permalink url = "/".join(filter(None,[url, name])) self.permalink = url print("Set permalink of " + repr(name) + " to " + url) @property def all_photos(self): if self.photos: return self.photos else: l = [photo for c in self.children for photo in c.all_photos] random.shuffle(l) if len(l) > 25: del l[25:] return l @property def breadcrumbs(self): if self.parent: l = list(self.parent.breadcrumbs) else: l = list() l.append(self) return l @event.listens_for(Page.parent_id, 'set') def parent_set(target, value, old_value, initiator): if value: target.update_permalink(parent_id=value) @event.listens_for(Page.name, 'set') def name_set(target, value, old_value, initiator): if value: target.update_permalink(name=value) class Photo(db.Model): __tablename__ = 'photo' id = db.Column(db.Integer, primary_key=True) link_id = db.Column(db.Integer, db.ForeignKey('page.id')) link = db.relationship("Page", foreign_keys=[link_id], uselist=False) alt = db.Column(db.String(120), index=True) @property def url(self): return url_for('photo', id=self.id) @property def thumbnail(self): return url_for('thumbnail', id=self.id) @property def slide(self): return url_for('slide', id=self.id) @property def page(self): return url_for('page', permalink = self.link.permalink)