volunteers list
This commit is contained in:
parent
e497ab0df2
commit
d988a11a71
|
@ -73,6 +73,9 @@
|
||||||
<li role="presentation">
|
<li role="presentation">
|
||||||
<a role="menuitem" tabindex="-1" href="{% url 'list-speakers' %}"><span class="glyphicon glyphicon-user"></span> {% trans "Speakers" %}</a>
|
<a role="menuitem" tabindex="-1" href="{% url 'list-speakers' %}"><span class="glyphicon glyphicon-user"></span> {% trans "Speakers" %}</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li role="presentation">
|
||||||
|
<a role="menuitem" tabindex="-1" href="{% url 'list-volunteers' %}"><span class="glyphicon glyphicon-thumbs-up"></span> {% trans "Volunteers" %}</a>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="dropdown{% block planningtab %}{% endblock %}">
|
<li class="dropdown{% block planningtab %}{% endblock %}">
|
||||||
|
|
|
@ -7,3 +7,17 @@ class ActivityForm(forms.ModelForm):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Activity
|
model = Activity
|
||||||
fields=['name', 'description', 'participants']
|
fields=['name', 'description', 'participants']
|
||||||
|
|
||||||
|
|
||||||
|
class VolunteerFilterForm(forms.Form):
|
||||||
|
activity = forms.MultipleChoiceField(
|
||||||
|
required=False,
|
||||||
|
widget=forms.CheckboxSelectMultiple,
|
||||||
|
choices=[],
|
||||||
|
)
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
site = kwargs.pop('site')
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
activities = Activity.objects.filter(site=site)
|
||||||
|
self.fields['activity'].choices = activities.values_list('slug', 'name')
|
||||||
|
|
|
@ -12,7 +12,7 @@ class Activity(models.Model):
|
||||||
name = models.CharField(max_length=256, verbose_name=_('Name'))
|
name = models.CharField(max_length=256, verbose_name=_('Name'))
|
||||||
slug = AutoSlugField(populate_from='name')
|
slug = AutoSlugField(populate_from='name')
|
||||||
description = models.TextField(blank=True, verbose_name=_('Description'))
|
description = models.TextField(blank=True, verbose_name=_('Description'))
|
||||||
participants = models.ManyToManyField(User, blank=True, verbose_name=_('Participants'))
|
participants = models.ManyToManyField(User, blank=True, related_name='activities', verbose_name=_('Participants'))
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
unique_together = ('site', 'name')
|
unique_together = ('site', 'name')
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
{% extends 'base.html' %}
|
||||||
|
|
||||||
|
{% load bootstrap3 i18n %}
|
||||||
|
|
||||||
|
{% block listingtab %} active{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<h1>{% trans "Volunteers" %}</h1>
|
||||||
|
|
||||||
|
<a class="btn btn-primary" role="button" data-toggle="collapse" href="#filter" aria-expanded="{{ show_filters|yesno:"true,false" }}" aria-controles="filter">{% trans "Show filtering options…" %}</a>
|
||||||
|
|
||||||
|
<br /><br />
|
||||||
|
|
||||||
|
<div class="collapse{{ show_filters|yesno:" in," }}" id="filter">
|
||||||
|
<div class="well">
|
||||||
|
<form class="form-horizontal" method="get">
|
||||||
|
{% bootstrap_form filter_form %}
|
||||||
|
<input type="submit" class="btn btn-success" value="{% trans "Filter" %}">
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<table class="table table-bordered table-hover">
|
||||||
|
<caption>{% trans "Total:" %} {{ volunteer_list|length }} {% trans "volunteer" %}{{ volunteer_list|length|pluralize }}
|
||||||
|
</caption>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="text-center">{% trans "Username" %}</th>
|
||||||
|
<th class="text-center">{% trans "Fullname" %}</th>
|
||||||
|
<th class="text-center">{% trans "Activities" %}</th>
|
||||||
|
<th class="text-center"></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
{% for volunteer in volunteer_list %}
|
||||||
|
{% if forloop.first %}
|
||||||
|
<tbody>
|
||||||
|
{% endif %}
|
||||||
|
<tr class="clickable-row" data-href="{% url 'show-speaker' username=volunteer.user.username %}">
|
||||||
|
<td>{{ volunteer.user.username }}</td>
|
||||||
|
<td>{{ volunteer.user.get_full_name }}</td>
|
||||||
|
<td>
|
||||||
|
{% for activity in volunteer.user.activities.all %}
|
||||||
|
<span class="badge">{{ activity }}</span>
|
||||||
|
{% endfor %}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a class="btn btn-{% if volunteer.conversation.messages.last.author == volunteer.user %}primary{% else %}default{% endif %}" href="{% url 'conversation' volunteer.user.username %}">{% trans "Contact" %}</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</li>
|
||||||
|
{% if forloop.last %}
|
||||||
|
</tbody>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block js_end %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
jQuery(document).ready(function($) {
|
||||||
|
$(".clickable-row").click(function() {
|
||||||
|
window.location = $(this).data("href");
|
||||||
|
});
|
||||||
|
|
||||||
|
var anchor = window.location.hash.replace("#", "");
|
||||||
|
if (anchor == "filter") {
|
||||||
|
$("#filter").collapse('show');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{% endblock %}
|
|
@ -5,6 +5,7 @@ from . import views
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r'^enrole/$', views.participate, name='participate-as-volunteer'),
|
url(r'^enrole/$', views.participate, name='participate-as-volunteer'),
|
||||||
|
url(r'^list/$', views.volunteer_list, name='list-volunteers'),
|
||||||
url(r'^activities/$', views.ActivityList.as_view(), name='list-activities'),
|
url(r'^activities/$', views.ActivityList.as_view(), name='list-activities'),
|
||||||
url(r'^activities/add/$', views.ActivityCreate.as_view(), name='add-activity'),
|
url(r'^activities/add/$', views.ActivityCreate.as_view(), name='add-activity'),
|
||||||
url(r'^activities/(?P<slug>[-\w]+)/edit/$', views.ActivityUpdate.as_view(), name='edit-activity'),
|
url(r'^activities/(?P<slug>[-\w]+)/edit/$', views.ActivityUpdate.as_view(), name='edit-activity'),
|
||||||
|
|
|
@ -5,10 +5,12 @@ from django.contrib.auth.decorators import login_required
|
||||||
|
|
||||||
from ponyconf.mixins import OnSiteFormMixin
|
from ponyconf.mixins import OnSiteFormMixin
|
||||||
|
|
||||||
|
from accounts.decorators import orga_required, staff_required
|
||||||
from accounts.mixins import OrgaRequiredMixin, StaffRequiredMixin
|
from accounts.mixins import OrgaRequiredMixin, StaffRequiredMixin
|
||||||
|
from accounts.models import Participation
|
||||||
|
|
||||||
from .models import Activity
|
from .models import Activity
|
||||||
from .forms import ActivityForm
|
from .forms import ActivityForm, VolunteerFilterForm
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -52,3 +54,22 @@ class ActivityUpdate(OrgaRequiredMixin, ActivityMixin, ActivityFormMixin, Update
|
||||||
|
|
||||||
class ActivityDetail(StaffRequiredMixin, ActivityMixin, DetailView):
|
class ActivityDetail(StaffRequiredMixin, ActivityMixin, DetailView):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@staff_required
|
||||||
|
def volunteer_list(request):
|
||||||
|
show_filters = False
|
||||||
|
site = get_current_site(request)
|
||||||
|
filter_form = VolunteerFilterForm(request.GET or None, site=site)
|
||||||
|
# Filtering
|
||||||
|
volunteers = Participation.objects.filter(site=site,user__activities__isnull=False).order_by('pk').distinct()
|
||||||
|
if filter_form.is_valid():
|
||||||
|
data = filter_form.cleaned_data
|
||||||
|
if len(data['activity']):
|
||||||
|
show_filters = True
|
||||||
|
volunteers = volunteers.filter(user__activities__slug__in=data['activity'])
|
||||||
|
return render(request, 'volunteers/volunteer_list.html', {
|
||||||
|
'volunteer_list': volunteers,
|
||||||
|
'filter_form': filter_form,
|
||||||
|
'show_filters': show_filters,
|
||||||
|
})
|
||||||
|
|
Loading…
Reference in New Issue