Skip to content

Commit

Permalink
Merge a56b1c7 into 0c5ab5e
Browse files Browse the repository at this point in the history
  • Loading branch information
FedeG committed Jul 2, 2018
2 parents 0c5ab5e + a56b1c7 commit 3f3f688
Show file tree
Hide file tree
Showing 12 changed files with 129 additions and 96 deletions.
31 changes: 24 additions & 7 deletions eventol/eventol/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

from manager.models import (Activity, Attendee, Collaborator, Event, EventUser,
Hardware, Installation, Installer, Organizer, Room,
Software)
Software, EventTag)


# Serializers define the API representation.
Expand All @@ -28,13 +28,20 @@ class EventSerializer(EventolSerializer):

class Meta:
model = Event
fields = ('url', 'name', 'abstract', 'limit_proposal_date',
fields = ('url', 'name', 'abstract', 'limit_proposal_date', 'tags',
'external_url', 'report', 'event_information', 'updated_at',
'schedule_confirmed', 'place', 'image', 'cropping', 'event_slug',
'activity_proposal_is_open', 'registration_is_open', 'id',
'attendees_count', 'last_date', 'created_at', 'location')


class EventTagSerializer(EventolSerializer):
class Meta:
model = EventTag
fields = ('url', 'created_at', 'updated_at', 'background',
'logo_header', 'logo_landing', 'message', 'slug')


class EventUserSerializer(EventolSerializer):
class Meta:
model = EventUser
Expand Down Expand Up @@ -106,8 +113,9 @@ class EventFilter(FilterSet):

class Meta:
model = Event
fields = ('name', 'event_slug', 'schedule_confirmed',
'activity_proposal_is_open', 'registration_is_open')
fields = ('name', 'event_slug', 'schedule_confirmed', 'tags__slug',
'tags__name', 'activity_proposal_is_open',
'registration_is_open')


# ViewSets define the view behavior.
Expand All @@ -117,18 +125,27 @@ class EventViewSet(viewsets.ModelViewSet):
filter_class = EventFilter
ordering_fields = ('name', 'limit_proposal_date', 'updated_at',
'attendees_count', 'last_date', 'created_at')
search_fields = ('name', 'event_slug', 'abstract')
search_fields = ('name', 'event_slug', 'abstract',
'tags__slug', 'tags__name',)

def list(self, request, *args, **kwargs):
my_events = request.GET.get('my_events', None)
event_slug = request.GET.get('event_slug', None)
tag_slug = request.GET.get('tags__slug', None)
if my_events:
queryset = Event.objects.get_event_by_user(request.user, event_slug)
queryset = Event.objects.get_event_by_user(request.user, tag_slug)
serializer = EventSerializer(queryset, many=True, context={'request': request})
return Response({'results': serializer.data})
return super().list(request, *args, **kwargs)


class EventTagSet(viewsets.ModelViewSet):
queryset = EventTag.objects.all()
serializer_class = EventTagSerializer
filter_fields = ('slug', 'name',)
ordering_fields = ('created_at', 'updated_at', 'name', 'slug',)
search_fields = ('slug', 'name',)


class EventUserModelViewSet(viewsets.ModelViewSet):
filter_fields = ('event_user__event__event_slug',)
ordering_fields = ('created_at', 'updated_at')
Expand Down
7 changes: 4 additions & 3 deletions eventol/eventol/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,13 @@
from .api import (EventViewSet, EventUserViewSet, InstallerViewSet,
CollaboratorViewSet, OrganizerViewSet, ActivityViewSet,
AttendeeViewSet, InstallationViewSet, RoomViewSet,
SoftwareViewSet, HardwareViewSet)
SoftwareViewSet, HardwareViewSet, EventTagSet)


# Routers provide a way of automatically determining the URL conf.
router = routers.DefaultRouter()
router.register(r'events', EventViewSet)
router.register(r'tags', EventTagSet)
router.register(r'eventUsers', EventUserViewSet)
router.register(r'installers', InstallerViewSet)
router.register(r'collaborators', CollaboratorViewSet)
Expand All @@ -34,8 +35,8 @@
url(r'^api/', include(router.urls)),
url(r'^report$', views.generic_report, name='generic_report'),
url(r'^create-event/$', views.create_event, name="create_event"),
url(r'^event/', include('manager.urls.events'), name='events'),
url(r'^tag/', include('manager.urls.event_tags'), name='event_tags'),
url(r'^events/', include('manager.urls.events'), name='events'),
url(r'^tags/', include('manager.urls.event_tags'), name='event_tags'),
url(r'^admin/', include(admin.site.urls), name='admin'),
url(r'^ckeditor/', include('ckeditor_uploader.urls'), name='ckeditor'),
url(r'^accounts/profile/',
Expand Down
2 changes: 1 addition & 1 deletion eventol/front/src/components/TitleList/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ export default class TitleList extends React.Component {
}
return {
event_slug, title, attendees, overview, backdrop, place,
key: event_slug, url: `/event/${event_slug}/`
key: event_slug, url: `/events/${event_slug}/`
}
}

Expand Down
18 changes: 11 additions & 7 deletions eventol/front/src/containers/EventHome/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,39 +18,43 @@ export default class EventHome extends React.Component {
}

static propTypes = {
slug: PropTypes.string,
tagSlug: PropTypes.string,
user: PropTypes.object
}

onEnter = () => {
const {slug} = this.props;
const {tagSlug} = this.props;
const {searchTerm} = this.state;
if (searchTerm !== '') {
const searchUrl = `?search=${searchTerm}&slug=${slug}&fields=${HOME_REQUIRED_FIELDS}`;
const searchUrl = `?search=${searchTerm}&tags__slug=${tagSlug}&fields=${HOME_REQUIRED_FIELDS}`;
this.setState({searchUrl, searched: true});
}
}

onChange = searchTerm => this.setState({searchTerm})

render(){
const {user, slug} = this.props;
const {user, tagSlug} = this.props;
const {searched, searchUrl} = this.state;
return (
<div>
<Header user={user}/>
<Hero slug={slug}>
<Hero slug={tagSlug}>
<Search onChange={this.onChange} onEnter={this.onEnter} />
</Hero>
{searched && <TitleList title={gettext('Search results')} url={searchUrl} showEmpty={true} />}
<TitleList
id='my_events'
title={gettext('My Events')}
url={`?my_events=true&tags__slug=${tagSlug}&fields=${HOME_REQUIRED_FIELDS}`} />
<TitleList
id='next'
title={gettext('Upcoming Events')}
url={`?registration_is_open=true&ordering=last_date&slug=${slug}&fields=${HOME_REQUIRED_FIELDS}`} />
url={`?registration_is_open=true&ordering=last_date&tags__slug=${tagSlug}&fields=${HOME_REQUIRED_FIELDS}`} />
<TitleList
id='finished'
title={gettext('Finished Events')}
url={`?registration_is_open=false&ordering=-attendees_count&slug=${slug}&fields=${HOME_REQUIRED_FIELDS}`} />
url={`?registration_is_open=false&ordering=-attendees_count&tags__slug=${tagSlug}&fields=${HOME_REQUIRED_FIELDS}`} />
</div>
);
}
Expand Down
2 changes: 1 addition & 1 deletion eventol/front/src/views/EventHome.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ window.render_components = properties => {
window.params = {...properties};
render(
(<Provider store={store}>
<EventHome user={properties.user} slug={properties.slug}/>
<EventHome user={properties.user} tagSlug={properties.tag_slug}/>
</Provider>), document.getElementById('root'));
};

Expand Down
1 change: 1 addition & 0 deletions eventol/manager/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ class EventTagInline(admin.TabularInline):

class EventAdmin(EventoLAdmin):
inlines = [EventDateAdminInline, EventTagInline]
exclude = ['tags']

def filter_event(self, events, queryset):
return queryset.filter(pk__in=[event.pk for event in events])
Expand Down
6 changes: 3 additions & 3 deletions eventol/manager/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,13 +56,13 @@ def get_queryset(self):
))

