This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
tabellio.webviews/tabellio/webviews/misc.py

195 lines
7.4 KiB
Python

import datetime
from Products.Five import BrowserView
from zope.interface import Interface
from zope import component
from Products.CMFCore.utils import getToolByName
try:
from plone.app.caching.operations.utils import setCacheHeaders
except ImportError:
setCacheHeaders = None
from tabellio.agenda.utils import MonthlyView
class Cached:
def cache(self, duration=3600):
if setCacheHeaders:
setCacheHeaders(self, self.request, self.request.response,
maxage=duration, smaxage=duration)
class IFolderWithBottomNavView(Interface):
pass
class FolderWithBottomNavView(BrowserView, Cached):
pass
class IPressFolder(Interface):
pass
class PressFolder(BrowserView, Cached):
def getRecent(self):
catalog = getToolByName(self.context, 'portal_catalog')
folder_path = '/'.join(self.context.getPhysicalPath() + ('communiques',))
results = catalog.searchResults(path={'query': folder_path, 'depth': 1},
portal_type=['Document', 'File'],
sort_on='Date', sort_order='descending',
sort_limit=10)[:10]
return results
def getRecentPresse(self):
catalog = getToolByName(self.context, 'portal_catalog')
folder_path = '/'.join(self.context.getPhysicalPath() + ('les-medias-en-parlent',))
results = catalog.searchResults(path={'query': folder_path, 'depth': 1},
portal_type=['Document', 'File'],
sort_on='Date', sort_order='descending',
sort_limit=10)[:10]
return results
class IPcfHomeFolder(Interface):
pass
class PcfHomeFolder(BrowserView, Cached):
def slider_items(self):
catalog = getToolByName(self.context, 'portal_catalog')
objects = catalog(portal_type=['tabellio.webviews.slidernews'])
if len(objects) == 0:
return []
now = datetime.datetime.now().timetuple()
objects = [x.getObject() for x in objects if x.getObject().on_homepage and
(not x.expires or x.expires.parts() > now) and
(not x.effective or x.effective.parts() < now)]
if len(objects) == 0:
return []
# and now, we know all items are coming from the same directory, so we
# take it and reorder items according to their manually set position
# in the folder.
sliders_folder = objects[0].aq_parent
sliders_folder_objects = list(sliders_folder.objectValues())
def cmp_position(x, y):
if not x in sliders_folder_objects:
return -1
if not y in sliders_folder_objects:
return -1
return cmp(sliders_folder_objects.index(x),
sliders_folder_objects.index(y))
objects.sort(cmp_position)
return objects
def homenews(self):
catalog = getToolByName(self.context, 'portal_catalog')
objects = catalog(portal_type=['tabellio.pcfviews.homenews'], sort_on='effective')
now = datetime.datetime.now().timetuple()
l = [x for x in objects if x.getObject().on_homepage and
(not x.expires or x.expires.parts() > now) and
(not x.effective or x.effective.parts() < now)]
if not l:
return None
return l[0].getObject()
def get_coming_day_events(self):
catalog = getToolByName(self.context, 'portal_catalog')
# do not go more than 100 days in the future
start = datetime.date.today()
end = start + datetime.timedelta(100)
calendar = getToolByName(self.context, 'portal_calendar')
r = catalog(
portal_type=['tabellio.agenda.comevent',
'tabellio.agenda.parlevent',
'tabellio.agenda.event'],
review_state=calendar.getCalendarStates(),
start={'query': start, 'range': 'min'},
sort_on='start')
if len(r) == 0:
return None
day = r[0].getObject().start.timetuple()[:3]
return [x.getObject() for x in r if x.start.timetuple()[:3] == day]
def next_event_url(self):
try:
current_event = self.get_coming_day_events()[-1]
except (TypeError, IndexError):
return None
catalog = getToolByName(self.context, 'portal_catalog')
# do not go more than 100 days in the future
end = current_event.start + datetime.timedelta(100)
start = current_event.start
monthly_view = MonthlyView(self.context, init_calendar=True)
serie_of_events = monthly_view.get_events_from_catalog(
start, end, portal_type=['tabellio.agenda.parlevent',
'tabellio.agenda.comevent',
'tabellio.agenda.event'])
for i, event in enumerate(serie_of_events):
event_id = ((type(event.getId) is str) and event.getId or event.getId())
if event_id == current_event.id:
try:
return serie_of_events[i+1].getURL()
except IndexError:
return None
return None
def previous_event_url(self):
try:
current_event = self.get_coming_day_events()[0]
except (TypeError, IndexError):
return None
catalog = getToolByName(self.context, 'portal_catalog')
end = current_event.start + datetime.timedelta(1)
# do not go back more than 100 days in the past
start = current_event.start - datetime.timedelta(100)
monthly_view = MonthlyView(self.context, init_calendar=True)
serie_of_events = monthly_view.get_events_from_catalog(
start, end, portal_type=['tabellio.agenda.parlevent',
'tabellio.agenda.comevent',
'tabellio.agenda.event'])
for i, event in enumerate(serie_of_events):
event_id = ((type(event.getId) is str) and event.getId or event.getId())
if event_id == current_event.id:
if i == 0:
return None
return serie_of_events[i-1].getURL()
return None
def last_docs(self):
catalog = getToolByName(self.context, 'portal_catalog')
return catalog(
portal_type=['tabellio.documents.document'],
sort_on='publication_date', sort_order='descending', limit=10)[:5]
def more_docs_link(self):
catalog = getToolByName(self.context, 'portal_catalog')
try:
return catalog(
portal_type='Folder',
object_provides='tabellio.webviews.misc.IFolderWithRecentDocs',
limit=1)[0].getObject().absolute_url()
except IndexError:
return '#'
class IComiteMixteFolder(Interface):
pass
class ComiteMixteFolder(BrowserView, Cached):
pass
class IFolderWithRecentDocs(Interface):
pass
class FolderWithRecentDocs(BrowserView, Cached):
def last_docs(self):
catalog = getToolByName(self.context, 'portal_catalog')
return catalog(
portal_type=['tabellio.documents.document'],
sort_on='publication_date', sort_order='descending', limit=100)[:50]
class IFolderNoNoNav(Interface):
pass
class FolderNoNoNav(BrowserView, Cached):
pass