Eventplanner: Grid / Translation

This commit is contained in:
Martin Bauer
2013-06-30 11:01:12 +02:00
parent d4ba7d9a60
commit 01a7f5c16f
21 changed files with 3882 additions and 195 deletions

View 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"

View File

@@ -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

View File

@@ -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 %}&nbsp;<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>

View 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 %}

View File

@@ -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">

View 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 %}

View File

@@ -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'