padma videos attached to talks

This commit is contained in:
Sanj 2012-03-28 16:20:07 +05:30
parent 780e39d736
commit 55c548c872
5 changed files with 99 additions and 11 deletions

View File

@ -30,7 +30,7 @@ class MeetingSponsorInline(admin.StackedInline):
class TalkAdmin(admin.ModelAdmin): class TalkAdmin(admin.ModelAdmin):
inlines = [AudioInline, ImageInline, DocumentInline] inlines = [PadmaVideoInline, AudioInline, ImageInline, DocumentInline]
save_on_top = True save_on_top = True
list_display = ('__unicode__', 'presenter', 'session',) list_display = ('__unicode__', 'presenter', 'session',)
list_filter = ['session'] list_filter = ['session']
@ -64,7 +64,7 @@ class ProjectAdmin(admin.ModelAdmin):
save_on_top = True save_on_top = True
class SessionAdmin(admin.ModelAdmin): class SessionAdmin(admin.ModelAdmin):
inlines = [PadmaVideoInline] # inlines = [PadmaVideoInline]
search_fields = ('title', 'intro',) search_fields = ('title', 'intro',)
list_filter = ['day'] list_filter = ['day']
list_display = ('__unicode__',) list_display = ('__unicode__',)

View File

@ -132,6 +132,7 @@ class Talk(models.Model):
intro = models.TextField(blank=True, null=True) intro = models.TextField(blank=True, null=True)
presenter = models.CharField(max_length=255, blank=True) presenter = models.CharField(max_length=255, blank=True)
session = models.ForeignKey('Session') # name of meeting - name of session session = models.ForeignKey('Session') # name of meeting - name of session
videos = generic.GenericRelation(PadmaVideo)
def __unicode__(self): def __unicode__(self):
return "%s - %s" % (self.session.day.meeting.title, self.title) # name of meeting - name of session return "%s - %s" % (self.session.day.meeting.title, self.title) # name of meeting - name of session
@ -151,7 +152,7 @@ class Session(models.Model):
intro = models.TextField(blank=True, null=True) intro = models.TextField(blank=True, null=True)
day = models.ForeignKey('MeetingDay') day = models.ForeignKey('MeetingDay')
session_no = models.IntegerField(blank=True, null=True) session_no = models.IntegerField(blank=True, null=True)
videos = generic.GenericRelation(PadmaVideo) # videos = generic.GenericRelation(PadmaVideo)
def __unicode__(self): def __unicode__(self):
return "%s - %s" % (self.day.meeting.title, self.title) # name of meeting - name of session return "%s - %s" % (self.day.meeting.title, self.title) # name of meeting - name of session

View File

85
itf/padmavideos/models.py Normal file
View File

@ -0,0 +1,85 @@
from django.db import models
from ox.django.fields import DictField
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
from django.forms import ValidationError
import re
import ox
from app.models import ItfModel
from django.core.files import File
from django.core.files.temp import NamedTemporaryFile
import urllib2
PANDORA_BASE = 'pad.ma'
class PadmaVideo(ItfModel):
embed_code = models.TextField()
url = models.CharField(max_length=512, editable=False)
title = models.CharField(max_length=512, blank=True)
poster = models.ImageField(blank=True, upload_to='upload/padmaposters/')
padma_id = models.CharField(editable=False, max_length=8, db_index=True)
time_in = models.IntegerField(null=True, editable=False)
time_out = models.IntegerField(null=True, editable=False)
width = models.IntegerField(null=True, editable=False)
height = models.IntegerField(null=True, editable=False)
data = DictField(default={}, editable=False)
layers = DictField(default={}, editable=False)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
def __unicode__(self):
return self.padma_id
def get_dict(self):
return {
'embed_code': self.embed_code,
'url': self.url,
'title': self.title,
'data': self.data,
'time_in': self.time_in,
'time_out': self.time_out,
'layers':self.layers
}
def save(self, *args, **kwargs):
embed_code = self.embed_code
regex = r'\<iframe width=\"([0-9]{1,3})\" height\=\"([0-9]{1,3})\" src\=\"http\:\/\/pad.ma\/([A-Z]{1,8})\/embed\?in\=([0-9].*?)\&out\=([0-9].*?)\&view\=video\" frameborder\=\"0\" allowfullscreen></iframe>'
match = re.match(regex, embed_code)
if not match:
raise ValidationError("Invalid Embed Code")
self.width, self.height, self.padma_id, self.time_in, self.time_out = match.groups()
self.time_in = int(self.time_in)
self.time_out = int(self.time_out)
self.url = "http://%s/%s/" % (PANDORA_BASE, self.padma_id,) #FIXME time_in, time_out
self.get_padma_data()
super(PadmaVideo, self).save(*args, **kwargs)
def get_padma_data(self, update_poster=True):
api = ox.api.API("http://%s/api" % PANDORA_BASE)
self.data = api.get({
'id': self.padma_id,
'keys': []
})['data']
if not self.title:
self.title = self.data['title']
if self.time_in == self.time_out:
self.time_out = int(self.data['duration'])
if update_poster:
self.update_poster()
self.layers = api.get({
'id': self.padma_id,
'keys': ['layers']
})
return self
#ref: http://djangosnippets.org/snippets/2587/
def update_poster(self):
poster_time = int((self.time_in + self.time_out) / 2)
url = 'http://%s/%s/480p%d.jpg' % (PANDORA_BASE, self.padma_id, poster_time,)
img_temp = NamedTemporaryFile(delete=True)
img_temp.write(urllib2.urlopen(url).read())
img_temp.flush()
self.poster.save("%s.jpg" % self.padma_id, File(img_temp), save=False)

View File

@ -45,7 +45,7 @@
{% for s in sponsors %} {% for s in sponsors %}
{% thumbnail s.logo "120" crop="center" as thumb %} {% thumbnail s.logo "120" crop="center" as thumb %}
{% if s.url %} <a href="{{ s.url }}" target="_blank"> {% endif %} {% if s.url %} <a href="{{ s.url }}" target="_blank"> {% endif %}
<img alt="{{ s.name }}" src="{{ thumb.url }}" /> <img alt="{{ s.name }}" src="{{ thumb.url }}" /> <br />
{% if s.url %} </a> {% endif %} {% if s.url %} </a> {% endif %}
{% endthumbnail %} {% endthumbnail %}
&nbsp; &nbsp;
@ -70,13 +70,7 @@
<div class="sessionIntro"> <div class="sessionIntro">
{{ s.intro|markdown }} {{ s.intro|markdown }}
</div> </div>
{% ifnotequal s.videos.all|length 0 %}
<div class="padmaVideos">
{% for v in s.videos.all %}
{{ v.embed_code|safe }}
{% endfor %}
</div>
{% endifnotequal %}
{% ifnotequal s.talks|length 0 %} {% ifnotequal s.talks|length 0 %}
<ul class="talks"> <ul class="talks">
{% for talk in s.talks %} {% for talk in s.talks %}
@ -105,6 +99,14 @@
{% endfor %} {% endfor %}
</span> </span>
&nbsp;&nbsp; {{ talk.title }} by {{ talk.presenter }} &nbsp;&nbsp; {{ talk.title }} by {{ talk.presenter }}
{% ifnotequal talk.videos.all|length 0 %}
<div class="padmaVideos">
{% for v in talk.videos.all %}
{{ v.embed_code|safe }}
{% endfor %}
</div>
{% endifnotequal %}
</li> </li>
{% endfor %} {% endfor %}
</ul> </ul>