def p3_profile(request, slug, profile=None, full_access=False, format_='html'): if format_ == 'json': pdata = dataaccess.profile_data(profile.user_id) from conference.templatetags.conference import markdown2 pdata['bio'] = markdown2(pdata['bio'], "smarty-pants,code-color") return http.HttpResponse(json_dumps(pdata), content_type='text/javascript') tpl = 'conference/profile_publicdata_form.html' if request.method == 'POST': section = request.POST.get('section') if section == 'public-data': fc = p3forms.P3ProfilePublicDataForm tpl = 'conference/profile_publicdata_form.html' elif section == 'bio': fc = p3forms.P3ProfileBioForm tpl = 'conference/profile_bio_form.html' elif section == 'visibility': fc = p3forms.P3ProfileVisibilityForm tpl = 'conference/profile_visibility_form.html' elif section == 'picture': fc = p3forms.P3ProfilePictureForm tpl = 'conference/profile_picture_form.html' else: fc = p3forms.P3ProfileForm form = fc(instance=profile, data=request.POST, files=request.FILES) if form.is_valid(): form.save() else: form = p3forms.P3ProfileForm(instance=profile) ctx = { 'form': form, 'full_access': full_access, 'profile': profile, } return render(request, tpl, ctx)
def p3_profile(request, slug, profile=None, full_access=False, format_="html"): if format_ == "json": pdata = dataaccess.profile_data(profile.user_id) from conference.templatetags.conference import markdown2 pdata["bio"] = markdown2(pdata["bio"], "smarty-pants,code-color") return http.HttpResponse(json_dumps(pdata), content_type="text/javascript") tpl = "conference/profile_publicdata_form.html" if request.method == "POST": section = request.POST.get("section") if section == "public-data": fc = p3forms.P3ProfilePublicDataForm tpl = "conference/profile_publicdata_form.html" elif section == "bio": fc = p3forms.P3ProfileBioForm tpl = "conference/profile_bio_form.html" elif section == "visibility": fc = p3forms.P3ProfileVisibilityForm tpl = "conference/profile_visibility_form.html" elif section == "picture": fc = p3forms.P3ProfilePictureForm tpl = "conference/profile_picture_form.html" else: fc = p3forms.P3ProfileForm form = fc(instance=profile, data=request.POST, files=request.FILES) if form.is_valid(): form.save() else: form = p3forms.P3ProfileForm(instance=profile) ctx = {"form": form, "full_access": full_access, "profile": profile} return render(request, tpl, ctx)
def ticket_list(self, request): from conference.views import json_dumps day_ix = int(request.GET['day']) room_type = request.GET['type'] rdays = models.TicketRoom.objects.reserved_days() day = rdays[day_ix] qs = models.TicketRoom.objects.valid_tickets()\ .filter(room_type__room_type=room_type, checkin__lte=day, checkout__gte=day)\ .select_related('ticket__user', 'ticket__orderitem__order')\ .order_by('ticket__orderitem__order__created') output = [] for row in qs: user = row.ticket.user order = row.ticket.orderitem.order name = u'{0} {1}'.format(user.first_name, user.last_name) if row.ticket.name and row.ticket.name != name: name = u'{0} ({1})'.format(row.ticket.name, name) output.append({ 'user': { 'id': user.id, 'name': name, }, 'order': { 'id': order.id, 'code': order.code, 'method': order.method, 'complete': order._complete, }, 'period': (row.checkin, row.checkout, row.checkout == day), }) return http.HttpResponse(json_dumps(output), 'text/javascript')
def tracks(self, request, sid, tid): track = get_object_or_404(models.Track, schedule=sid, id=tid) from conference.forms import TrackForm if request.method == 'POST': tracks = models.Track.objects\ .filter(schedule__conference=track.schedule.conference, track=track.track) for t in tracks: form = TrackForm(instance=t, data=request.POST) form.save() output = { 'tracks': [t.id for t in tracks], } return http.HttpResponse(content=views.json_dumps(output), content_type="text/javascript") else: form = TrackForm(instance=track) tpl = Template(''' <form class="async" method="POST" action="{% url "admin:conference-schedule-tracks" sid tid %}">{% csrf_token %} <table>{{ form }}</table> <div class="submit-row"> <input type="submit" /> </div> </form> ''') ctx = { 'form': form, 'sid': sid, 'tid': tid, } return http.HttpResponse( tpl.render(template.RequestContext(request, ctx)))
def tracks(self, request, sid, tid): track = get_object_or_404(models.Track, schedule=sid, id=tid) from conference.forms import TrackForm if request.method == 'POST': tracks = models.Track.objects\ .filter(schedule__conference=track.schedule.conference, track=track.track) for t in tracks: form = TrackForm(instance=t, data=request.POST) form.save() output = { 'tracks': [ t.id for t in tracks ], } return http.HttpResponse(content=views.json_dumps(output), content_type="text/javascript") else: form = TrackForm(instance=track) tpl = Template(''' <form class="async" method="POST" action="{% url "admin:conference-schedule-tracks" sid tid %}">{% csrf_token %} <table>{{ form }}</table> <div class="submit-row"> <input type="submit" /> </div> </form> ''') ctx = { 'form': form, 'sid': sid, 'tid': tid, } return http.HttpResponse(tpl.render(template.RequestContext(request, ctx)))
def stats_data(self, request): from conference.views import json_dumps from django.db.models import Q from collections import defaultdict from microblog.models import PostContent import datetime conferences = cmodels.Conference.objects\ .exclude(code__startswith='ep')\ .order_by('conference_start') output = {} for c in conferences: tickets = cmodels.Ticket.objects\ .filter(fare__conference=c)\ .filter(Q(orderitem__order___complete=True) | Q(orderitem__order__method__in=('bank', 'admin')))\ .select_related('fare', 'orderitem__order') data = { 'conference': defaultdict(lambda: 0), 'partner': defaultdict(lambda: 0), 'event': defaultdict(lambda: 0), 'other': defaultdict(lambda: 0), } for t in tickets: tt = t.fare.ticket_type date = t.orderitem.order.created.date() offset = date - c.conference_start data[tt][offset.days] += 1 for k, v in data.items(): data[k] = sorted(v.items()) dlimit = datetime.date(c.conference_start.year, 1, 1) deadlines = cmodels.DeadlineContent.objects\ .filter(language='en')\ .filter(deadline__date__lte=c.conference_start, deadline__date__gte=dlimit)\ .select_related('deadline')\ .order_by('deadline__date') markers = [((d.deadline.date - c.conference_start).days, 'CAL: ' + (d.headline or d.body)) for d in deadlines] posts = PostContent.objects\ .filter(language='en')\ .filter(post__date__lte=c.conference_start, post__date__gte=dlimit)\ .filter(post__status='P')\ .select_related('post')\ .order_by('post__date') markers += [((d.post.date.date() - c.conference_start).days, 'BLOG: ' + d.headline) for d in posts] output[c.code] = { 'data': data, 'markers': markers, } return http.HttpResponse(json_dumps(output), 'text/javascript')
def stats_data(self, request): from conference.views import json_dumps from django.db.models import Q from collections import defaultdict from microblog.models import PostContent import datetime conferences = cmodels.Conference.objects\ .order_by('conference_start') output = {} for c in conferences: tickets = cmodels.Ticket.objects\ .filter(fare__conference=c)\ .filter(Q(orderitem__order___complete=True) | Q(orderitem__order__method__in=('bank', 'admin')))\ .select_related('fare', 'orderitem__order') data = { 'conference': defaultdict(lambda: 0), 'partner': defaultdict(lambda: 0), 'event': defaultdict(lambda: 0), 'other': defaultdict(lambda: 0), } for t in tickets: tt = t.fare.ticket_type date = t.orderitem.order.created.date() offset = date - c.conference_start data[tt][offset.days] += 1 for k, v in data.items(): data[k] = sorted(v.items()) dlimit = datetime.date(c.conference_start.year, 1, 1) deadlines = cmodels.DeadlineContent.objects\ .filter(language='en')\ .filter(deadline__date__lte=c.conference_start, deadline__date__gte=dlimit)\ .select_related('deadline')\ .order_by('deadline__date') markers = [ ((d.deadline.date - c.conference_start).days, 'CAL: ' + (d.headline or d.body)) for d in deadlines ] posts = PostContent.objects\ .filter(language='en')\ .filter(post__date__lte=c.conference_start, post__date__gte=dlimit)\ .filter(post__status='P')\ .select_related('post')\ .order_by('post__date') markers += [ ((d.post.date.date() - c.conference_start).days, 'BLOG: ' + d.headline) for d in posts ] output[c.code] = { 'data': data, 'markers': markers, } return http.HttpResponse(json_dumps(output), 'text/javascript')
def render_to_json(f): from conference.views import json_dumps if dsettings.DEBUG: ct = 'text/plain' j = lambda d: json_dumps(d, indent=2) else: ct = 'application/json' j = json_dumps def wrapper(*args, **kw): try: result = f(*args, **kw) except Exception, e: result = j(str(e)) status = 500 else:
def p3_profile(request, slug, profile=None, full_access=False, format_='html'): if format_ == 'json': pdata = dataaccess.profile_data(profile.user_id) from conference.templatetags.conference import markdown2 pdata['bio'] = markdown2(pdata['bio'], "smarty-pants,code-color") return http.HttpResponse( json_dumps(pdata), content_type='text/javascript') tpl = 'conference/profile_publicdata_form.html' if request.method == 'POST': section = request.POST.get('section') if section == 'public-data': fc = p3forms.P3ProfilePublicDataForm tpl = 'conference/profile_publicdata_form.html' elif section == 'bio': fc = p3forms.P3ProfileBioForm tpl = 'conference/profile_bio_form.html' elif section == 'visibility': fc = p3forms.P3ProfileVisibilityForm tpl = 'conference/profile_visibility_form.html' elif section == 'picture': fc = p3forms.P3ProfilePictureForm tpl = 'conference/profile_picture_form.html' else: fc = p3forms.P3ProfileForm form = fc(instance=profile, data=request.POST, files=request.FILES) if form.is_valid(): form.save() else: form = p3forms.P3ProfileForm(instance=profile) ctx = { 'form': form, 'full_access': full_access, 'profile': profile, } return render(request, tpl, ctx)
def event(self, request, sid, eid): ev = get_object_or_404(models.Event, schedule=sid, id=eid) class SimplifiedTalkForm(forms.Form): tags = forms.CharField( max_length=200, required=False, help_text= 'comma separated list of tags. Something like: special, break, keynote' ) bookable = forms.BooleanField( required=False, help_text='check if the event expect a reservation') seats = forms.IntegerField( min_value=0, required=False, help_text='Seats available. Override the track default if set') sponsor = forms.ModelChoiceField( queryset=models.Sponsor.objects\ .filter(sponsorincome__conference=settings.CONFERENCE)\ .order_by('sponsor'), required=False ) tracks = forms.ModelMultipleChoiceField( queryset=models.Track.objects\ .filter(schedule=ev.schedule) ) class SimplifiedCustomForm(forms.Form): custom = forms.CharField(max_length=200) abstract = forms.CharField(widget=forms.Textarea, required=False) duration = forms.IntegerField(min_value=0) tags = forms.CharField( max_length=200, required=False, help_text= 'comma separated list of tags. Something like: special, break, keynote' ) bookable = forms.BooleanField( required=False, help_text='check if the event expect a reservation') seats = forms.IntegerField( min_value=0, required=False, help_text='Seats available. Override the track default if set') sponsor = forms.ModelChoiceField( queryset=models.Sponsor.objects\ .filter(sponsorincome__conference=settings.CONFERENCE)\ .order_by('sponsor'), required=False ) tracks = forms.ModelMultipleChoiceField( queryset=models.Track.objects\ .filter(schedule=ev.schedule) ) class MoveEventForm(forms.Form): start_time = forms.TimeField() track = forms.ModelChoiceField(queryset=models.Track.objects.all(), required=False) class SplitEventForm(forms.Form): split_time = forms.IntegerField(min_value=1) if request.method == 'POST': if 'delete' in request.POST: ev.delete() elif 'save' in request.POST or 'copy' in request.POST or 'update' in request.POST: if ev.talk_id: form = SimplifiedTalkForm(data=request.POST) else: form = SimplifiedCustomForm(data=request.POST) if form.is_valid(): data = form.cleaned_data ev.sponsor = data['sponsor'] ev.tags = data['tags'] ev.bookable = data['bookable'] ev.seats = data['seats'] or 0 if not ev.talk_id: ev.custom = data['custom'] ev.abstract = data['abstract'] ev.duration = data['duration'] ev.save() models.EventTrack.objects.filter(event=ev).delete() for t in data['tracks']: models.EventTrack(event=ev, track=t).save() if 'copy' in request.POST: schedules = models.Schedule.objects\ .filter(conference=ev.schedule.conference)\ .exclude(id=ev.schedule_id) tracks = models.Track.objects\ .filter(schedule__in=schedules)\ .values('id', 'track', 'schedule') tmap = defaultdict(dict) for t in tracks: tmap[t['schedule']][t['track']] = t['id'] etracks = set(models.EventTrack.objects\ .filter(event=ev)\ .values_list('track__track', flat=True)) for sid, tracks in tmap.items(): if models.Event.objects.filter( schedule=sid, start_time=ev.start_time).exists(): continue ev.id = None ev.schedule_id = sid ev.save() for x in etracks: if x in tracks: models.EventTrack( event=ev, track_id=tracks[x]).save() elif 'update' in request.POST and not ev.talk_id: eids = models.EventTrack.objects\ .filter(track__in=data['tracks'], event__custom=ev.custom)\ .exclude(event=ev)\ .values('event') events = models.Event.objects\ .filter(id__in=eids) for e in events: e.sponsor = ev.sponsor e.tags = ev.tags e.bookable = ev.bookable e.seats = ev.seats e.abstract = ev.abstract e.duration = ev.duration e.save() elif 'move' in request.POST: form = MoveEventForm(data=request.POST) if form.is_valid(): data = form.cleaned_data ev.start_time = data['start_time'] ev.save() if data.get('track'): models.EventTrack.objects.filter(event=ev).delete() models.EventTrack(event=ev, track=data['track']).save() elif 'split' in request.POST: form = SplitEventForm(data=request.POST) if form.is_valid(): data = form.cleaned_data ev.split(time=data['split_time']) else: raise ValueError() return http.HttpResponse(content=views.json_dumps({}), content_type="text/javascript") else: if ev.talk_id != None: form = SimplifiedTalkForm( data={ 'sponsor': ev.sponsor.id if ev.sponsor else None, 'tags': ev.tags, 'bookable': ev.bookable, 'seats': ev.seats, 'tracks': list(ev.tracks.all().values_list('id', flat=True)), }) else: form = SimplifiedCustomForm( data={ 'sponsor': ev.sponsor.id if ev.sponsor else None, 'tags': ev.tags, 'bookable': ev.bookable, 'seats': ev.seats, 'custom': ev.custom, 'abstract': ev.abstract, 'duration': ev.duration, 'tracks': list(ev.tracks.all().values_list('id', flat=True)), }) tpl = Template(''' <form class="async" method="POST" action="{% url "admin:conference-schedule-event" sid eid %}">{% csrf_token %} <table>{{ form }}</table> <div class="submit-row"> <input type="submit" name="save" value="save"/> <input type="submit" name="delete" value="delete"/> <input type="submit" name="copy" title="repeat in all schedules/days" value="save and repeat"/> <input type="submit" name="update" title="updates events with the same title in the tracks with the same name" value="save and update"/> </div> </form> ''') ctx = { 'form': form, 'sid': sid, 'eid': eid, } return http.HttpResponse( tpl.render(template.RequestContext(request, ctx)))
def stats_data_view(self, request): from conference.views import json_dumps output = self.stats_data() return http.HttpResponse(json_dumps(output), 'text/javascript')
def stats_data(self, request): from conference.views import json_dumps from django.db.models import Q from collections import defaultdict from microblog.models import PostContent import datetime import random conferences = cmodels.Conference.objects \ .exclude(code__startswith='ep') \ .order_by('conference_start') output = {} for c in conferences: tickets = cmodels.Ticket.objects \ .filter(fare__conference=c) \ .filter(Q(orderitem__order___complete=True) | Q(orderitem__order__method__in=('bank', 'admin'))) \ .select_related('fare', 'orderitem__order') data = { 'conference': defaultdict(lambda: 0), 'partner': defaultdict(lambda: 0), 'event': defaultdict(lambda: 0), 'other': defaultdict(lambda: 0), } for t in tickets: tt = t.fare.ticket_type date = t.orderitem.order.created.date() offset = date - c.conference_start data[tt][offset.days] += 1 for k, v in data.items(): data[k] = sorted(v.items()) dlimit = datetime.date(c.conference_start.year, 1, 1) deadlines = cmodels.DeadlineContent.objects \ .filter(language='en') \ .filter(deadline__date__lte=c.conference_start, deadline__date__gte=dlimit) \ .select_related('deadline') \ .order_by('deadline__date') markers = [((d.deadline.date - c.conference_start).days, 'CAL: ' + (d.headline or d.body)) for d in deadlines] posts = PostContent.objects \ .filter(language='en') \ .filter(post__date__lte=c.conference_start, post__date__gte=dlimit) \ .filter(post__status='P') \ .select_related('post') \ .order_by('post__date') markers += [((d.post.date.date() - c.conference_start).days, 'BLOG: ' + d.headline) for d in posts] output[c.code] = { 'data': data, 'markers': markers, } plot_data = output def accumulate_tickets(list_of_lists): x = 0 b = [] for el in list_of_lists: b.append([el[0], el[1] + x]) x += el[1] return b series = [] for k, v in plot_data.iteritems(): for k1, v1 in plot_data[k]['data'].iteritems(): series.append({'name': k + '-' + k1, 'type': 'area', 'data': accumulate_tickets(v1)}) markers = [] for k, v in plot_data.iteritems(): markers.append({'labelOptions': { 'shape': 'connector', 'align': 'right', 'justify': 'false', 'crop': 'true', 'style': { 'fontSize': '0.8em', 'textOutline': '1px white' }}, 'labels': [ {'point': {'xAxis': 0, 'yAxis': 0, 'x': el[0], 'y': random.randint(0, 600)}, 'text': k + '-' + el[1]} for el in plot_data[k]['markers'] ]}) lines = [] for k, v in plot_data.items(): for el in plot_data[k]['markers']: lines.append({'color': '#e6e6e6', 'value': el[0], 'width': 1}) output = {'series': series, 'lines': lines, 'markers': markers} return http.HttpResponse(json_dumps(output), 'text/javascript')
def event(self, request, sid, eid): ev = get_object_or_404(models.Event, schedule=sid, id=eid) class SimplifiedTalkForm(forms.Form): tags = forms.CharField( max_length=200, required=False, help_text='comma separated list of tags. Something like: special, break, keynote' ) bookable = forms.BooleanField( required=False, help_text='check if the event expect a reservation' ) seats = forms.IntegerField( min_value=0, required=False, help_text='Seats available. Override the track default if set' ) sponsor = forms.ModelChoiceField( queryset=models.Sponsor.objects\ .filter(sponsorincome__conference=settings.CONFERENCE)\ .order_by('sponsor'), required=False ) tracks = forms.ModelMultipleChoiceField( queryset=models.Track.objects\ .filter(schedule=ev.schedule) ) class SimplifiedCustomForm(forms.Form): custom = forms.CharField(max_length=200) abstract = forms.CharField(widget=forms.Textarea, required=False) duration = forms.IntegerField(min_value=0) tags = forms.CharField( max_length=200, required=False, help_text='comma separated list of tags. Something like: special, break, keynote' ) bookable = forms.BooleanField( required=False, help_text='check if the event expect a reservation' ) seats = forms.IntegerField( min_value=0, required=False, help_text='Seats available. Override the track default if set' ) sponsor = forms.ModelChoiceField( queryset=models.Sponsor.objects\ .filter(sponsorincome__conference=settings.CONFERENCE)\ .order_by('sponsor'), required=False ) tracks = forms.ModelMultipleChoiceField( queryset=models.Track.objects\ .filter(schedule=ev.schedule) ) class MoveEventForm(forms.Form): start_time = forms.TimeField() track = forms.ModelChoiceField(queryset=models.Track.objects.all(), required=False) class SplitEventForm(forms.Form): split_time = forms.IntegerField(min_value=1) if request.method == 'POST': if 'delete' in request.POST: ev.delete() elif 'save' in request.POST or 'copy' in request.POST or 'update' in request.POST: if ev.talk_id: form = SimplifiedTalkForm(data=request.POST) else: form = SimplifiedCustomForm(data=request.POST) if form.is_valid(): data = form.cleaned_data ev.sponsor = data['sponsor'] ev.tags = data['tags'] ev.bookable = data['bookable'] ev.seats = data['seats'] or 0 if not ev.talk_id: ev.custom = data['custom'] ev.abstract = data['abstract'] ev.duration = data['duration'] ev.save() models.EventTrack.objects.filter(event=ev).delete() for t in data['tracks']: models.EventTrack(event=ev, track=t).save() if 'copy' in request.POST: schedules = models.Schedule.objects\ .filter(conference=ev.schedule.conference)\ .exclude(id=ev.schedule_id) tracks = models.Track.objects\ .filter(schedule__in=schedules)\ .values('id', 'track', 'schedule') tmap = defaultdict(dict) for t in tracks: tmap[t['schedule']][t['track']] = t['id'] etracks = set(models.EventTrack.objects\ .filter(event=ev)\ .values_list('track__track', flat=True)) for sid, tracks in tmap.items(): if models.Event.objects.filter(schedule=sid, start_time=ev.start_time).exists(): continue ev.id = None ev.schedule_id = sid ev.save() for x in etracks: if x in tracks: models.EventTrack(event=ev, track_id=tracks[x]).save() elif 'update' in request.POST and not ev.talk_id: eids = models.EventTrack.objects\ .filter(track__in=data['tracks'], event__custom=ev.custom)\ .exclude(event=ev)\ .values('event') events = models.Event.objects\ .filter(id__in=eids) for e in events: e.sponsor = ev.sponsor e.tags = ev.tags e.bookable = ev.bookable e.seats = ev.seats e.abstract = ev.abstract e.duration = ev.duration e.save() elif 'move' in request.POST: form = MoveEventForm(data=request.POST) if form.is_valid(): data = form.cleaned_data ev.start_time = data['start_time'] ev.save() if data.get('track'): models.EventTrack.objects.filter(event=ev).delete() models.EventTrack(event=ev, track=data['track']).save() elif 'split' in request.POST: form = SplitEventForm(data=request.POST) if form.is_valid(): data = form.cleaned_data ev.split(time=data['split_time']) else: raise ValueError() return http.HttpResponse(content=views.json_dumps({}), content_type="text/javascript") else: if ev.talk_id != None: form = SimplifiedTalkForm(data={ 'sponsor': ev.sponsor.id if ev.sponsor else None, 'tags': ev.tags, 'bookable': ev.bookable, 'seats': ev.seats, 'tracks': list(ev.tracks.all().values_list('id', flat=True)), }) else: form = SimplifiedCustomForm(data={ 'sponsor': ev.sponsor.id if ev.sponsor else None, 'tags': ev.tags, 'bookable': ev.bookable, 'seats': ev.seats, 'custom': ev.custom, 'abstract': ev.abstract, 'duration': ev.duration, 'tracks': list(ev.tracks.all().values_list('id', flat=True)), }) tpl = Template(''' <form class="async" method="POST" action="{% url "admin:conference-schedule-event" sid eid %}">{% csrf_token %} <table>{{ form }}</table> <div class="submit-row"> <input type="submit" name="save" value="save"/> <input type="submit" name="delete" value="delete"/> <input type="submit" name="copy" title="repeat in all schedules/days" value="save and repeat"/> <input type="submit" name="update" title="updates events with the same title in the tracks with the same name" value="save and update"/> </div> </form> ''') ctx = { 'form': form, 'sid': sid, 'eid': eid, } return http.HttpResponse(tpl.render(template.RequestContext(request, ctx)))
def stats_data(self, request): from conference.views import json_dumps from django.db.models import Q from collections import defaultdict from microblog.models import PostContent import datetime import random conferences = cmodels.Conference.objects \ .exclude(code__startswith='ep') \ .order_by('conference_start') output = {} for c in conferences: tickets = cmodels.Ticket.objects \ .filter(fare__conference=c) \ .filter(Q(orderitem__order___complete=True) | Q(orderitem__order__method__in=('bank', 'admin'))) \ .select_related('fare', 'orderitem__order') data = { 'conference': defaultdict(lambda: 0), 'partner': defaultdict(lambda: 0), 'event': defaultdict(lambda: 0), 'other': defaultdict(lambda: 0), } for t in tickets: tt = t.fare.ticket_type date = t.orderitem.order.created.date() offset = date - c.conference_start data[tt][offset.days] += 1 for k, v in data.items(): data[k] = sorted(v.items()) dlimit = datetime.date(c.conference_start.year, 1, 1) deadlines = cmodels.DeadlineContent.objects \ .filter(language='en') \ .filter(deadline__date__lte=c.conference_start, deadline__date__gte=dlimit) \ .select_related('deadline') \ .order_by('deadline__date') markers = [((d.deadline.date - c.conference_start).days, 'CAL: ' + (d.headline or d.body)) for d in deadlines] posts = PostContent.objects \ .filter(language='en') \ .filter(post__date__lte=c.conference_start, post__date__gte=dlimit) \ .filter(post__status='P') \ .select_related('post') \ .order_by('post__date') markers += [((d.post.date.date() - c.conference_start).days, 'BLOG: ' + d.headline) for d in posts] output[c.code] = { 'data': data, 'markers': markers, } plot_data = output def accumulate_tickets(list_of_lists): x = 0 b = [] for el in list_of_lists: b.append([el[0], el[1] + x]) x += el[1] return b series = [] for k, v in plot_data.iteritems(): for k1, v1 in plot_data[k]['data'].iteritems(): series.append({ 'name': k + '-' + k1, 'type': 'area', 'data': accumulate_tickets(v1) }) markers = [] for k, v in plot_data.iteritems(): markers.append({ 'labelOptions': { 'shape': 'connector', 'align': 'right', 'justify': 'false', 'crop': 'true', 'style': { 'fontSize': '0.8em', 'textOutline': '1px white' } }, 'labels': [{ 'point': { 'xAxis': 0, 'yAxis': 0, 'x': el[0], 'y': random.randint(0, 600) }, 'text': k + '-' + el[1] } for el in plot_data[k]['markers']] }) lines = [] for k, v in plot_data.items(): for el in plot_data[k]['markers']: lines.append({'color': '#e6e6e6', 'value': el[0], 'width': 1}) output = {'series': series, 'lines': lines, 'markers': markers} return http.HttpResponse(json_dumps(output), 'text/javascript')