Example #1
0
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)
Example #2
0
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)
Example #3
0
    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')
Example #4
0
 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)))
Example #5
0
 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)))
Example #6
0
    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')
Example #7
0
    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')
Example #8
0
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:
Example #9
0
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:
Example #10
0
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)
Example #11
0
    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)))
Example #12
0
 def stats_data_view(self, request):
     from conference.views import json_dumps
     output = self.stats_data()
     return http.HttpResponse(json_dumps(output), 'text/javascript')
Example #13
0
    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')
Example #14
0
    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)))
Example #15
0
 def stats_data_view(self, request):
     from conference.views import json_dumps
     output = self.stats_data()
     return http.HttpResponse(json_dumps(output), 'text/javascript')
Example #16
0
    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')