Changeset - 5bf63fe046e1
[Not reviewed]
fossy2024
0 2 0
Ben Sturmfels (bsturmfels) - 22 hours ago 2024-09-27 13:00:06
ben@sturm.com.au
Support YouTube videos
2 files changed with 21 insertions and 3 deletions:
0 comments (0 inline, 0 general)
pinaxcon/templates/symposion/schedule/presentation_detail.html
Show inline comments
...
 
@@ -35,40 +35,45 @@
 
          <img src="{{ speaker_photo_url }}" alt="{{ speaker }}" class="rounded-circle img-fluid">
 
          <p>
 
            <strong><a href="{% url "speaker_profile" speaker.pk %}">{{ speaker }}</a></strong><br />
 
            {% if speaker.twitter_username %}
 
              <a href="https://twitter.com/{{ speaker.twitter_username }}">{{ speaker.twitter_username|twitter_handle }}</a><br />
 
            {% endif %}
 
            {% if speaker.homepage %}
 
              <a href="{{ speaker.homepage }}">{{ speaker.homepage }}</a>
 
            {% endif %}
 
          </p>
 
          <div class="bio">{{ speaker.biography_html|safe}}</div>
 
          </p>
 
        </li>
 
        {% endfor %}
 
      </ul>
 
    </div>
 

	
 
    <div class="col-md-9 presentation-abstract">
 
      <h2 class="mt-4">Abstract</h4>
 
      {% autoescape off %}
 
      <div class="abstract pb-4"><p>{{ presentation.abstract_html|safe|clean_text|urlize }}</p></div>
 
      {% endautoescape %}
 

	
 
      {% if presentation.videos_split %}
 
        <h2 class="mt-4">Video</h4>
 
        <h2 class="mt-4">Videos</h4>
 
          {% for v in presentation.youtube_videos %}
 
            <iframe width="560" height="315" src="{{ v }}" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
 
          {% endfor %}
 
          {% if v.other_videos %}
 
            <video controls style="max-width: 640px">
 
          {% for video in presentation.videos_split %}
 
              {% for video in presentation.other_videos %}
 
                <source src="{{ video }}">
 
              {% endfor %}
 
            </video>
 
        <p style="margin-top: 1rem">Available formats:</p>
 
          {% endif %}
 
        <p style="margin-top: 1rem">Available sources:</p>
 
        <ul>
 
          {% for video in presentation.videos_split %}
 
            <li>{{ video|urlize }}</li>
 
          {% endfor %}
 
        </ul>
 
      {% endif %}
 
    </div>
 
  </div>
 
{% endblock %}
vendor/symposion/symposion/schedule/models.py
Show inline comments
...
 
@@ -287,48 +287,61 @@ class Presentation(models.Model):
 
        return super(Presentation, self).save(*args, **kwargs)
 

	
 
    @property
 
    def number(self):
 
        return self.proposal.number
 

	
 
    @property
 
    def proposal(self):
 
        if self.proposal_base_id is None:
 
            return None
 
        return ProposalBase.objects.get_subclass(pk=self.proposal_base_id)
 

	
 
    def speakers(self):
 
        yield self.speaker
 
        for speaker in self.additional_speakers.all():
 
            if speaker.user:
 
                yield speaker
 

	
 
    def __str__(self):
 
        return "#%s %s (%s)" % (self.number, self.title, self.speaker)
 

	
 
    def videos_split(self):
 
        return [v.strip() for v in self.videos.split('\n') if v != '']
 

	
 
    def youtube_videos(self):
 
        return [
 
            v.replace('youtu.be', 'www.youtube.com/embed')
 
            for v in self.videos_split()
 
            if 'youtu.be' in v
 
        ]
 

	
 
    def other_videos(self):
 
        return [
 
            v for v in self.videos_split()
 
            if 'youtu.be' not in v
 
        ]
 

	
 
    class Meta:
 
        ordering = ["slot"]
 
        verbose_name = _("presentation")
 
        verbose_name_plural = _("presentations")
 

	
 

	
 
class Session(models.Model):
 

	
 
    day = models.ForeignKey(
 
        Day,
 
        related_name="sessions",
 
        verbose_name=_("Day"),
 
        on_delete=models.CASCADE,
 
    )
 
    slots = models.ManyToManyField(Slot, related_name="sessions", verbose_name=_("Slots"))
 

	
 
    def sorted_slots(self):
 
        return self.slots.order_by("start")
 

	
 
    def start(self):
 
        slots = self.sorted_slots()
 
        if slots:
 
            return list(slots)[0].start
 
        else:
0 comments (0 inline, 0 general)