regluit/core/facets.py

140 lines
4.2 KiB
Python
Raw Normal View History

2014-11-18 18:33:17 +00:00
from django.db.models import get_model
from regluit.core import cc
2014-11-21 02:11:15 +00:00
2014-11-18 18:33:17 +00:00
class BaseFacet(object):
facet_name = 'all'
outer_facet = None
model = get_model('core', 'Work')
def __init__(self, outer_facet):
if outer_facet:
self.outer_facet = outer_facet
def _get_query_set(self):
if self.outer_facet:
return self.outer_facet.get_query_set()
else:
return self.model.objects.filter(editions__ebooks__isnull=False)
2014-11-21 02:11:15 +00:00
def __unicode__(self):
return unicode(self.facet_name)
2014-12-02 21:09:30 +00:00
@property
def title(self):
return self.__unicode__()
@property
def label(self):
return self.__unicode__()
2014-11-18 18:33:17 +00:00
def get_query_set(self):
return self._get_query_set()
def get_facet_path(self):
if self.outer_facet:
return self.outer_facet.get_facet_path() + self.facet_name + '/'
else:
return self.facet_name + '/'
2014-11-21 02:11:15 +00:00
def facets(self):
facets=[self]
if self.outer_facet:
2014-12-02 21:09:30 +00:00
facets= self.outer_facet.facets() + facets
2014-11-21 02:11:15 +00:00
return facets
2014-11-18 18:33:17 +00:00
2014-11-21 02:11:15 +00:00
def context(self):
return {}
def template(self):
return 'facets/default.html'
2014-12-02 21:09:30 +00:00
_stash_others = None
def get_other_groups(self):
if self._stash_others != None:
return self._stash_others
others = []
used = self.facets()
for group in facet_groups:
in_use = False
for facet in used:
if group.has_facet(facet.facet_name) :
in_use = True
break
if not in_use:
others.append(group)
self._stash_others=others
return others
2014-11-21 02:11:15 +00:00
2014-11-18 18:33:17 +00:00
class FacetGroup(object):
2014-12-02 21:09:30 +00:00
# a FacetGroup should implement title, facets, has_facet(self, facet_name) and get_facet_class(self, facet_name)
def has_facet(self, facet_name):
return facet_name in self.facets
def get_facets(self):
for facet_name in self.facets:
yield self.get_facet_class(facet_name)(None)
2014-11-18 18:33:17 +00:00
class NamedFacet(BaseFacet):
2014-11-21 02:11:15 +00:00
# set_name() must be defined in classes implementing NamedFacet
2014-11-18 18:33:17 +00:00
def __init__(self, outer_facet):
super(NamedFacet, self).__init__( outer_facet )
2014-11-21 02:11:15 +00:00
self.set_name()
2014-11-18 18:33:17 +00:00
class FormatFacetGroup(FacetGroup):
2014-12-02 21:09:30 +00:00
title = 'Format'
2014-11-18 18:33:17 +00:00
facets = ['pdf', 'epub', 'mobi']
2014-12-02 21:09:30 +00:00
2014-11-18 18:33:17 +00:00
def get_facet_class(self, facet_name):
class FormatFacet(NamedFacet):
def set_name(self):
self.facet_name=facet_name
def get_query_set(self):
return self._get_query_set().filter(editions__ebooks__format=self.facet_name)
2014-11-21 02:11:15 +00:00
def template(self):
return 'facets/format.html'
2014-12-02 21:09:30 +00:00
return FormatFacet
2014-11-18 18:33:17 +00:00
class LicenseFacetGroup(FacetGroup):
2014-12-02 21:09:30 +00:00
title = 'License'
2014-11-18 18:33:17 +00:00
licenses = cc.LICENSE_LIST_ALL
facets = cc.FACET_LIST
def get_facet_class(self, facet_name):
class LicenseFacet(NamedFacet):
def set_name(self):
self.facet_name=facet_name
2014-12-01 21:07:41 +00:00
self.license = cc.ccinfo(facet_name)
2014-11-18 18:33:17 +00:00
def get_query_set(self):
return self._get_query_set().filter(editions__ebooks__rights=self.license.license)
2014-12-01 21:07:41 +00:00
def template(self):
return 'facets/license.html'
def context(self):
return {
'license': self.license,
}
def label(self):
return self.license.__str__()
2014-12-02 21:09:30 +00:00
def title(self):
return self.license.title
2014-11-18 18:33:17 +00:00
return LicenseFacet
facet_groups = [ FormatFacetGroup() , LicenseFacetGroup() ]
def get_facet(facet_name):
for facet_group in facet_groups:
if facet_group.has_facet(facet_name):
return facet_group.get_facet_class(facet_name)
return BaseFacet
2014-11-18 21:54:19 +00:00
order_by_keys = {
2014-12-03 15:15:38 +00:00
'newest':['-featured', '-created'],
2014-11-18 21:54:19 +00:00
'oldest':['created'],
'featured':['-featured', '-num_wishes'],
'popular':['-num_wishes'],
'title':['title'],
}
def get_order_by(order_by_key):
# return the args to use as arguments for order_by
return order_by_keys.get(order_by_key,'')