Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
radiopanik
panikweb
Commits
5c2ad373
Commit
5c2ad373
authored
Sep 07, 2013
by
Simon Daron
Browse files
New files (archives)
parent
a24403c0
Changes
5
Hide whitespace changes
Inline
Side-by-side
panikweb/local_settings.py~
deleted
100644 → 0
View file @
a24403c0
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.solr_backend.SolrEngine',
'URL': 'http://test-web.radiopanik.org:8985/solr/panik'
},
}
panikweb/paniktags/templatetags/paniktags.py~
deleted
100644 → 0
View file @
a24403c0
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))
panikweb/paniktags/templatetags/thumbnails.py~
deleted
100644 → 0
View file @
a24403c0
# 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)
panikweb/urls.py~
deleted
100644 → 0
View file @
a24403c0
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
panikweb/views.py~
deleted
100644 → 0
View file @
a24403c0
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
5
am
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
#
1
st
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 = '
%
02
d
:%
02
d
-%
02
d
:%
02
d
' % (
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()
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment