Skip to content

Commit

Permalink
Merge branch 'issue-284' of github.com:eventoL/eventoL into issue-284
Browse files Browse the repository at this point in the history
  • Loading branch information
HacKanCuBa committed Apr 3, 2018
2 parents 8a40c59 + 835206f commit 13bc401
Show file tree
Hide file tree
Showing 7 changed files with 160 additions and 21 deletions.
38 changes: 37 additions & 1 deletion eventol/manager/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,32 @@ def get_queryset(self):
return attendees[:5]


class AllAttendeeAutocomplete(GenericAutocomplete):
def get_queryset(self):
if not self.request.user.is_authenticated():
return Attendee.objects.none()
event_uid = self.forwarded.get('event_uid', None)
event_user = EventUser.objects.filter(
user=self.request.user, event__uid=event_uid).first()
attendees = Attendee.objects.filter(event__uid=event_uid)
if event_user and self.q:
if not hasattr(self, 'use_unaccent') or self.use_unaccent:
attendees = attendees.filter(
Q(first_name__unaccent__icontains=self.q) |
Q(last_name__unaccent__icontains=self.q) |
Q(nickname__unaccent__icontains=self.q) |
Q(email__icontains=self.q)
)
else:
attendees = attendees.filter(
Q(first_name__icontains=self.q) |
Q(last_name__icontains=self.q) |
Q(nickname__icontains=self.q) |
Q(email__icontains=self.q)
)
return attendees[:5]


class EventUserAutocomplete(GenericAutocomplete):
def get_queryset(self):
if not self.request.user.is_authenticated():
Expand Down Expand Up @@ -176,12 +202,22 @@ class Meta(object):


class InstallationForm(forms.ModelForm):
def __init__(self, event_uid, *args, **kwargs):
kwargs.update(initial={
'event_uid': event_uid,
})

super().__init__(*args, **kwargs)
self.fields['event_uid'].widget = forms.HiddenInput()

event_uid = forms.UUIDField()

class Meta(object):
model = Installation
fields = ('attendee', 'notes', 'software')
widgets = {'notes': forms.Textarea(attrs={'rows': 3}),
'attendee': autocomplete.ModelSelect2(
url='attendee-autocomplete'),
url='all-attendee-autocomplete', forward=['event_uid']),
'software': autocomplete.ModelSelect2(
url='software-autocomplete')}

Expand Down
10 changes: 7 additions & 3 deletions eventol/manager/security.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from manager.models import Installer, Organizer, Collaborator, Attendee


def is_installer(user, event_slug=None, event_uid=None):
def is_installer(user, event_slug=None, event_uid=None, *args, **kwargs):
return event_uid and (
Installer.objects.filter(
event_user__user=user,
Expand Down Expand Up @@ -114,20 +114,24 @@ def add_organizer_permissions(user):
user.save()


def is_organizer(user, event_slug=None, event_uid=None):
def is_organizer(user, event_slug=None, event_uid=None, *args, **kwargs):
return event_uid and Organizer.objects.filter(
event_user__user=user,
event_user__event__uid=event_uid).exists()


def is_collaborator(user, event_slug=None, event_uid=None, ticket_code=None):
def is_collaborator(user, event_slug=None, event_uid=None, *args, **kwargs):
return event_uid and (
Collaborator.objects.filter(
event_user__user=user,
event_user__event__uid=event_uid).exists() or
is_organizer(user, event_uid=event_uid))


def is_collaborator_or_installer(user, *args, **kwargs):
return is_collaborator(user, *args, **kwargs) or is_installer(user, *args, **kwargs)


def user_passes_test(test_func, name_redirect):
"""
Decorator for views that checks that the user passes the given test,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,17 +36,22 @@
{% endfor %}

{% block extra-fields %}{% endblock %}

{% block buttons %}
<div class="form-group">
<button type="submit"
class="btn btn-primary btn-raised pull-right">
{% block submit-button %}{% trans "Submit" %}{% endblock %}</button>
</div>
{% endblock %}
</form>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-10 col-sm-offset-1 col-xs-12">
{% block buttons %}
<div class="form-group">
<button type="submit"
class="btn btn-primary btn-raised pull-right">
{% block submit-button %}{% trans "Submit" %}{% endblock %}</button>
{% block more-button %}{% endblock %}
</div>
{% endblock %}
</div>
</div>
</form>
{% block post-form %}{% endblock %}
</div>
{% endblock %}

Expand All @@ -60,4 +65,4 @@
{% for form in forms %}
{{ form.media }}
{% endfor %}
{% endblock %}
{% endblock %}
6 changes: 6 additions & 0 deletions eventol/manager/templates/installation/installation-form.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,10 @@

{% block form-name %}{% trans "Submit an Installation" %}{% endblock %}

{% block more-button %}
<a href="{% url "attendee_registration_from_installation" event_slug event_uid %}" class="btn btn-primary btn-raised">
{% trans "Register a Attendee" %}
</a>
{% endblock %}

{% block form-action %}"{% url "installation" event_slug event_uid %}"{% endblock %}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{% extends "generic-bootstrap-model-form.html" %}
{% load staticfiles %}
{% load i18n %}

{% block page-header %}{% trans "Attendee Registration" %}{% endblock %}

{% block form-id %}"registration"{% endblock %}

{% block form-name %}{% trans "Attendee Registration" %}{% endblock %}

{% block more-button %}
<a href="{% url "installation" event_slug event_uid %}" class="btn btn-primary btn-raised">
{% trans "Back to installation" %}
</a>
{% endblock %}

{% block form-action %}"{% url "attendee_registration_from_installation" event_slug event_uid %}"{% endblock %}
7 changes: 6 additions & 1 deletion eventol/manager/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

from manager import views
from manager.forms import (SoftwareAutocomplete, AttendeeAutocomplete,
EventUserAutocomplete)
EventUserAutocomplete, AllAttendeeAutocomplete)

event_patterns = [
url(r'^$', views.index, name="index"),
Expand All @@ -27,6 +27,9 @@
url(r'^registration/attendee/by-collaborator$',
views.attendee_registration_by_collaborator,
name='attendee_registration_by_collaborator'),
url(r'^registration/attendee/from-installation$',
views.attendee_registration_from_installation,
name='attendee_registration_from_installation'),
url(r'^registration/attendee/by-self/(?P<event_registration_code>[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-'
r'[89aAbB][a-f0-9]{3}-[a-f0-9]{12})$',
views.attendee_registration_by_self,
Expand Down Expand Up @@ -70,6 +73,8 @@
name='software-autocomplete'),
url(r'^attendee-autocomplete', AttendeeAutocomplete.as_view(),
name='attendee-autocomplete'),
url(r'^all-attendee-autocomplete', AllAttendeeAutocomplete.as_view(),
name='all-attendee-autocomplete'),
url(r'^eventuser-autocomplete', EventUserAutocomplete.as_view(),
name='eventuser-autocomplete'),
url(r'^$', RedirectView.as_view(pattern_name='home')),
Expand Down
74 changes: 70 additions & 4 deletions eventol/manager/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
AttendeeAttendanceDate, EventUserAttendanceDate
from manager.security import is_installer, is_organizer, user_passes_test, \
add_attendance_permission, is_collaborator, \
add_organizer_permissions
add_organizer_permissions, is_collaborator_or_installer

from .utils import email

Expand Down Expand Up @@ -221,7 +221,7 @@ def home(request):
@user_passes_test(is_installer, 'installer_registration')
def installation(request, event_slug, event_uid):
installation_form = InstallationForm(
request.POST or None, prefix='installation')
event_uid, request.POST or None, prefix='installation')
hardware_form = HardwareForm(request.POST or None, prefix='hardware')
forms = [installation_form, hardware_form]
errors = []
Expand Down Expand Up @@ -519,9 +519,75 @@ def add_registration_people(request, event_slug, event_uid):
)


@login_required
@user_passes_test(is_collaborator_or_installer, 'collaborator_registration')
def attendee_registration_from_installation(request, event_slug, event_uid):
installation_url = reverse(
'installation',
args=[event_slug, event_uid]
)
event = Event.objects.filter(uid=event_uid).first()
if not event:
return handler404(request)
form = AttendeeRegistrationByCollaboratorForm(
request.POST or None,
initial={'event': event}
)
if request.POST:
if form.is_valid():
email = form.cleaned_data["email"]
if Attendee.objects.filter(event=event, email__iexact=email).count() > 0:
messages.error(
request,
_(
'The attendee is already registered for this event, '
'use correct form'
)
)
return redirect(installation_url)
try:
attendee = form.save()
attendance_date = AttendeeAttendanceDate()
attendance_date.attendee = attendee
attendance_date.save()
messages.success(
request,
_(
'The attendee was successfully registered. '
'Happy Hacking!'
)
)
return redirect(installation_url)
except Exception as e:
logger.error(e)
try:
if attendee is not None:
Attendee.objects.delete(attendee)
if attendance_date is not None:
AttendeeAttendanceDate.objects.delete(attendance_date)
except Exception:
pass
messages.error(
request,
_(
"The attendee couldn't be registered (check form errors)"
)
)
return render(
request,
'registration/attendee/from-installation.html',
update_event_info(
event_slug,
event_uid,
request,
{'form': form}
)
)


@login_required
@permission_required('manager.can_take_attendance', raise_exception=True)
@user_passes_test(is_collaborator, 'collaborator_registration')
@user_passes_test(is_collaborator_or_installer, 'collaborator_registration')
def attendee_registration_by_collaborator(request, event_slug, event_uid):
manage_attendance_url = reverse(
'manage_attendance',
Expand Down Expand Up @@ -588,7 +654,7 @@ def attendee_registration_by_collaborator(request, event_slug, event_uid):

@login_required
@permission_required('manager.can_take_attendance', raise_exception=True)
@user_passes_test(is_collaborator, 'collaborator_registration')
@user_passes_test(is_collaborator_or_installer, 'collaborator_registration')
def attendee_registration_print_code(request, event_slug, event_uid):
event = get_object_or_404(Event, uid=event_uid)
event_registration_code = event.registration_code
Expand Down

0 comments on commit 13bc401

Please sign in to comment.