2017-05-29 11:50:57 +02:00

101 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:
if self.parent:
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)