Skip to content

Commit ef1ed40

Browse files
committed
edit speaker profile
1 parent 98ca69e commit ef1ed40

File tree

15 files changed

+167
-42
lines changed

15 files changed

+167
-42
lines changed

config/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
url(r'^proposals/', include('pycones.proposals.urls', namespace="proposals")),
2525
url(r'^reviewers/', include('pycones.reviewers.urls', namespace="reviewers")),
2626
url(r'^schedule/', include('pycones.schedules.urls', namespace="schedule")),
27+
url(r'^speakers/', include('pycones.speakers.urls', namespace="speakers")),
2728
url(r'^jobboard/', include('pycones.jobboard.urls', namespace="jobboard")),
2829
)
2930

pycones/proposals/actions.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,3 @@
1-
import csv
2-
3-
from django.http import HttpResponse
4-
from django.utils.encoding import smart_text
5-
6-
71
def send_confirmation_action(description="Send confirmation email"):
82
def send_confirmation(modeladmin, request, queryset):
93
for item in queryset:

pycones/schedules/actions.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import unicode_literals, print_function, division, absolute_import
3+
4+
import csv
5+
6+
from django.http import HttpResponse
7+
8+
9+
def download_speakers(modeladmin, request, queryset):
10+
"""Downloads as a CSV file the list of approved speakers, with name and email."""
11+
speakers = []
12+
for presentation in queryset:
13+
speakers += list(presentation.get_speakers())
14+
speakers = set(speakers)
15+
response = HttpResponse(content_type="text/csv")
16+
response["Content-Disposition"] = "attachment; filename=speakers.csv"
17+
writer = csv.writer(response)
18+
for speaker in speakers:
19+
writer.writerow([speaker.name, speaker.user.email])
20+
return response
21+
22+
download_speakers.short_description = "Download speakers"

pycones/schedules/admin.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from django.contrib.admin import ModelAdmin
66
from django.utils.translation import ugettext_lazy as _
77

8+
from pycones.schedules.actions import download_speakers
89
from pycones.schedules.models import Day, Room, SlotKind, Slot, Presentation, Track
910

1011

@@ -24,9 +25,11 @@ class TrackAdmin(ModelAdmin):
2425
list_display = ("id", "day", "name")
2526

2627

28+
@admin.register(Presentation)
29+
class PresentationAdmin(ModelAdmin):
30+
actions = [download_speakers, ]
31+
32+
2733
admin.site.register(Day)
2834
admin.site.register(Room)
2935
admin.site.register(SlotKind)
30-
admin.site.register(Presentation)
31-
32-

pycones/schedules/forms.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,6 @@ class PresentationForm(forms.ModelForm):
99
class Meta:
1010
model = Presentation
1111
fields = ["keynote", "keynote_url"]
12-
12+
widgets = {
13+
"keynote_url": forms.TextInput(attrs={"class": "form-control"})
14+
}

pycones/schedules/views.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from django.contrib import messages
77
from django.core.urlresolvers import reverse
88
from django.http import HttpResponse
9+
from django.http.response import Http404
910
from django.shortcuts import render, get_object_or_404, redirect
1011
from django.utils.safestring import mark_safe
1112
from django.utils.translation import ugettext_lazy as _
@@ -61,7 +62,9 @@ def get_login_url(self):
6162
return reverse("speakers:sign-in")
6263

6364
def get(self, request, presentation_id):
64-
presentation = get_object_or_404(Presentation, pk=presentation_id, speaker=request.user.speaker_profile)
65+
presentation = get_object_or_404(Presentation, pk=presentation_id)
66+
if request.user.speaker not in presentation.get_speakers():
67+
raise Http404()
6568
form = PresentationForm(instance=presentation)
6669
data = {
6770
"presentation": presentation,
@@ -70,7 +73,9 @@ def get(self, request, presentation_id):
7073
return render(request, self.template_name, data)
7174

7275
def post(self, request, presentation_id):
73-
presentation = get_object_or_404(Presentation, pk=presentation_id, speaker=request.user.speaker_profile)
76+
presentation = get_object_or_404(Presentation, pk=presentation_id)
77+
if request.user.speaker not in presentation.get_speakers():
78+
raise Http404()
7479
form = PresentationForm(request.POST, request.FILES, instance=presentation)
7580
data = {
7681
"presentation": presentation,
@@ -79,7 +84,7 @@ def post(self, request, presentation_id):
7984
if form.is_valid():
8085
form.save()
8186
messages.success(request, _("Datos actualizados correctamente"))
82-
return redirect(reverse("speakers:edit"))
87+
return redirect(reverse("schedule:edit-presentation", kwargs={"presentation_id": presentation_id}))
8388
return render(request, self.template_name, data)
8489

8590

pycones/speakers/actions.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# -*- coding: utf-8 -*-
2+
from __future__ import unicode_literals, print_function, division, absolute_import
3+
4+
import csv
5+
6+
from django.http import HttpResponse
7+
8+
9+
def download_approved_speakers(modeladmin, request, queryset):
10+
"""Downloads as a CSV file the list of approved speakers, with name and email."""
11+
speakers = filter(lambda item: item.is_approved(), queryset)
12+
response = HttpResponse(content_type="text/csv")
13+
response["Content-Disposition"] = "attachment; filename=speakers.csv"
14+
writer = csv.writer(response)
15+
for speaker in speakers:
16+
writer.writerow([speaker.name, speaker.user.email])
17+
return response
18+
19+
download_approved_speakers.short_description = "Download approved speakers"

pycones/speakers/admin.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,13 @@
33

44
from django.contrib import admin
55

6+
from pycones.speakers.actions import download_approved_speakers
67
from pycones.speakers.models import Speaker
78

8-
admin.site.register(Speaker,
9-
list_display=["name", "email", "created"],
10-
search_fields=["name"])
9+
10+
@admin.register(Speaker)
11+
class SpeakerAdmin(admin.ModelAdmin):
12+
list_display = ["name", "email", "created"]
13+
search_fields = ["name"]
14+
actions = [download_approved_speakers]
15+

pycones/speakers/forms.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class SpeakerForm(forms.ModelForm):
99

1010
class Meta:
1111
model = Speaker
12-
fields = ["name", "email", "biography", "photo"]
12+
fields = ["name", "biography", "photo"]
1313
widgets = {
1414
"biography": AdminMarkupTextareaWidget(attrs={"class": "form-control"}),
1515
"name": forms.TextInput(attrs={"class": "form-control"}),

pycones/speakers/models.py

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,16 +55,6 @@ def email(self):
5555
else:
5656
return self.invite_email
5757

58-
@property
59-
def all_presentations(self):
60-
presentations = []
61-
if self.presentations:
62-
for p in self.presentations.all():
63-
presentations.append(p)
64-
for p in self.copresentations.all():
65-
presentations.append(p)
66-
return presentations
67-
6858
def __str__(self):
6959
if self.user:
7060
return self.name
@@ -77,6 +67,10 @@ def has_biography(self):
7767
def get_api_id(self):
7868
return "S{:05d}".format(self.pk)
7969

70+
def is_approved(self):
71+
"""Checks if the speaker has a presentation."""
72+
return self.proposals.filter(presentation__isnull=False).exists() or self.presentations.exists()
73+
8074
def save(self, **kwargs):
8175
"""Save user full name by default for speaker."""
8276
if not self.name:

0 commit comments

Comments
 (0)