@staticmethod
def get_event_by_user(user, event_slug=None):
def get_event_by_user(user, tag_slug=None):
if user.is_authenticated():
event_users = EventUser.objects.filter(user=user)
event_ids = [event_user.event.pk for event_user in list(event_users)]
queryset = Event.objects.filter(pk__in=event_ids)
if event_slug:
queryset = queryset.filter(event_slug=event_slug)
if tag_slug:
queryset = queryset.filter(tags__slug=tag_slug)
else:
queryset = Event.objects.none()
return queryset
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
<script src="{% static "manager/bower_components/leaflet/dist/leaflet.js" %}"></script>
<script>
window.render_components({
slug: '{{ slug }}',
tag_slug: '{{ tag_slug }}',
{% if user.is_authenticated %}
user: {
username: '{{ user.username | safe }}',
Expand Down
78 changes: 78 additions & 0 deletions eventol/manager/urls/event.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
from django.conf.urls import url
from django.views.generic.base import TemplateView

from manager import views

event_patterns = [
url(r'^$', views.index, name="index"),
url(r'^attendee/confirm/(?P<attendee_id>\d+)/(?P<token>\w+)$',
views.attendee_confirm_email, name='attendee_confirm_email'),
url(r'^FAQ$', views.event_view, name="FAQ", kwargs={'html': 'FAQ.html'}),
url(r'^edit$', views.edit_event, name='edit_event'),
url(r'^image-cropping/$', views.event_add_image, name='event_add_image'),
url(r'^draw', views.draw, name='draw'),
url(r'^rooms/list/$', views.rooms_list, name='rooms_list'),
url(r'^rooms/add/$', views.add_or_edit_room, name='add_room'),
url(r'^rooms/edit/(?P<room_id>\d+)/$', views.add_or_edit_room, name='edit_room'),
url(r'^rooms/delete/(?P<room_id>\d+)/$', views.delete_room, name='delete_room'),
url(r'^registration$', views.attendee_registration,
name='attendee_registration'),
url(r'^registration/attendee/email-sent$',
TemplateView.as_view(
template_name='registration/attendee/email-sent.html'),
name='attendee_email_sent'),
url(r'^registration/attendee/search/(?P<ticket_code>\w+)$',
views.attendance_by_ticket, name='attendance_by_ticket'),
url(r'^registration/attendee/search', views.manage_attendance,
name='manage_attendance'),
url(r'^registration/attendee/by-collaborator$',
views.registration_by_collaborator,
name='attendee_registration_by_collaborator'),
url(r'^registration/attendee/from-installation$',
views.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,
name='attendee_registration_by_self'),
url(r'^registration/attendee/by-self/autoreadqr', views.attendance_by_autoreadqr,
name='attendance_by_autoreadqr'),
url(r'^registration/print-code$',
views.attendee_registration_print_code,
name='attendee_registration_print_code'),
url(r'^registration/collaborator$', views.collaborator_registration,
name='collaborator_registration'),
url(r'^registration/installer$', views.installer_registration,
name='installer_registration'),
url(r'^installation$', views.installation, name='installation'),
url(r'^activities$', views.activities, name='activities'),
url(r'^activity/(?P<activity_id>\d+)/$', views.activity_detail,
name='activity_detail'),
url(r'^activity/proposal/$', views.activity_proposal,
name='activity_proposal'),
url(r'^activity/proposal/image-cropping/(?P<activity_id>\d+)/$',
views.image_cropping, name='image_cropping'),
url(r'^activity/proposal/image-cropping/$', views.image_cropping,
name='image_cropping'),
url(r'^activity/registration/(?P<proposal_id>\d+)$',
views.talk_registration, name='talk_registration'),
url(r'^activity/confirm_schedule/$',
views.confirm_schedule, name='confirm_schedule'),
url(r'^activity/reject_activity/(?P<activity_id>\d+)/$',
views.reject_activity, name='reject_activity'),
url(r'^activity/resend_proposal/(?P<activity_id>\d+)/$',
views.resend_proposal, name='resend_proposal'),
url(r'^activity/(?P<activity_id>\d+)/vote/up$',
views.activity_vote_up, name='activity_vote_up'),
url(r'^activity/(?P<activity_id>\d+)/vote/down$',
views.activity_vote_down, name='activity_vote_down'),
url(r'^activity/(?P<activity_id>\d+)/vote/cancel$',
views.activity_vote_cancel, name='activity_vote_cancel'),
url(r'^schedule$', views.schedule, name='schedule'),
url(r'^contact$', views.contact, name='contact'),
url(r'^reports$', views.reports, name='reports'),
url(r'^organizers$', views.add_organizer, name='add_organizer'),
url(r'^registration_people', views.add_registration_people,
name='add_registration_people'),
url(r'^ticket$', views.view_ticket, name='view_ticket'),
]
2 changes: 1 addition & 1 deletion eventol/manager/urls/event_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
from manager import views

urlpatterns = [
url(r'^(?P<slug>[\w-]+)$', views.event_tag_index, name='slug_index'),
url(r'^(?P<tag>[\w-]+)$', views.event_tag_index, name='tag_index'),
]
70 changes: 1 addition & 69 deletions eventol/manager/urls/events.py
Original file line number Diff line number Diff line change
@@ -1,77 +1,9 @@
from django.conf.urls import url, include
from django.views.generic.base import TemplateView
from django.views.generic import RedirectView

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

event_patterns = [
url(r'^$', views.index, name="index"),
url(r'^attendee/confirm/(?P<attendee_id>\d+)/(?P<token>\w+)$',
views.attendee_confirm_email, name='attendee_confirm_email'),
url(r'^FAQ$', views.event_view, name="FAQ", kwargs={'html': 'FAQ.html'}),
url(r'^edit$', views.edit_event, name='edit_event'),
url(r'^image-cropping/$', views.event_add_image, name='event_add_image'),
url(r'^draw', views.draw, name='draw'),
url(r'^rooms/list/$', views.rooms_list, name='rooms_list'),
url(r'^rooms/add/$', views.add_or_edit_room, name='add_room'),
url(r'^rooms/edit/(?P<room_id>\d+)/$', views.add_or_edit_room, name='edit_room'),
url(r'^rooms/delete/(?P<room_id>\d+)/$', views.delete_room, name='delete_room'),
url(r'^registration$', views.attendee_registration,
name='attendee_registration'),
url(r'^registration/attendee/email-sent$',
TemplateView.as_view(
template_name='registration/attendee/email-sent.html'),
name='attendee_email_sent'),
url(r'^registration/attendee/search/(?P<ticket_code>\w+)$',
views.attendance_by_ticket, name='attendance_by_ticket'),
url(r'^registration/attendee/search', views.manage_attendance,
name='manage_attendance'),
url(r'^registration/attendee/by-collaborator$',
views.registration_by_collaborator,
name='attendee_registration_by_collaborator'),
url(r'^registration/attendee/from-installation$',
views.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,
name='attendee_registration_by_self'),
url(r'^registration/attendee/by-self/autoreadqr', views.attendance_by_autoreadqr,
name='attendance_by_autoreadqr'),
url(r'^registration/print-code$',
views.attendee_registration_print_code,
name='attendee_registration_print_code'),
url(r'^registration/collaborator$', views.collaborator_registration,
name='collaborator_registration'),
url(r'^registration/installer$', views.installer_registration,
name='installer_registration'),
url(r'^installation$', views.installation, name='installation'),
url(r'^activities$', views.activities, name='activities'),
url(r'^activity/(?P<activity_id>\d+)/$', views.activity_detail,
name='activity_detail'),
url(r'^activity/proposal/$', views.activity_proposal,
name='activity_proposal'),
url(r'^activity/proposal/image-cropping/(?P<activity_id>\d+)/$',
views.image_cropping, name='image_cropping'),
url(r'^activity/proposal/image-cropping/$', views.image_cropping,
name='image_cropping'),
url(r'^activity/registration/(?P<proposal_id>\d+)$', views.talk_registration, name='talk_registration'),
url(r'^activity/confirm_schedule/$', views.confirm_schedule, name='confirm_schedule'),
url(r'^activity/reject_activity/(?P<activity_id>\d+)/$', views.reject_activity, name='reject_activity'),
url(r'^activity/resend_proposal/(?P<activity_id>\d+)/$', views.resend_proposal, name='resend_proposal'),
url(r'^activity/(?P<activity_id>\d+)/vote/up$', views.activity_vote_up, name='activity_vote_up'),
url(r'^activity/(?P<activity_id>\d+)/vote/down$', views.activity_vote_down, name='activity_vote_down'),
url(r'^activity/(?P<activity_id>\d+)/vote/cancel$', views.activity_vote_cancel, name='activity_vote_cancel'),
url(r'^schedule$', views.schedule, name='schedule'),
url(r'^contact$', views.contact, name='contact'),
url(r'^reports$', views.reports, name='reports'),
url(r'^organizers$', views.add_organizer, name='add_organizer'),
url(r'^registration_people', views.add_registration_people,
name='add_registration_people'),
url(r'^ticket$', views.view_ticket, name='view_ticket'),
]
from .event import event_patterns

urlpatterns = [
url(r'^(?P<event_slug>[\w-]+)/', include(event_patterns), name='event'),
Expand Down
6 changes: 3 additions & 3 deletions eventol/manager/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,9 +177,9 @@ def index(request, event_slug):
)


def event_tag_index(request, slug):
event_tag = get_object_or_404(EventTag, slug=slug)
return render(request, 'event/slug_index.html', {'slug': event_tag.slug})
def event_tag_index(request, tag):
event_tag = get_object_or_404(EventTag, slug=tag)
return render(request, 'event/tag_index.html', {'tag_slug': event_tag.slug})


def event_view(request, event_slug, html='index.html'):
Expand Down

0 comments on commit 3f3f688

Please sign in to comment.