Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ script:
- coverage run manage.py test
after_success:
- coveralls
# - fab deploy
env:
global:
- secure: JFAH2i22AtBYLTpgzecYdv4aDuR5SIDAqgmZ6Vc5hx9GrvXs2W//NeMXPG6rTJhQoFfFUrko3Zjnasefm+CX+hJ/ZtwsgMgZlydqcEsVsPZrT6MQY6a0XIkgOKBsuZAbzztC/B8hiTnIiCSM00BKywprT/rM56u3AEGh4oJhMR0=
before_install:
- openssl aes-256-cbc -K $encrypted_12f6bf8c95e8_key -iv $encrypted_12f6bf8c95e8_iv
-in deploy-key.enc -out deploy-key -d
8 changes: 7 additions & 1 deletion deck/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

from datetimewidget.widgets import DateTimeWidget

from .models import Event, Proposal, Activity
from .models import Event, Proposal, Activity, Track


class CustomDateTimeWidget(DateTimeWidget):
Expand Down Expand Up @@ -98,3 +98,9 @@ class Meta:
'start_timetable': CustomTimeInputWidget(format='%H:%M'),
'end_timetable': CustomTimeInputWidget(format='%H:%M'),
}


class TrackForm(forms.ModelForm):
class Meta:
model = Track
fields = ('title',)
3 changes: 3 additions & 0 deletions deck/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -274,6 +274,9 @@ def proposals(self):
pk__in=self.activities.values_list('pk', flat=True)
)

def get_absolute_url(self):
return reverse('view_event', kwargs={'slug': self.event.slug})


class Event(DeckBaseModel):
allow_public_voting = models.BooleanField(_('Allow Public Voting'),
Expand Down
3 changes: 3 additions & 0 deletions deck/templates/event/snippets/event_list_item.html
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ <h3 class="panel-title event-title">{{ event.title }}</h3>
<a href="{% url 'create_event_schedule' slug=event.slug %}" class="btn-flat gray text-upper" data-toggle="tooltip" title="{% trans 'Create and Organize the Schedule of Talks.' %}">
<i class="icon-calendar"></i> {% trans "Create Schedule" %}
</a>
<a href="{% url 'create_event_track' slug=event.slug %}" class="btn-flat gray text-upper" data-toggle="tooltip" title="{% trans 'Create Tracks.' %}">
<i class="icon-th-list"></i> {% trans "Create Tracks" %}
</a>
</div>
{% endif %}
</div>
28 changes: 28 additions & 0 deletions deck/templates/track/track_confirm_delete.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{% extends "layout.html" %}

{% load i18n %}
{% load bootstrap3 %}

{% block head_title %}{% trans "Delete Track" %}: "{{ object }}"{% endblock %}

{% block content %}
<div class="row">
<h1>{% trans "Delete Track" %}: "{{ object }}"</h1>
<p>{% trans "Are you sure you want to delete this track?" %}</p>
<p>{% trans "After deleting this track all activities will be lost forever." %}</p>
<form method="POST">
{% buttons %}
<button type="submit" class="btn-flat success text-upper">
<i class="icon icon-trash"></i>
{% trans "Delete" %}
</button>
<div class="pull-right">
<a href="{% url 'view_event' slug=object.event.slug %}" class="link text-upper">
<i class="icon-calendar"></i>
{% trans "event detail" %}
</a>
</div>
{% endbuttons %}
</form>
</div>
{% endblock content %}
69 changes: 69 additions & 0 deletions deck/templates/track/track_form.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
{% extends "layout.html" %}

{% load i18n %}
{% load bootstrap3 %}

{% block head_title %}
{% if form.instance.pk %}
{% trans "Update Track" %}: "{{ object }}"
{% else %}
{% trans "New Track" %}
{% endif %}
{% endblock %}

{% block head %}
<!-- libraries for this page -->
<link href="{{ STATIC_URL }}css/libs/uniform.default.css" type="text/css" rel="stylesheet" />
{% endblock head %}

{% block content %}
<ol class="breadcrumb">
<li><a href="{% url 'index_page' %}">{% trans "Home" %}</a></li>
<li><a href="{% url 'list_events' %}">{% trans "Events" %}</a></li>
<li><a href="{% url 'view_event' slug=event.slug %}">{{ event.title }}</a></li>
{% if form.instance.pk %}
<li class="active">Update Track</li>
{% else %}
<li class="active">New Track</li>
{% endif %}
</ol>

<div class="row header">
<h2>
{% if form.instance.pk %}
{% trans "Update Track" %} "{{ object }}"
{% else %}
{% trans "New Track for" %} "{{ event }}"
{% endif %}
</h2>
</div>
<div class="row form-wrapper">
<!-- left column -->
<div class="column">
<form method="POST" novalidate>
{% csrf_token %}

{% bootstrap_form form layout="inline" %}

{% buttons %}
<button type="submit" class="btn-flat success text-upper">
<i class="icon icon-edit"></i>
{% trans "submit" %}
</button>
<div class="pull-right">
<a href="{% url 'view_event' slug=event.slug %}" class="link text-upper">
<i class="icon-calendar"></i>
{% trans "event detail" %}
</a>
</div>
{% endbuttons %}
</form>
</div>
</div>
</div>
{% endblock content %}

{% block scripts %}
<!-- scripts for this page -->
<script src="{{ STATIC_URL }}js/libs/jquery.uniform.min.js"></script>
{% endblock scripts %}
11 changes: 11 additions & 0 deletions deck/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,4 +56,15 @@
r'proposals/<slug:slug>/disapprove_proposal/',
view=views.DisapproveProposal.as_view(),
name='disapprove_proposal'),
url(regex=r'/events/<slug:slug>/tracks/create/',
view=views.CreateTrack.as_view(),
name='create_event_track'),
url(regex=r'/events/<slug:event_slug>/'
r'tracks/<slug:slug>/update/',
view=views.UpdateTrack.as_view(),
name='update_track'),
url(regex=r'/events/<slug:event_slug>/'
r'tracks/<slug:slug>/delete/',
view=views.DeleteTrack.as_view(),
name='delete_track'),
)
68 changes: 66 additions & 2 deletions deck/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,11 @@
from vanilla import CreateView, DeleteView, DetailView, ListView, UpdateView
from djqscsv import render_to_csv_response

from .models import Event, Proposal, Vote, Activity
from .forms import EventForm, ProposalForm, ActivityForm, ActivityTimetableForm
from .models import Event, Proposal, Vote, Activity, Track
from .forms import (
EventForm, ProposalForm, ActivityForm,
ActivityTimetableForm, TrackForm
)
from core.mixins import LoginRequiredMixin, FormValidRedirectMixing


Expand Down Expand Up @@ -551,3 +554,64 @@ def dispatch(self, *args, **kwargs):
content_type='application/json'
)
return super(DisapproveProposal, self).dispatch(*args, **kwargs)


class BaseTrackView(object):
model = Track
form_class = TrackForm
lookup_field = 'slug'


class CreateTrack(LoginRequiredMixin,
BaseTrackView,
CreateView,
FormValidRedirectMixing):
template_name = 'track/track_form.html'

def get_context_data(self, **kwargs):
context = super(CreateTrack, self).get_context_data(**kwargs)
context['event'] = Event.objects.get(slug=self.kwargs['slug'])
return context

def form_valid(self, form):
self.object = form.save(commit=False)
self.object.author = self.request.user
self.object.event = Event.objects.get(slug=self.kwargs['slug'])
self.object.save()
return self.success_redirect(_(u'Track created.'))


class UpdateTrack(LoginRequiredMixin,
BaseTrackView,
UpdateView,
FormValidRedirectMixing):
template_name = 'track/track_form.html'

def get_context_data(self, **kwargs):
context = super(UpdateTrack, self).get_context_data(**kwargs)
context['event'] = Event.objects.get(slug=self.kwargs['event_slug'])
return context

def form_valid(self, form):
self.object = form.save()
return self.success_redirect(_(u'Track updated.'))


class DeleteTrack(BaseTrackView, DeleteView):
template_name = 'track/track_confirm_delete.html'

def post(self, request, *args, **kwargs):
track = self.get_object()
track.delete()
messages.success(self.request, _(u'Track deleted.'))
return HttpResponseRedirect(track.event.get_absolute_url())

@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
track = self.get_object()
if (track.event.author != self.request.user and
not self.request.user.is_superuser):
messages.error(
self.request, _(u'You are not allowed to see this page.'))
return HttpResponseRedirect(track.event.get_absolute_url())
return super(DeleteProposal, self).dispatch(*args, **kwargs)