Eventplanner: Grid / Translation
This commit is contained in:
90
eventplanner/locale/de/LC_MESSAGES/django.po
Normal file
90
eventplanner/locale/de/LC_MESSAGES/django.po
Normal file
@@ -0,0 +1,90 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2013-06-30 10:55+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: models.py:11
|
||||
msgid "Rehearsal"
|
||||
msgstr "Probe"
|
||||
|
||||
#: models.py:12
|
||||
msgid "Concert"
|
||||
msgstr "Konzert"
|
||||
|
||||
#: models.py:13
|
||||
msgid "General Rehearsal"
|
||||
msgstr "Generalprobe"
|
||||
|
||||
#: models.py:16
|
||||
msgid "title"
|
||||
msgstr "Titel"
|
||||
|
||||
#: models.py:17
|
||||
msgid "type"
|
||||
msgstr "Typ"
|
||||
|
||||
#: models.py:18
|
||||
msgid "date"
|
||||
msgstr "Datum"
|
||||
|
||||
#: models.py:19
|
||||
msgid "time"
|
||||
msgstr "Uhrzeit"
|
||||
|
||||
#: models.py:20
|
||||
msgid "participants"
|
||||
msgstr "Teilnehmer"
|
||||
|
||||
#: models.py:22
|
||||
msgid "description"
|
||||
msgstr "Beschreibung"
|
||||
|
||||
#: models.py:23
|
||||
msgid "location"
|
||||
msgstr "Ort"
|
||||
|
||||
#: models.py:44
|
||||
msgid "?"
|
||||
msgstr ""
|
||||
|
||||
#: models.py:45
|
||||
msgid "Yes"
|
||||
msgstr "Ja"
|
||||
|
||||
#: models.py:46
|
||||
msgid "No"
|
||||
msgstr "Nein"
|
||||
|
||||
#: models.py:49
|
||||
msgid "event"
|
||||
msgstr "Termin"
|
||||
|
||||
#: models.py:50
|
||||
msgid "musician"
|
||||
msgstr "Musiker"
|
||||
|
||||
#: models.py:51
|
||||
msgid "status"
|
||||
msgstr "Status"
|
||||
|
||||
#: models.py:52
|
||||
msgid "comment"
|
||||
msgstr "Kommentar"
|
||||
|
||||
#~ msgid "Delete?"
|
||||
#~ msgstr "Löschen"
|
||||
@@ -13,14 +13,14 @@ class Event ( models.Model ):
|
||||
( 'GenReh', _('General Rehearsal') ),
|
||||
)
|
||||
|
||||
title = models.CharField( max_length=40 )
|
||||
type = models.CharField( max_length=6, choices=EVENT_TYPES, default='Reh' )
|
||||
date = models.DateField()
|
||||
time = models.TimeField( null=True, blank=True )
|
||||
participants = models.ManyToManyField( Musician, through='EventParticipation' )
|
||||
title = models.CharField( max_length=40, verbose_name = _("title") )
|
||||
type = models.CharField( max_length=6, choices=EVENT_TYPES, default='Reh', verbose_name= _("type") )
|
||||
date = models.DateField( verbose_name= _("date") )
|
||||
time = models.TimeField( null=True, blank=True, verbose_name = _("time") )
|
||||
participants = models.ManyToManyField( Musician, through='EventParticipation', verbose_name=_("participants") )
|
||||
|
||||
desc = models.TextField( blank=True)
|
||||
location = LocationField()
|
||||
desc = models.TextField( blank=True, verbose_name=_("description"))
|
||||
location = LocationField( verbose_name=_("location") )
|
||||
|
||||
|
||||
def __unicode__(self):
|
||||
@@ -46,10 +46,10 @@ class EventParticipation( models.Model ):
|
||||
('No' , _('No' ))
|
||||
)
|
||||
|
||||
event = models.ForeignKey( Event )
|
||||
musician = models.ForeignKey( Musician )
|
||||
status = models.CharField ( max_length=3, choices = OPTIONS, default='?' )
|
||||
comment = models.CharField ( max_length=64, blank=True )
|
||||
event = models.ForeignKey( Event, verbose_name=_("event") )
|
||||
musician = models.ForeignKey( Musician, verbose_name=_("musician") )
|
||||
status = models.CharField ( max_length=3, choices = OPTIONS, default='?', verbose_name=_("status") )
|
||||
comment = models.CharField ( max_length=64, blank=True, verbose_name=_("comment") )
|
||||
|
||||
def get_musician_username(self):
|
||||
return self.musician.user.username
|
||||
|
||||
@@ -1,78 +0,0 @@
|
||||
{% load i18n admin_static admin_modify %}
|
||||
<div class="inline-group" id="{{ inline_admin_formset.formset.prefix }}-group">
|
||||
<div class="tabular inline-related {% if forloop.last %}last-related{% endif %}">
|
||||
{{ inline_admin_formset.formset.management_form }}
|
||||
<fieldset class="module">
|
||||
<h2>{{ inline_admin_formset.opts.verbose_name_plural|capfirst }}</h2>
|
||||
{{ inline_admin_formset.formset.non_form_errors }}
|
||||
<table>
|
||||
<thead><tr>
|
||||
{% for field in inline_admin_formset.fields %}
|
||||
{% if not field.widget.is_hidden %}
|
||||
<th{% if forloop.first %} colspan="2"{% endif %}{% if field.required %} class="required"{% endif %}>{{ field.label|capfirst }}
|
||||
{% if field.help_text %} <img src="{% static "admin/img/icon-unknown.gif" %}" class="help help-tooltip" width="10" height="10" alt="({{ field.help_text|striptags }})" title="{{ field.help_text|striptags }}" />{% endif %}
|
||||
</th>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% if inline_admin_formset.formset.can_delete %}<th>{% trans "Delete?" %}</th>{% endif %}
|
||||
</tr></thead>
|
||||
|
||||
<tbody>
|
||||
{% for inline_admin_form in inline_admin_formset %}
|
||||
{% if inline_admin_form.form.non_field_errors %}
|
||||
<tr><td colspan="{{ inline_admin_form|cell_count }}">{{ inline_admin_form.form.non_field_errors }}</td></tr>
|
||||
{% endif %}
|
||||
<tr class="form-row {% cycle "row1" "row2" %} {% if forloop.last %} empty-form{% endif %}"
|
||||
id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}">
|
||||
<td class="original">
|
||||
{% if inline_admin_form.original or inline_admin_form.show_url %}<p>
|
||||
|
||||
</p>{% endif %}
|
||||
{% if inline_admin_form.has_auto_field %}{{ inline_admin_form.pk_field.field }}{% endif %}
|
||||
{{ inline_admin_form.fk_field.field }}
|
||||
{% spaceless %}
|
||||
{% for fieldset in inline_admin_form %}
|
||||
{% for line in fieldset %}
|
||||
{% for field in line %}
|
||||
{% if field.is_hidden %} {{ field.field }} {% endif %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
{% endspaceless %}
|
||||
</td>
|
||||
{% for fieldset in inline_admin_form %}
|
||||
{% for line in fieldset %}
|
||||
{% for field in line %}
|
||||
<td{% if field.field.name %} class="field-{{ field.field.name }}"{% endif %}>
|
||||
{% if field.is_readonly %}
|
||||
<p>{{ field.contents|linebreaksbr }}</p>
|
||||
{% else %}
|
||||
{{ field.field.errors.as_ul }}
|
||||
{{ field.field }}
|
||||
{% endif %}
|
||||
</td>
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
{% if inline_admin_formset.formset.can_delete %}
|
||||
<td class="delete">{% if inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }}{% endif %}</td>
|
||||
{% endif %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
(function($) {
|
||||
$("#{{ inline_admin_formset.formset.prefix }}-group .tabular.inline-related tbody tr").tabularFormset({
|
||||
prefix: "{{ inline_admin_formset.formset.prefix }}",
|
||||
adminStaticPrefix: '{% static "admin/" %}',
|
||||
addText: "{% blocktrans with inline_admin_formset.opts.verbose_name|title as verbose_name %}Add another {{ verbose_name }}{% endblocktrans %}",
|
||||
deleteText: "{% trans 'Remove' %}"
|
||||
});
|
||||
})(django.jQuery);
|
||||
</script>
|
||||
32
eventplanner/templates/eventplanner/event_update_form.html
Normal file
32
eventplanner/templates/eventplanner/event_update_form.html
Normal file
@@ -0,0 +1,32 @@
|
||||
{% extends "website/base.html" %}
|
||||
|
||||
{% load crispy_forms_tags %}
|
||||
|
||||
|
||||
<!-- No Feature slider -->
|
||||
{% block feature_slider %}
|
||||
{% endblock %}
|
||||
|
||||
|
||||
<!-- Static Navbar at top -->
|
||||
{% block navbar_options %} navbar navbar-inverse navbar-static-top {% endblock %}
|
||||
|
||||
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="span12">
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
{{ form|crispy }}
|
||||
<input type="submit" class="btn btn-primary" value="Abschicken"></input>
|
||||
</form>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
@@ -125,8 +125,8 @@
|
||||
<tr>
|
||||
<td class="center"> <a href="{{ event.pk }}"> {{ event.title }} </a> </td>
|
||||
<td class="center"> {{ event.date }} </td>
|
||||
<td class="center"> {{ event.time }} </td>
|
||||
<!-- <td class="center"> {{ event.location }} </td> -->
|
||||
<td class="center"> {% if event.time %} {{ event.time }} {% endif %} </td>
|
||||
<!-- <td class="center"> {{ event.location }} </td> -->
|
||||
<td class="center"> Ort </td>
|
||||
|
||||
<td class="center">
|
||||
159
eventplanner/templates/eventplanner/events_grid.html
Normal file
159
eventplanner/templates/eventplanner/events_grid.html
Normal file
@@ -0,0 +1,159 @@
|
||||
{% extends "website/base.html" %}
|
||||
|
||||
{% load sekizai_tags staticfiles %}
|
||||
|
||||
|
||||
<!-- No Feature slider -->
|
||||
{% block feature_slider %}
|
||||
{% endblock %}
|
||||
|
||||
|
||||
<!-- Static Navbar at top -->
|
||||
{% block navbar_options %} navbar navbar-inverse navbar-static-top {% endblock %}
|
||||
|
||||
|
||||
|
||||
{% block content %}
|
||||
{% addtoblock "css" %}
|
||||
<style>
|
||||
.eventButton {
|
||||
width: 55px;
|
||||
}
|
||||
.eventButton i {
|
||||
margin-right:2px;
|
||||
}
|
||||
|
||||
</style>
|
||||
{% endaddtoblock %}
|
||||
|
||||
{% addtoblock "js" %}
|
||||
<script>
|
||||
|
||||
$('.eventButton').tooltip()
|
||||
|
||||
$(".eventButton").click( function () {
|
||||
$(this).removeClass("btn-danger")
|
||||
.removeClass("btn-warning")
|
||||
.removeClass("btn-success");
|
||||
|
||||
if ( $(this).data('status') == "Yes" )
|
||||
{
|
||||
$(this).data( "status", "?" )
|
||||
.addClass("btn-warning");
|
||||
$(this).children("span.text").html("?");
|
||||
} else if ( $(this).data('status') == "?" )
|
||||
{
|
||||
$(this).data( "status", "No" )
|
||||
.addClass("btn-danger");
|
||||
$(this).children("span.text").html("Nein");
|
||||
|
||||
} else if ( $(this).data('status') == "No" )
|
||||
{
|
||||
$(this).data( "status", "Yes" )
|
||||
.addClass("btn-success");
|
||||
$(this).children("span.text").html("Ja");
|
||||
}
|
||||
|
||||
$('#saveButton').removeAttr('disabled');
|
||||
});
|
||||
|
||||
$("#saveButton").click( function() {
|
||||
|
||||
arr = [];
|
||||
|
||||
$('.userEventTableData').each( function() {
|
||||
|
||||
dataObject = {
|
||||
"event" : $(this).data("event"),
|
||||
"musician": $(this).data("musician"),
|
||||
"status" : $(this).children("button").data("status")
|
||||
};
|
||||
|
||||
arr.push(dataObject);
|
||||
});
|
||||
|
||||
$.ajax( {
|
||||
type: "PUT",
|
||||
url: "/eventParticipation/",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify(arr)
|
||||
});
|
||||
$('#saveButton').attr('disabled','true');
|
||||
|
||||
});
|
||||
|
||||
</script>
|
||||
{% endaddtoblock %}
|
||||
|
||||
<div class="container">
|
||||
<form>
|
||||
<div class="row">
|
||||
<div class="row-fluid eventTable">
|
||||
<div class="span12">
|
||||
|
||||
<h2>Termine</h2>
|
||||
|
||||
<div class="box-content">
|
||||
<table class="table table-striped">
|
||||
|
||||
<thead>
|
||||
<tr>
|
||||
<th> Termin </th>
|
||||
<th> Datum </th>
|
||||
{% for name in musicianNames %}
|
||||
<th> {{ name|capfirst }} </th>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
{% for event in events %}
|
||||
<tr class="eventRow">
|
||||
<td class="center"> <a href="{{ event.pk }}"> {{ event.title }} </a> </td>
|
||||
<td class="center"> {{ event.date }} </td>
|
||||
|
||||
|
||||
{% for p in event.participation %}
|
||||
<td class="center userEventTableData" data-musician="{{p.musician.user.username}}" data-event="{{event.pk}}">
|
||||
{% if p.status == "Yes" %}
|
||||
<button class="btn btn-mini btn-success eventButton" title="{{p.comment}}" data-status="{{p.status}}">
|
||||
{% if p.comment %} <i class="icon-comment icon-white"></i> {% endif %}
|
||||
<span class="text">Ja</span>
|
||||
</button>
|
||||
{% elif p.status == "No" %}
|
||||
<button class="btn btn-mini btn-danger eventButton" title="{{p.comment}}" data-status="{{p.status}}">
|
||||
{% if p.comment%} <i class="icon-comment icon-white"></i> {% endif %}
|
||||
<span class="text">Nein</span>
|
||||
</button>
|
||||
{% else %}
|
||||
<button class="btn btn-mini btn-warning eventButton" title="{{p.comment}}" data-status="{{p.status}}">
|
||||
{% if p.comment %} <i class="icon-comment icon-white"></i> {% endif %}
|
||||
<span class="text">?</span>
|
||||
</button>
|
||||
{% endif %}
|
||||
</td>
|
||||
{% endfor %}
|
||||
|
||||
|
||||
</tr>
|
||||
{% endfor %}
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</div>
|
||||
</div><!--/span-->
|
||||
|
||||
</div><!--/row-->
|
||||
|
||||
<div class="row">
|
||||
<div class="span12">
|
||||
<button id="saveButton" class="btn btn-primary" disabled="true" >Speichern</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
@@ -13,37 +13,22 @@ import datetime
|
||||
from rest_framework.decorators import api_view
|
||||
from rest_framework.response import Response
|
||||
from rest_framework import status
|
||||
from django.forms.models import ModelForm
|
||||
|
||||
|
||||
from django.views.decorators.csrf import csrf_exempt
|
||||
|
||||
# ---------------------------------------- API ---------------------------------------------------------
|
||||
|
||||
@csrf_exempt
|
||||
@api_view( ['GET'] )
|
||||
def event_participation_list( request ):
|
||||
"""
|
||||
API for participation
|
||||
"""
|
||||
if request.method == 'GET':
|
||||
event_participations = EventParticipation.objects.filter( event__date__gte = datetime.date.today() )
|
||||
serializer = ParticipationSerializer( event_participations, many=True)
|
||||
return Response( serializer.data )
|
||||
|
||||
elif request.method == 'POST':
|
||||
serializer = ParticipationSerializer( data=request.DATA )
|
||||
if serializer.is_valid():
|
||||
print serializer.data
|
||||
serializer.save()
|
||||
return Response( serializer.data, status=status.HTTP_201_CREATED )
|
||||
else:
|
||||
return Response( serializer.errors, status = status.HTTP_400_BAD_REQUEST )
|
||||
|
||||
|
||||
@csrf_exempt
|
||||
|
||||
@api_view( ['GET', 'PUT'] )
|
||||
def event_participation_detail( request, username, eventId = None ):
|
||||
def event_participation_detail( request, username = None, eventId = None ):
|
||||
# TODO Permissions!
|
||||
try:
|
||||
participationQs = EventParticipation.objects.filter( musician__user__username = username )
|
||||
participationQs = EventParticipation.objects.filter( event__date__gte = datetime.date.today() )
|
||||
if username:
|
||||
participationQs = EventParticipation.objects.filter( musician__user__username = username )
|
||||
if eventId:
|
||||
participationQs = participationQs.filter( event__pk = eventId )
|
||||
|
||||
@@ -68,12 +53,16 @@ def event_participation_detail( request, username, eventId = None ):
|
||||
|
||||
|
||||
|
||||
|
||||
# ------------------------------------ Normal Views ----------------------------------------------------
|
||||
|
||||
|
||||
|
||||
|
||||
def events_view( request ):
|
||||
def eventplanning_view( request ):
|
||||
"""
|
||||
View for a specific user, to edit his events
|
||||
"""
|
||||
# All events in the future sorted by date
|
||||
all_future_events = list ( Event.objects.filter( date__gte = datetime.date.today() ) )
|
||||
|
||||
@@ -84,4 +73,56 @@ def events_view( request ):
|
||||
e.participation = EventParticipation.objects.get( event = e, musician = musician )
|
||||
|
||||
context = { 'events' : all_future_events }
|
||||
return render ( request, 'eventplanner/event_view.html', context )
|
||||
return render ( request, 'eventplanner/eventplanning_view.html', context )
|
||||
|
||||
|
||||
|
||||
|
||||
def events_grid( request ):
|
||||
|
||||
musicians = Musician.objects.all()
|
||||
musicianNames = [ m.user.username for m in musicians ]
|
||||
|
||||
|
||||
all_future_events = list ( Event.objects.filter( date__gte = datetime.date.today() ) )
|
||||
|
||||
for e in all_future_events:
|
||||
e.participation = [ EventParticipation.objects.get( event = e, musician = m ) for m in musicians ]
|
||||
|
||||
# Sort the participations in a dict
|
||||
#for p in participationQs:
|
||||
# username = p.musician.user.username
|
||||
# eventId = p.event.pk
|
||||
# if not eventId in grid:
|
||||
# grid[eventId] = {}
|
||||
#
|
||||
# grid[eventId][username] = p
|
||||
|
||||
|
||||
context = { 'events': all_future_events,
|
||||
'musicianNames' : musicianNames }
|
||||
return render ( request, 'eventplanner/events_grid.html', context )
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
from django.views.generic.edit import UpdateView
|
||||
|
||||
|
||||
class EventForm( ModelForm ):
|
||||
class Meta:
|
||||
model = Event
|
||||
fields= ['title', 'date','time','type']
|
||||
|
||||
class EventUpdate( UpdateView ):
|
||||
form_class = EventForm
|
||||
model = Event
|
||||
template_name_suffix = "_update_form"
|
||||
success_url = '/events/grid'
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user