padma videos attached to talks
This commit is contained in:
parent
780e39d736
commit
55c548c872
|
@ -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__',)
|
||||||
|
|
|
@ -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
|
||||||
|
|
0
itf/padmavideos/__init__.py
Normal file
0
itf/padmavideos/__init__.py
Normal file
85
itf/padmavideos/models.py
Normal file
85
itf/padmavideos/models.py
Normal 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)
|
|
@ -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 %}
|
||||||
|
|
||||||
|
@ -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>
|
||||||
{{ talk.title }} by {{ talk.presenter }}
|
{{ 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>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user