100 lines
3.0 KiB
Python
100 lines
3.0 KiB
Python
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)
|