diff options
Diffstat (limited to 'mediagoblin/plugins/archivalook/models.py')
-rw-r--r-- | mediagoblin/plugins/archivalook/models.py | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/mediagoblin/plugins/archivalook/models.py b/mediagoblin/plugins/archivalook/models.py new file mode 100644 index 00000000..3d8dd756 --- /dev/null +++ b/mediagoblin/plugins/archivalook/models.py @@ -0,0 +1,103 @@ +# GNU MediaGoblin -- federated, autonomous media hosting +# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. +from sqlalchemy import Column, Integer, Unicode, ForeignKey +from sqlalchemy.orm import relationship, backref + +from mediagoblin.db.base import Base +from mediagoblin.db.models import MediaEntry, Privilege + +BACKREF_NAME = "archivalook__featured" + + +class FeaturedMedia(Base): + """ + A table which logs which media are featured so that they can be displayed on + the front page. + + :keyword media_entry_id An integer foreign key which + indicates which media entry this + feature describes. + :keyword display_type A string to describe how + prominently this feature will be + displayed. The three appropriate + values are 'primary', + 'secondary' and 'tertiary' + :keyword order An integer describing this + feature's place in the "stack" + which is displayed to the site's + visitor. This value should begin + at 0 (for the top) and increase + by one for each feature below it + + """ + __tablename__="archivalook__featured_media" + + id = Column(Integer, primary_key=True, nullable=False) + media_entry_id = Column(Integer, ForeignKey(MediaEntry.id), nullable=False) + media_entry = relationship( + MediaEntry, + backref=backref(BACKREF_NAME, uselist=False, + cascade="all, delete-orphan")) + display_type = Column(Unicode, nullable=False) + order = Column(Integer, nullable=False) + + def move_down(self): + self.order += 1 + self.save() + + def move_up(self): + if not self.order == 1: + self.order -= 1 + self.save() + + def demote(self): + if self.is_last_of_type() and self.display_type == u'primary': + self.display_type = u'secondary' + elif self.is_last_of_type() and self.display_type == u'secondary': + self.display_type = u'tertiary' + self.save() + + def promote(self): + if self.is_first_of_type() and self.display_type == u'secondary': + self.display_type = u'primary' + elif self.is_first_of_type() and self.display_type == u'tertiary': + self.display_type = u'secondary' + self.save() + + def is_first_of_type(self): + """ + :returns boolean Returns True if the feature is the first + of its display type to show up on the + front page. Returns False otherwise. + """ + return FeaturedMedia.query.order_by( + FeaturedMedia.order.asc()).filter( + FeaturedMedia.display_type==self.display_type).first() == self + + def is_last_of_type(self): + """ + :returns boolean Returns True if the feature is the last + of its display type to show up on the + front page. Returns False otherwise. + """ + return FeaturedMedia.query.order_by( + FeaturedMedia.order.desc()).filter( + FeaturedMedia.display_type==self.display_type).first() == self + +MODELS = [FeaturedMedia] + +new_privilege_foundations = [{"privilege_name":"featurer"}] +FOUNDATIONS = {Privilege:new_privilege_foundations} |