summaryrefslogtreecommitdiff
path: root/project/scipycon/talk
diff options
context:
space:
mode:
Diffstat (limited to 'project/scipycon/talk')
-rw-r--r--project/scipycon/talk/__init__.py0
-rw-r--r--project/scipycon/talk/admin.py23
-rw-r--r--project/scipycon/talk/forms.py62
-rw-r--r--project/scipycon/talk/models.py57
-rw-r--r--project/scipycon/talk/templatetags/__init__.py1
-rw-r--r--project/scipycon/talk/templatetags/talk_extras.py8
-rw-r--r--project/scipycon/talk/views.py225
7 files changed, 376 insertions, 0 deletions
diff --git a/project/scipycon/talk/__init__.py b/project/scipycon/talk/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/project/scipycon/talk/__init__.py
diff --git a/project/scipycon/talk/admin.py b/project/scipycon/talk/admin.py
new file mode 100644
index 0000000..db8fe3e
--- /dev/null
+++ b/project/scipycon/talk/admin.py
@@ -0,0 +1,23 @@
+# -*- coding: utf-8 -*-
+from __future__ import absolute_import
+
+#django.contrib
+from django.contrib import admin
+
+#scipycon
+from .models import Talk
+
+class TalkAdmin(admin.ModelAdmin):
+ list_display = ('title', 'speaker', 'topic', 'duration', 'audience', 'approved', 'submitted')
+ list_filter = ('approved', 'submitted', 'audience', 'topic', 'speaker')
+ search_fields = ('slug', 'title', 'abstract')
+ prepopulate_from = {'slug': ('title',)}
+ fieldsets = (
+ ('Details', {
+ 'fields': ('slug', 'title', 'abstract', 'speaker')
+ }),
+ ('Information', {
+ 'fields': ('topic', 'duration', 'audience', 'approved')
+ }),
+ )
+admin.site.register(Talk, TalkAdmin)
diff --git a/project/scipycon/talk/forms.py b/project/scipycon/talk/forms.py
new file mode 100644
index 0000000..72ec853
--- /dev/null
+++ b/project/scipycon/talk/forms.py
@@ -0,0 +1,62 @@
+# -*- coding: utf-8 -*-
+from __future__ import absolute_import
+
+#django
+from django import forms
+
+#django.contrib
+from django.contrib.auth.models import User
+
+#tagging
+from tagging.forms import TagField
+
+#scipycon
+#from .models import TOPIC_CHOICES
+from .models import DURATION_CHOICES
+from .models import AUDIENCE_CHOICES
+
+
+class TalkSubmitForm(forms.Form):
+ """Submit talk form
+ """
+ authors_bio = forms.CharField(widget=forms.Textarea, required=True,
+ label=u'Author(s) and short bio',
+ help_text=u'(include a bit about your qualifications regarding your presentation topic)')
+ contact = forms.EmailField(required=True, label=u'E-Mail ID',
+ help_text=u'Provide your email ID',
+ max_length=1024,
+ widget=forms.TextInput(attrs={'size':'50'}))
+ title = forms.CharField(required=True, label=u'Talk title',
+ help_text=u'Title of proposed presentation',
+ max_length=1024,
+ widget=forms.TextInput(attrs={'size':'50'}))
+ abstract = forms.CharField(widget=forms.Textarea, required=True,
+ help_text=u'Summary of proposed presentation (In 300-700 words)')
+# outline = forms.CharField(widget=forms.Textarea, required=True,
+# help_text=u'Outline of proposed presentation (around 200 words)')
+# topic = forms.ChoiceField(choices=TOPIC_CHOICES,
+# label=u'Topic', help_text=u'Select one of the available options or enter other topic')
+# topic_other = forms.CharField(label=u'Other topic',
+# help_text=u'Description of your topic',
+# max_length=255,
+# required=False,
+# widget=forms.TextInput(attrs={'size':'50'}))
+ topic = forms.CharField(label=u'Topic',
+ help_text=u'Description of your topic or comma separated tags',
+ max_length=255,
+ required=False,
+ widget=forms.TextInput(attrs={'size':'50'}))
+ duration = forms.ChoiceField(choices=DURATION_CHOICES, required=True,
+ label=u'Preferred time slot', help_text=u'Select preferred time slot')
+ audience = forms.ChoiceField(choices=AUDIENCE_CHOICES, label=u'Intended audience',
+ help_text=u'Select one of the available options or enter other type of intended audience')
+# audience_other = forms.CharField(label=u'Other intended audience',
+# help_text=u'Description of intended audience (ie. Discordians)',
+# max_length=128,
+# required=False,
+# widget=forms.TextInput(attrs={'size':'50'}))
+# tags = TagField(max_length=255,
+# widget=forms.TextInput(attrs={'size':'50'}))
+
+class TalkEditForm(TalkSubmitForm):
+ id = forms.CharField(widget=forms.HiddenInput)
diff --git a/project/scipycon/talk/models.py b/project/scipycon/talk/models.py
new file mode 100644
index 0000000..82c8f25
--- /dev/null
+++ b/project/scipycon/talk/models.py
@@ -0,0 +1,57 @@
+from django.db import models
+from django.contrib.auth.models import User
+
+from tagging import register
+from tagging.fields import TagField
+from tagging.utils import parse_tag_input
+
+from project.scipycon.base import models as base_models
+
+
+DURATION_CHOICES = (
+ ('10', 'Lightning Talk (10 mins)'),
+ ('20', 'Short Talk (20 mins)'),
+ ('30', 'Standard Talk (30 mins)'),
+ )
+
+AUDIENCE_CHOICES = (
+ ('nonprogrammers', 'Non Programmer'),
+ ('beginers', 'Beginner Programmer'),
+ ('intermediate', 'Intermediate Programmer'),
+ ('advanced', 'Advanced Programmer'),
+ )
+
+
+class Talk(base_models.ScopedBase):
+ """Defines talks at SciPy.in
+ """
+
+ slug = models.SlugField()
+
+ speaker = models.ForeignKey(User)
+
+ authors_bio = models.TextField()
+
+ contact = models.EmailField()
+
+ title = models.CharField(max_length=1024)
+
+ abstract = models.TextField()
+
+ topic = models.CharField(max_length=255, blank=True)
+
+ duration = models.CharField(max_length=3, choices=DURATION_CHOICES)
+
+ audience = models.CharField(max_length=32, choices=AUDIENCE_CHOICES, blank=True)
+
+ approved = models.BooleanField(default=False)
+
+ submitted = models.DateTimeField(auto_now_add=True)
+
+ last_mod = models.DateTimeField(auto_now=True)
+
+ def __unicode__(self):
+ return self.title
+
+ def get_tag_list(self):
+ return parse_tag_input(self.tags)
diff --git a/project/scipycon/talk/templatetags/__init__.py b/project/scipycon/talk/templatetags/__init__.py
new file mode 100644
index 0000000..792d600
--- /dev/null
+++ b/project/scipycon/talk/templatetags/__init__.py
@@ -0,0 +1 @@
+#
diff --git a/project/scipycon/talk/templatetags/talk_extras.py b/project/scipycon/talk/templatetags/talk_extras.py
new file mode 100644
index 0000000..e28f2bf
--- /dev/null
+++ b/project/scipycon/talk/templatetags/talk_extras.py
@@ -0,0 +1,8 @@
+from django import template
+
+register = template.Library()
+
+def choice(choices, value):
+ return choices[value]
+
+register.filter('choice', choice)
diff --git a/project/scipycon/talk/views.py b/project/scipycon/talk/views.py
new file mode 100644
index 0000000..62ae38d
--- /dev/null
+++ b/project/scipycon/talk/views.py
@@ -0,0 +1,225 @@
+from django.core.urlresolvers import reverse
+from django.contrib.auth.decorators import login_required
+from django.contrib.auth.forms import AuthenticationForm
+from django.contrib.auth.models import User
+from django.shortcuts import render_to_response
+from django.template import RequestContext
+from django.views.generic.list_detail import object_list
+from django.views.generic.list_detail import object_detail
+
+from PIL import Image
+
+from tagging.models import Tag
+
+from project.scipycon.base.models import Event
+from project.scipycon.talk.models import Talk
+from project.scipycon.talk.forms import TalkSubmitForm
+from project.scipycon.talk.forms import TalkEditForm
+from project.scipycon.talk.models import DURATION_CHOICES
+from project.scipycon.talk.models import AUDIENCE_CHOICES
+from project.scipycon.utils import set_message_cookie
+from project.scipycon.utils import slugify
+from project.scipycon.user.models import UserProfile
+from project.scipycon.user.forms import RegisterForm
+from project.scipycon.user.utils import scipycon_createuser
+
+
+@login_required
+def list_my_talks(request, scope, template_name='talk/list-talks.html'):
+ """Lists all the talks for the user.
+ """
+
+ scope_entity = Event.objects.get(scope=scope)
+
+ user = request.user
+ if user.is_authenticated():
+ try:
+ profile = user.get_profile()
+ except:
+ profile, new = UserProfile.objects.get_or_create(
+ user=user, scope=scope_entity)
+ if new:
+ profile.save()
+
+ my_talks = user.talk_set.all()
+
+ return render_to_response(template_name, RequestContext(request, {
+ 'params': {'scope': scope},
+ 'talk_list': my_talks,
+ }))
+
+def talk(request, scope, id):
+ objects = Talk.objects.filter(approved=True)
+ audience = {}
+ for choice in AUDIENCE_CHOICES:
+ audience[choice[0]] = choice[1]
+ extra_context = dict(choices=audience)
+ return object_detail(request, objects, id, extra_context=extra_context)
+
+@login_required
+def edit_talk(request, scope, id, template_name='talk/edit-talk.html'):
+ """Allows users that submitted a talk to edit it until the talk is approved.
+ """
+
+ talk = Talk.objects.get(pk=id)
+
+ if talk.approved == True:
+ redirect_to = reverse('scipycon_account', kwargs={'scope': scope})
+ return set_message_cookie(redirect_to,
+ msg = u'Sorry but you cannot edit the talk once'\
+ + ' it has been accepted.')
+
+ if talk.speaker != request.user:
+ redirect_to = reverse('scipycon_account', kwargs={'scope': scope})
+ return set_message_cookie(redirect_to,
+ msg = u'Redirected to account because the talk you selected' \
+ + ' is not your own.')
+
+ if request.method == 'POST':
+ form = TalkEditForm(data=request.POST)
+ if form.is_valid():
+ talk.slug = slugify(form.data.get('title'))
+ talk.authors_bio = form.data.get('authors_bio')
+ talk.contact = form.data.get('contact')
+ talk.title = form.data.get('title')
+ talk.abstract = form.data.get('abstract')
+ talk.topic = form.data.get('topic')
+ talk.duration = form.data.get('duration')
+ talk.audience = form.data.get('audience')
+ talk.save()
+
+ # Saved.. redirect
+ redirect_to = reverse('scipycon_edit_talk',
+ kwargs={'scope': scope, 'id': talk.id})
+ return set_message_cookie(redirect_to,
+ msg = u'Your changes have been saved.')
+ else:
+ form = TalkEditForm(initial={
+ 'id' : id,
+ 'authors_bio' : talk.authors_bio,
+ 'contact' : talk.contact,
+ 'title' : talk.title,
+ 'abstract' : talk.abstract,
+ 'topic' : talk.topic,
+ 'duration' : talk.duration,
+ 'audience' : talk.audience,
+ })
+
+ context = locals()
+ context['params'] = {'scope': scope}
+
+ return render_to_response(template_name, RequestContext(request, context))
+
+@login_required()
+def submit_talk(request, scope, template_name='talk/submit-talk.html'):
+ """Allows user to edit profile
+ """
+
+ scope_entity = Event.objects.get(scope=scope)
+
+ user = request.user
+ if user.is_authenticated():
+ try:
+ profile = user.get_profile()
+ except:
+ profile, new = UserProfile.objects.get_or_create(
+ user=user, scope=scope_entity)
+ if new:
+ profile.save()
+
+ message = None
+
+ if request.method == 'POST':
+ talk_form = TalkSubmitForm(data=request.POST)
+
+ register_form = RegisterForm(data=request.POST, files=request.FILES)
+
+ if request.POST.get('action', None) == 'login':
+ login_form = AuthenticationForm(data=request.POST)
+ if login_form.is_valid():
+
+ from django.contrib.auth import login
+ login(request, login_form.get_user())
+
+ redirect_to = reverse('scipycon_submit_talk',
+ kwargs={'scope': scope})
+ return set_message_cookie(redirect_to,
+ msg = u'You have been logged in.')
+
+ if request.POST.get('action', None) == 'register':
+ # add the new user
+ if register_form.is_valid():
+
+ user = scipycon_createuser(request, register_form.data)
+
+ if talk_form.is_valid():
+ if user.is_authenticated():
+ title = talk_form.data.get('title')
+ talk = Talk.objects.create(
+ slug = slugify(title),
+ scope = scope_entity,
+ speaker = User.objects.get(pk=user.id),
+ authors_bio = talk_form.data.get('authors_bio'),
+ contact = talk_form.data.get('contact'),
+ title = talk_form.data.get('title'),
+ abstract = talk_form.data.get('abstract'),
+ topic = talk_form.data.get('topic'),
+ duration = talk_form.data.get('duration'),
+ audience = talk_form.data.get('audience'),
+ approved = False,
+# tags = talk_form.data.get('tags')
+ )
+ talk.save()
+ # Saved, ... redirect back to account
+ redirect_to = reverse('scipycon_edit_talk',
+ kwargs={'scope': scope, 'id': talk.id})
+ return set_message_cookie(redirect_to,
+ msg = u'Thanks, your talk has been submitted.')
+ else:
+ redirect_to = reverse('scipycon_submit_talk',
+ kwargs={'scope': scope})
+ return set_message_cookie(redirect_to,
+ msg = u'Something is wrong here.')
+
+ else:
+ talk_form = TalkSubmitForm()
+ register_form = RegisterForm()
+ login_form = AuthenticationForm()
+
+
+ return render_to_response(template_name, RequestContext(request, {
+ 'params': {'scope': scope},
+ 'talk_form': talk_form,
+ 'register_form' : register_form,
+ 'message' : message,
+ 'login_form' : login_form
+ }))
+
+def list_talks(request, scope, template_name='talk/list-all-talks.html'):
+ """List all the tasks submitted by a user.
+ """
+
+ talks = Talk.objects.filter(approved=True)
+
+ return render_to_response(template_name, RequestContext(request, {
+ 'params': {'scope': scope},
+ 'talk_list': talks,
+ }))
+
+def download_slides(request, scope):
+ """View that lets users allow to download the slides they want.
+ """
+
+ template_name = 'talk/download-slides.html'
+ return render_to_response(template_name, RequestContext(request, {
+ 'params': {'scope': scope},
+ }))
+
+def download_videos(request, scope):
+ """View that gives users the link to the videos
+ """
+
+ template_name = 'talk/download-videos.html'
+ return render_to_response(template_name, RequestContext(request, {
+ 'params': {'scope': scope},
+ }))