Commit 5c2ad373 authored by Simon Daron's avatar Simon Daron
Browse files

New files (archives)

parent a24403c0
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.solr_backend.SolrEngine',
'URL': 'http://test-web.radiopanik.org:8985/solr/panik'
},
}
import re
import urllib2
import uuid
from django import template
from django.db.models.query import QuerySet
register = template.Library()
@register.filter(name='zip')
def zip_lists(a, b):
return zip(a, b)
@register.inclusion_tag('includes/audio.html', takes_context=True)
def audio(context, sound=None):
return {
'episode': context.get('episode'),
'sound': sound
}
@register.inclusion_tag('episodes/resume.html', takes_context=True)
def episode_resume(context, date=None, model=None, klass=None):
return {
'model': model,
'class': klass,
'episode': context.get('episode'),
'date': date,
}
@register.inclusion_tag('emissions/detail.html', takes_context=True)
def emission_detail(context, date=None):
return {
'emission': context.get('emission'),
'schedules': context.get('schedules'),
}
@register.inclusion_tag('includes/player.html', takes_context=False)
def player():
return {'unique': uuid.uuid4()}
@register.inclusion_tag('includes/metaNav.html', takes_context=False)
def metanav():
return {}
@register.inclusion_tag('news/inline.html', takes_context=False)
def news_inline(content=None, klass=None, logo=None):
return {
'content': content,
'class': klass,
'logo': logo
}
@register.filter
def jsonify(object):
if isinstance(object, QuerySet):
return serialize('json', object)
return simplejson.dumps(object)
@register.filter
def remove_tag_facet(url, facet):
facet = urllib2.quote(facet.encode('utf-8'), safe='')
return re.sub(r'&page=\d+', '', url.replace('&selected_facets=tags_exact:%s' % facet, ''))
@register.filter
def remove_category_facet(url, facet):
facet = urllib2.quote(facet.encode('utf-8'), safe='')
return re.sub(r'&page=\d+', '', url.replace('&selected_facets=categories_exact:%s' % facet, ''))
@register.filter
def append_tag_facet(url, facet):
facet = urllib2.quote(facet.encode('utf-8'), safe='')
return re.sub(r'&page=\d+', '', url + '&selected_facets=tags_exact:%s' % facet)
@register.filter
def append_category_facet(url, facet):
facet = urllib2.quote(facet.encode('utf-8'), safe='')
return re.sub(r'&page=\d+', '', url + '&selected_facets=categories_exact:%s' % facet)
@register.tag
def search_result_template(parser, token):
try:
tag_name, result_str = token.split_contents()
except ValueError:
raise template.TemplateSyntaxError("%r tag requires exactly one argument" % token.contents.split()[0])
return FormatSearchResultNode(result_str)
class FormatSearchResultNode(template.Node):
def __init__(self, result_str):
self.result_var = template.Variable(result_str)
def render(self, context):
result = self.result_var.resolve(context)
dir_mapping = {
'newsitem': 'news',
'emission': 'emissions',
'episode': 'episodes'
}
t = template.loader.get_template('%s/search_result.html' % dir_mapping.get(result.model_name))
return t.render(template.context.Context({'result': result}, autoescape=context.autoescape))
# initiated from http://djangosnippets.org/snippets/2145/
import os
import re
from PIL import Image
from django.db.models.signals import post_save, pre_delete
from django.template import Library
register = Library()
def thumbnail(image, size='100x100'):
# defining the size
x, y = [int(x) for x in size.split('x')]
# defining the filename and the miniature filename
filehead, filetail = os.path.split(image.path)
basename, format = os.path.splitext(filetail)
miniature = basename + '_' + size + format
filename = image.path
miniature_filename = os.path.join(filehead, miniature)
filehead, filetail = os.path.split(image.url)
miniature_url = filehead + '/' + miniature
if os.path.exists(miniature_filename) and \
os.path.getmtime(filename) > os.path.getmtime(miniature_filename):
os.unlink(miniature_filename)
# if the image wasn't already resized, resize it
if not os.path.exists(miniature_filename):
image = Image.open(filename)
if abs( (1.0*x/y) - (1.0*image.size[0]/image.size[1]) ) > 0.1:
# aspect ratio change, crop the image first
if image.size[0] > image.size[1]: # landscape
box = [0, 0, int(image.size[1] * (1.0*x/y)), image.size[1]]
box[0] = (image.size[0] - box[2]) / 2 # keep the middle
else:
box = [0, 0, image.size[0], int(image.size[0] * (1.0*x/y))]
box[1] = (image.size[1] - box[3]) / 4 # keep mostly the top
image = image.crop(box)
image = image.resize([x, y], Image.ANTIALIAS)
try:
image.save(miniature_filename, image.format, quality=90, optimize=1)
except:
image.save(miniature_filename, image.format, quality=90)
return miniature_url
register.filter(thumbnail)
def clean_thumb(sender, instance, **kwargs):
if not hasattr(instance, 'image'):
return
name, ext = os.path.splitext(os.path.basename(instance.image.name))
exp = '^%s_\d+x\d+x[0-1]{1}\%s' % (name, ext)
for file_path in os.listdir(settings.MEDIA_ROOT):
if re.search(exp, file_path):
os.unlink(settings.MEDIA_ROOT + file_path)
post_save.connect(clean_thumb)
pre_delete.connect(clean_thumb)
from django.conf.urls import patterns, include, url
from django.conf import settings
from django.views.generic import RedirectView
from django.core.urlresolvers import reverse_lazy
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^$', 'panikweb.views.home', name='home'),
url(r'^onair.json$', 'panikweb.views.onair', name='onair'),
url(r'^program$', 'panikweb.views.program', name='program'),
url(r'^grid$', 'panikweb.views.grid', name='grid'),
url(r'^emissions/$', 'panikweb.views.emissions', name='emissions'),
url(r'^emissions/', include('emissions.urls')),
url(r'^ckeditor/', include('ckeditor.urls')),
url(r'^get$', 'panikweb.views.get', name='get'),
url(r'^listen$', 'panikweb.views.listen', name='listen'),
url(r'^news/$', 'panikweb.views.news', name='news'),
url(r'^news/(?P<slug>[\w,-]+)$', 'panikweb.views.newsitem', name='news-view'),
url(r'^search/', 'panikweb.search.view', name='search'),
(r'^api/v2/', include('fiber.rest_api.urls')),
(r'^admin/fiber/', include('fiber.admin_urls')),
(r'^jsi18n/$', 'django.views.i18n.javascript_catalog', {'packages': ('fiber',),}),
url(r'^admin/', include(admin.site.urls)),
url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
)
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()
from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
urlpatterns += patterns('',
(r'', 'fiber.views.page'),
)
try:
from local_urls import *
except ImportError, e:
pass
from datetime import datetime, timedelta
import math
from django.views.generic.base import TemplateView
from django.views.generic.detail import DetailView
from django.views.decorators.csrf import csrf_exempt
from django.views.generic.dates import _date_from_string
from jsonresponse import to_json
from emissions.models import Category, Emission, Episode, Diffusion, SoundFile, \
Schedule, Nonstop, NewsItem, NewsCategory
from emissions.utils import whatsonair, period_program
class ProgramView(TemplateView):
template_name = 'program.html'
def get_context_data(self, **kwargs):
context = super(ProgramView, self).get_context_data(**kwargs)
schedules = Schedule.objects.select_related().order_by('datetime')
days = []
for day in range(7):
days.append({'schedules': [x for x in schedules if x.is_on_weekday(day+1)],
'datetime': datetime(2007, 1, day+1)})
context['days'] = days
return context
program = ProgramView.as_view()
class ProgramWeekView(TemplateView):
template_name = 'week.html'
def get_context_data(self, year, week, **kwargs):
context = super(ProgramWeekView, self).get_context_data(**kwargs)
date = _date_from_string(year, '%Y', '1', '%w', week, '%W')
date = datetime(*date.timetuple()[:3])
program = period_program(date, date+timedelta(days=7))
days = []
for day in range(7):
days.append({'cells': [x for x in program if x.is_on_weekday(day+1)],
'datetime': date+timedelta(days=day)})
context['days'] = days
context['week'] = week
context['year'] = year
context['date'] = _date_from_string(year, '%Y', '1', '%w', week, '%W')
return context
week = ProgramWeekView.as_view()
class TimeCell:
nonstop = None
w = 1
h = 1
time_label = None
def __init__(self, i, j):
self.x = i
self.y = j
self.schedules = []
def add_schedule(self, schedule):
end_time = schedule.datetime + timedelta(
minutes=schedule.get_duration())
self.time_label = '%02d:%02d-%02d:%02d' % (
schedule.datetime.hour,
schedule.datetime.minute,
end_time.hour,
end_time.minute)
self.schedules.append(schedule)
def __unicode__(self):
if self.schedules:
return ', '.join([x.emission.title for x in self.schedules])
else:
return self.nonstop
def __eq__(self, other):
return (unicode(self) == unicode(other) and self.time_label == other.time_label)
class Grid(TemplateView):
template_name = 'grid.html'
def get_context_data(self, **kwargs):
context = super(Grid, self).get_context_data(**kwargs)
nb_lines = 2 * 24 # the cells are half hours
grid = []
times = ['%02d:%02d' % (x/2, x%2*30) for x in range(nb_lines)]
# start grid after the night programs
times = times[2*Schedule.DAY_HOUR_START:] + times[:2*Schedule.DAY_HOUR_START]
nonstops = []
for nonstop in Nonstop.objects.all():
if nonstop.start < nonstop.end:
nonstops.append([nonstop.start.hour + nonstop.start.minute/60.,
nonstop.end.hour + nonstop.end.minute/60.,
nonstop.title])
else:
# crossing midnight
nonstops.append([nonstop.start.hour + nonstop.start.minute/60.,
24,
nonstop.title])
nonstops.append([0,
nonstop.end.hour + nonstop.end.minute/60.,
nonstop.title])
nonstops.sort()
for i in range(nb_lines):
grid.append([])
for j in range(7):
grid[-1].append(TimeCell(i, j))
nonstop = [x for x in nonstops if i>=x[0]*2 and i<x[1]*2][0]
for time_cell in grid[-1]:
time_cell.nonstop = nonstop[2]
if nonstop[1] == 5:
# the one ending at 5am will be cut down, so we inscribe
# its duration manually
time_cell.time_label = '%02d:00-%02d:00' % (
nonstop[0], nonstop[1])
for schedule in Schedule.objects.select_related().order_by('datetime'):
row_start = schedule.datetime.hour * 2 + \
int(math.ceil(schedule.datetime.minute / 30))
day_no = schedule.get_weekday()
for step in range(int(math.ceil(schedule.get_duration() / 30.))):
if grid[(row_start+step)%nb_lines][day_no] is None:
grid[(row_start+step)%nb_lines][day_no] = TimeCell()
grid[(row_start+step)%nb_lines][day_no].add_schedule(schedule)
# start grid after the night programs
grid = grid[2*Schedule.DAY_HOUR_START:] + grid[:2*Schedule.DAY_HOUR_START]
# merge adjacent cells
# 1st thing is to merge cells on the same line, this will mostly catch
# consecutive nonstop cells
for i in range(nb_lines):
for j, cell in enumerate(grid[i]):
if grid[i][j] is None:
continue
t = 1
try:
# if the cells are identical, they are removed from the
# grid, and current cell width is increased
while grid[i][j+t] == cell:
cell.w += 1
grid[i][j+t] = None
t += 1
except IndexError:
pass
# once we're done we remove empty cells
grid[i] = [x for x in grid[i] if x is not None]
# 2nd thing is to merge cells vertically, this is emissions that last
# for more than 30 minutes
for i in range(nb_lines):
grid[i] = [x for x in grid[i] if x is not None]
for j, cell in enumerate(grid[i]):
if grid[i][j] is None:
continue
t = 1
try:
while True:
# we look if the next time cell has the same emissions
same_cell_below = [(bj, x) for bj, x in enumerate(grid[i+cell.h])
if x == cell and x.y == cell.y and x.w == cell.w]
if same_cell_below:
# if the cell was identical, we remove it and
# increase current cell height
bj, same_cell_below = same_cell_below[0]
del grid[i+cell.h][bj]
cell.h += 1
else:
# if the cell is different, we have a closer look
# to it, so we can remove emissions that will
# already be mentioned in the current cell.
#
# For example:
# - 7am30, seuls contre tout, 1h30
# - 8am, du pied gauche & la voix de la rue, 1h
# should produce: (this is case A)
# | 7:30-9:00 |
# | seuls contre tout |
# |---------------------|
# | 8:00-9:00 |
# | du pied gauche |
# | la voix de la rue |
#
# On the other hand, if all three emissions started
# at 7am30, we want: (this is case B)
# | 7:30-9:00 |
# | seuls contre tout |
# | du pied gauche |
# | la voix de la rue |
# that is we merge all of them, ignoring the fact
# that the other emissions will stop at 8am30
current_cell_schedules = set(grid[i][j].schedules)
cursor = 1
while True and current_cell_schedules:
same_cell_below = [x for x in grid[i+cursor] if x.y == grid[i][j].y]
if not same_cell_below:
cursor += 1
continue
same_cell_below = same_cell_below[0]
if current_cell_schedules.issubset(same_cell_below.schedules):
# this handles case A (see comment above)
for schedule in current_cell_schedules:
if schedule in same_cell_below.schedules:
same_cell_below.schedules.remove(schedule)
elif same_cell_below.schedules and \
current_cell_schedules.issuperset(same_cell_below.schedules):
# this handles case B (see comment above)
# we set the cell time label to the longest
# period
grid[i][j].time_label = same_cell_below.time_label
# then we sort emissions so the longest are
# put first
grid[i][j].schedules.sort(
lambda x, y: -cmp(x.get_duration(), y.get_duration()))
# then we add individual time labels to the
# other schedules
for schedule in current_cell_schedules:
if schedule not in same_cell_below.schedules:
end_time = schedule.datetime + timedelta(
minutes=schedule.get_duration())
schedule.time_label = '%02d:%02d-%02d:%02d' % (
schedule.datetime.hour,
schedule.datetime.minute,
end_time.hour,
end_time.minute)
grid[i][j].h += 1
grid[i+cursor].remove(same_cell_below)
cursor += 1
break
except IndexError:
pass
# cut night at 3am
grid = grid[:42]
times = times[:42]
context['grid'] = grid
context['times'] = times
context['categories'] = Category.objects.all()
context['weekdays'] = ['Lundi', 'Mardi', 'Mercredi', 'Jeudi',
'Vendredi', 'Samedi', 'Dimanche']
return context
grid = Grid.as_view()
class Home(TemplateView):
template_name = 'home.html'
def get_context_data(self, **kwargs):
context = super(Home, self).get_context_data(**kwargs)
context['newsImaged'] = list(NewsItem.objects.all().exclude(image__isnull=True).exclude(image__exact='').order_by('-datetime')[:3])
context['newsImaged2'] = list(NewsItem.objects.all().exclude(image__isnull=True).exclude(image__exact='').order_by('-datetime')[:10])
context['news'] = list(NewsItem.objects.all().order_by('-datetime')[:36])
context['emissions'] = list(Emission.objects.filter(archived=False).order_by('title'))
schedules = Schedule.objects.select_related().order_by('datetime')
days = []
for day in range(7):
days.append({'schedules': [x for x in schedules if x.is_on_weekday(day+1)],
'datetime': datetime(2007, 1, day+1)})
context['days'] = days
return context
home = Home.as_view()
class News(TemplateView):
template_name = 'news.html'
def get_context_data(self, **kwargs):
context = super(News, self).get_context_data(**kwargs)
context['newsImaged'] = list(NewsItem.objects.all().exclude(image__isnull=True).exclude(image__exact='').order_by('-datetime')[:3])
context['news'] = list(NewsItem.objects.all().order_by('-datetime')[:60])
context['categories'] = list(NewsCategory.objects.all())
return context
news = News.as_view()
class Emissions(TemplateView):
template_name = 'emissions.html'
def get_context_data(self, **kwargs):
context = super(Emissions, self).get_context_data(**kwargs)
context['emissions'] = Emission.objects.all().order_by('title')
return context
emissions = Emissions.as_view()
class Get(TemplateView):
template_name = 'get.html'
def get_context_data(self, **kwargs):
context = super(Get, self).get_context_data(**kwargs)
context['emissions'] = Emission.objects.all().order_by('title')
return context
get = Get.as_view()
class Listen(TemplateView):
template_name = 'listen.html'
def get_context_data(self, **kwargs):
context = super(Listen, self).get_context_data(**kwargs)
context['sounds'] = SoundFile.objects.all()[:15]
listenable = []
x=0
for episode in Episode.objects.all().extra(select={
'first_diffusion': 'emissions_diffusion.datetime',
},
select_params=(False, True),
where=['''datetime = (SELECT MIN(datetime)
FROM emissions_diffusion
WHERE episode_id = emissions_episode.id)'''],
tables=['emissions_diffusion'],
).order_by('-first_diffusion').reverse():
if x >= 24:
break
elif episode.has_sound is None:
continue
else:
x+=1
listenable .append(episode)
context['episodes'] = listenable
return context
listen = Listen.as_view()
@csrf_exempt
@to_json('api')
def onair(request):
d = whatsonair()
if d.get('episode'):
d['episode'] = {
'title': d['episode'].title,
'url': d['episode'].get_absolute_url()
}
if d.get('emission'):
d['emission'] = {
'title': d['emission'].title,
'url': d['emission'].get_absolute_url()
}
if d.get('nonstop'):
d['nonstop'] = {
'title': d['nonstop'].title,
}
if d.get('current_slot'):
del d['current_slot']
return d
class NewsItemDetailView(DetailView):
model = NewsItem
newsitem = NewsItemDetailView.as_view()
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment