Event resturcturing

- new short_description field instead of title
- autosave text

- autocompletion on login
This commit is contained in:
Martin Bauer 2013-09-28 18:57:19 +02:00
parent 6c3a7ca408
commit d71c35bcd7
32 changed files with 639 additions and 118 deletions

Binary file not shown.

View File

@ -138,12 +138,13 @@ INSTALLED_APPS = (
'crispy_forms', # better looking forms ( bootstrap ) 'crispy_forms', # better looking forms ( bootstrap )
'sekizai', # for the addtoblock directive in templates 'sekizai', # for the addtoblock directive in templates
'rest_framework', # for event management api 'rest_framework', # for event management api
'south',
# Own Things # Own Things
'website', # Blechreiz Website in general 'website', # Blechreiz Website in general
'musicians', # User Management 'musicians', # User Management
'eventplanner', # Event Management 'eventplanner', # Event Management
'messages', # Messages ( Forum ) 'simpleforum', # Messages ( Forum )
'location_field', # custom location field used in Event Management 'location_field', # custom location field used in Event Management
) )

View File

@ -6,7 +6,7 @@ from musicians.views import MusicianList, addressbook
from musicians.views import user_edit from musicians.views import user_edit
import website.views import website.views
import messages.views import simpleforum.views
import eventplanner.urls import eventplanner.urls
import settings import settings
@ -23,7 +23,8 @@ urlpatterns = patterns('',
url(r'^musicians/(?P<username>[\w]+)$', user_edit ), url(r'^musicians/(?P<username>[\w]+)$', user_edit ),
url(r'^addressbook/$', addressbook ), url(r'^addressbook/$', addressbook ),
url(r'^login/$', website.views.login_view), url(r'^login/$', website.views.login_view),
url(r'^login/usernames$', website.views.userlistForAutocompletion),
url(r'^logout/$', website.views.logout_view), url(r'^logout/$', website.views.logout_view),
url(r'^messages/$', messages.views.message_view ), url(r'^messages/$', simpleforum.views.message_view ),
url(r'^location_field/', include('location_field.urls')), url(r'^location_field/', include('location_field.urls')),
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) ) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

View File

@ -10,7 +10,7 @@ class EventParticipationInline(admin.TabularInline):
has_add_permission = lambda self, req : False has_add_permission = lambda self, req : False
has_delete_permission = lambda self, req, obj : False has_delete_permission = lambda self, req, obj : False
template = "custom_tabular.html" template = "eventplanner/admin_tabular.html"
class EventAdmin(admin.ModelAdmin): class EventAdmin(admin.ModelAdmin):

Binary file not shown.

View File

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-06-30 16:58+0200\n" "POT-Creation-Date: 2013-09-28 16:56+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,95 +18,102 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: models.py:10 #: models.py:14
msgid "Rehearsal" msgid "Rehearsal"
msgstr "Probe" msgstr "Probe"
#: models.py:11 #: models.py:15
msgid "Concert" msgid "Concert"
msgstr "Konzert" msgstr "Konzert"
#: models.py:12 #: models.py:16
msgid "General Rehearsal"
msgstr "Generalprobe"
#: models.py:13
msgid "Party" msgid "Party"
msgstr "Feier" msgstr "Feier"
#: models.py:16
msgid "title"
msgstr "Titel"
#: models.py:17 #: models.py:17
msgid "Travel"
msgstr "Dienstreise"
#: models.py:20
msgid "type" msgid "type"
msgstr "Typ" msgstr "Typ"
#: models.py:18 #: models.py:21
msgid "Short Description"
msgstr "Kurzbeschreibung"
#: models.py:22
msgid "location" msgid "location"
msgstr "Ort" msgstr "Ort"
#: models.py:19 #: models.py:23
msgid "Location on map"
msgstr "Ort auf Karte"
#: models.py:24
msgid "description" msgid "description"
msgstr "Beschreibung" msgstr "Beschreibung"
#: models.py:21 #: models.py:26
msgid "date" msgid "date"
msgstr "Datum" msgstr "Datum"
#: models.py:22 #: models.py:27
msgid "time" msgid "time"
msgstr "Uhrzeit" msgstr "Uhrzeit"
#: models.py:23 #: models.py:28
msgid "meeting_time" msgid "meeting_time"
msgstr "Treffen um" msgstr "Treffen um"
#: models.py:25 #: models.py:30
msgid "End Date"
msgstr "Bis:"
#: models.py:32
msgid "participants" msgid "participants"
msgstr "Teilnehmer" msgstr "Teilnehmer"
#: models.py:45 #: models.py:64
msgid "?" msgid "?"
msgstr "" msgstr "?"
#: models.py:46 #: models.py:65
msgid "Yes" msgid "Yes"
msgstr "Ja" msgstr "Ja"
#: models.py:47 #: models.py:66
msgid "No" msgid "No"
msgstr "Nein" msgstr "Nein"
#: models.py:50 #: models.py:69
msgid "event" msgid "event"
msgstr "Termin" msgstr "Termin"
#: models.py:51 #: models.py:70
msgid "musician" msgid "user"
msgstr "Musiker" msgstr "Benutzer"
#: models.py:52 #: models.py:71
msgid "status" msgid "status"
msgstr "Status" msgstr "Status"
#: models.py:53 #: models.py:72
msgid "comment" msgid "comment"
msgstr "Kommentar" msgstr "Kommentar"
#: models.py:72 #: models.py:100
msgid "Can modify participation status of other users" msgid "Can modify participation status of other users"
msgstr "" msgstr "Darf Teilnahmestatus von anderen ändern"
#: templates/custom_tabular.html:17 #~ msgid "General Rehearsal"
msgid "Delete?" #~ msgstr "Generalprobe"
msgstr "Löschen"
#: templates/custom_tabular.html:74 #~ msgid "title"
#, python-format #~ msgstr "Titel"
msgid "Add another %(verbose_name)s"
msgstr ""
#: templates/custom_tabular.html:75 #~ msgid "musician"
msgid "Remove" #~ msgstr "Musiker"
msgstr ""
#~ msgid "Delete?"
#~ msgstr "Löschen"

View File

@ -0,0 +1,112 @@
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'Event'
db.create_table(u'eventplanner_event', (
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('type', self.gf('django.db.models.fields.CharField')(default='Reh', max_length=6)),
('short_desc', self.gf('django.db.models.fields.CharField')(max_length=100, null=True, blank=True)),
('location', self.gf('django.db.models.fields.TextField')()),
('map_location', self.gf('location_field.models.PlainLocationField')(max_length=63)),
('desc', self.gf('django.db.models.fields.TextField')(blank=True)),
('date', self.gf('django.db.models.fields.DateField')()),
('time', self.gf('django.db.models.fields.TimeField')(null=True, blank=True)),
('meeting_time', self.gf('django.db.models.fields.TimeField')(null=True, blank=True)),
('end_date', self.gf('django.db.models.fields.DateField')(null=True)),
))
db.send_create_signal(u'eventplanner', ['Event'])
# Adding model 'EventParticipation'
db.create_table(u'eventplanner_eventparticipation', (
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('event', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['eventplanner.Event'])),
('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
('status', self.gf('django.db.models.fields.CharField')(default='?', max_length=3)),
('comment', self.gf('django.db.models.fields.CharField')(max_length=64, blank=True)),
))
db.send_create_signal(u'eventplanner', ['EventParticipation'])
# Adding unique constraint on 'EventParticipation', fields ['event', 'user']
db.create_unique(u'eventplanner_eventparticipation', ['event_id', 'user_id'])
def backwards(self, orm):
# Removing unique constraint on 'EventParticipation', fields ['event', 'user']
db.delete_unique(u'eventplanner_eventparticipation', ['event_id', 'user_id'])
# Deleting model 'Event'
db.delete_table(u'eventplanner_event')
# Deleting model 'EventParticipation'
db.delete_table(u'eventplanner_eventparticipation')
models = {
u'auth.group': {
'Meta': {'object_name': 'Group'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
u'auth.permission': {
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
u'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
u'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
u'eventplanner.event': {
'Meta': {'object_name': 'Event'},
'date': ('django.db.models.fields.DateField', [], {}),
'desc': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'end_date': ('django.db.models.fields.DateField', [], {'null': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'location': ('django.db.models.fields.TextField', [], {}),
'map_location': ('location_field.models.PlainLocationField', [], {'max_length': '63'}),
'meeting_time': ('django.db.models.fields.TimeField', [], {'null': 'True', 'blank': 'True'}),
'participants': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.User']", 'through': u"orm['eventplanner.EventParticipation']", 'symmetrical': 'False'}),
'short_desc': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
'time': ('django.db.models.fields.TimeField', [], {'null': 'True', 'blank': 'True'}),
'type': ('django.db.models.fields.CharField', [], {'default': "'Reh'", 'max_length': '6'})
},
u'eventplanner.eventparticipation': {
'Meta': {'unique_together': "(('event', 'user'),)", 'object_name': 'EventParticipation'},
'comment': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}),
'event': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['eventplanner.Event']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'status': ('django.db.models.fields.CharField', [], {'default': "'?'", 'max_length': '3'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"})
}
}
complete_apps = ['eventplanner']

View File

@ -13,24 +13,26 @@ class Event ( models.Model ):
EVENT_TYPES = ( EVENT_TYPES = (
( 'Reh', _('Rehearsal') ), ( 'Reh', _('Rehearsal') ),
( 'Conc', _('Concert') ), ( 'Conc', _('Concert') ),
( 'GenReh', _('General Rehearsal') ),
( 'Party', _('Party') ), ( 'Party', _('Party') ),
( 'Travel', _('Travel') )
) )
title = models.CharField( max_length=40, verbose_name = _("titel") )
type = models.CharField( max_length=6, choices=EVENT_TYPES, default='Reh', verbose_name= _("type") ) type = models.CharField( max_length=6, choices=EVENT_TYPES, default='Reh', verbose_name= _("type") )
short_desc = models.CharField( null=True, max_length=100, blank = True, verbose_name= _("Short Description") )
location = models.TextField( blank=False, verbose_name=_("location") ) location = models.TextField( blank=False, verbose_name=_("location") )
map_location = PlainLocationField( based_field = location, zoom=7 ) map_location = PlainLocationField(blank=True, based_field = location, zoom=7, verbose_name=_("Location on map") )
desc = models.TextField( blank=True, verbose_name=_("description")) desc = models.TextField( blank=True, verbose_name=_("description") )
date = models.DateField( verbose_name= _("date") ) date = models.DateField( verbose_name= _("date") )
time = models.TimeField( null=True, blank=True, verbose_name = _("time") ) time = models.TimeField( null=True, blank=True, verbose_name = _("time") )
meeting_time = models.TimeField( null=True, blank=True, verbose_name = _("meeting_time") ) meeting_time = models.TimeField( null=True, blank=True, verbose_name = _("meeting_time") )
end_date = models.DateField( null=True, blank = True, verbose_name = _("End Date") )
participants = models.ManyToManyField( User, through='EventParticipation', verbose_name=_("participants") ) participants = models.ManyToManyField( User, through='EventParticipation', verbose_name=_("participants") )
def __unicode__(self): def __unicode__(self):
return self.title + " ( " + self.get_type_display() + " ) " return self.title
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
@ -42,6 +44,14 @@ class Event ( models.Model ):
if not u in self.participants.all(): if not u in self.participants.all():
EventParticipation.objects.create( event=self, user = u, status='?', comment = '' ) EventParticipation.objects.create( event=self, user = u, status='?', comment = '' )
@property
def title(self):
res = self.get_type_display()
if ( self.short_desc ):
res += " ( " + self.short_desc + " ) "
return res
@property @property
def displaytime(self): def displaytime(self):
if self.meeting_time is None or self.meeting_time == "": if self.meeting_time is None or self.meeting_time == "":

View File

@ -0,0 +1,78 @@
{% 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

@ -22,11 +22,7 @@
<div class="row"> <div class="row">
<div class="span12"> <div class="span12">
<h3>Termin bearbeiten</h3> <h3>Termin bearbeiten</h3>
<!--
<form action="/contact/" method="post">
{% csrf_token %} {{ form.as_p }} <input type="submit" value="Submit" />
</form>
-->
{% crispy form %} {% crispy form %}
</div> </div>
@ -52,8 +48,8 @@
<script> <script>
$(document).ready(function(){ $(document).ready(function(){
$('.dateinput').datepicker({ $('.dateinput').datepicker({
format: "dd.mm.yyyy", format: "dd.mm.yyyy",
weekStart: 1, weekStart: 1,
@ -62,17 +58,57 @@ $(document).ready(function(){
todayHighlight: true, todayHighlight: true,
startDate: "{% now "SHORT_DATE_FORMAT" %}", startDate: "{% now "SHORT_DATE_FORMAT" %}",
}); });
$('.timeinput').addClass('input-small').wrap('<div class="input-append bootstrap-timepicker">') $('.timeinput').addClass('input-small').wrap('<div class="input-append bootstrap-timepicker">')
$(".input-append").append( '<span class="add-on"><i class="icon-time"></i></span>' ) $(".input-append").append( '<span class="add-on"><i class="icon-time"></i></span>' )
$('.timeinput').timepicker({ $('.timeinput').timepicker({
minuteStep: 15, minuteStep: 15,
showMeridian: false, showMeridian: false,
defaultTime: false defaultTime: false
}); });
function onTypeChange( val )
{
if ( val == "Reh") {
$("#div_id_time").show();
$("#div_id_meeting_time").hide();
$("#div_id_map_location").hide();
$("#div_id_end_date").hide();
if ( ! $("#id_time").val() ) {
$("#id_time").val("19:00");
}
if ( ! $("#id_location").val() ) {
$("#id_location").val("Rohr");
}
}
else if ( val == "Conc" ) {
$("#div_id_time").show();
$("#div_id_meeting_time").show();
$("#div_id_map_location").show();
$("#div_id_end_date").hide();
}
else if ( val == "Party") {
$("#div_id_time").show();
$("#div_id_meeting_time").hide();
$("#div_id_map_location").show();
$("#div_id_end_date").hide();
}
else if ( val == "Travel") {
$("#div_id_time").hide();
$("#div_id_meeting_time").hide();
$("#div_id_map_location").show();
$("#div_id_end_date").show();
}
}
$("#id_type").change( function() {
onTypeChange( $(this).val() );
} );
onTypeChange( $("#id_type").val() );
} ); } );
</script> </script>
{% endaddtoblock %} {% endaddtoblock %}

View File

@ -42,6 +42,8 @@
} }
function putStatus( button, status ) { function putStatus( button, status ) {
$("#saving").html("Speichere..");
p = button.parent(); p = button.parent();
putObject = [ { "event": p.data("event-id"), putObject = [ { "event": p.data("event-id"),
"user": p.data("username"), "user": p.data("username"),
@ -51,7 +53,8 @@
type: "PUT", type: "PUT",
url: "{% url 'event_api' %}", url: "{% url 'event_api' %}",
contentType: "application/json", contentType: "application/json",
data: JSON.stringify(putObject) data: JSON.stringify(putObject),
success: function() { $("#saving").html("Ok"); }
}); });
setEventButtonStatus( button, status ); setEventButtonStatus( button, status );
@ -63,7 +66,8 @@
$(function(){ $(function(){
$(".event-comment").bindWithDelay("keypress", function() { $(".event-comment").bindWithDelay("keypress", function() {
$("#saving").html("Speichere..");
putObject = [ { "event": $(this).data("event-id"), putObject = [ { "event": $(this).data("event-id"),
"user": $(this).data("username"), "user": $(this).data("username"),
@ -73,7 +77,8 @@
type: "PUT", type: "PUT",
url: "{% url 'event_api' %}", url: "{% url 'event_api' %}",
contentType: "application/json", contentType: "application/json",
data: JSON.stringify(putObject) data: JSON.stringify(putObject),
success: function() { $("#saving").html("Ok"); }
}); });
}, 800 ); }, 800 );
@ -98,6 +103,7 @@
<div class="container"> <div class="container">
<form>
<div class="row"> <div class="row">
<div class="row-fluid eventTable"> <div class="row-fluid eventTable">
<div class="span12"> <div class="span12">
@ -112,6 +118,7 @@
<th id='eventTitle'>Termin</th> <th id='eventTitle'>Termin</th>
<th id='date' >Datum</th> <th id='date' >Datum</th>
<th id='time' >Uhrzeit</th> <th id='time' >Uhrzeit</th>
<th id='time' >Treffpunkt</th>
<th id='place' >Ort</th> <th id='place' >Ort</th>
<th id='status' >Status ändern</th> <th id='status' >Status ändern</th>
<th id='comment' >Kommentar</th> <th id='comment' >Kommentar</th>
@ -121,11 +128,16 @@
{% for event in events %} {% for event in events %}
<tr> <tr>
<td class="center"> <a href="{{ event.pk }}"> {{ event.title }} </a> </td> {% if not perms.eventplanner.change_event %}
<td class="center"> {{ event.date }} </td> <td class="center"> {{ event.title }} </td>
<td class="center"> {% if event.time %} {{ event.time }} {% endif %} </td> {% else %}
<!-- <td class="center"> {{ event.location }} </td> --> <td class="center"> <a href="{{ event.pk }}"> {{ event.title }} </a> </td>
<td class="center"> Ort </td> {% endif %}
<td class="center"> {{ event.date | date:"SHORT_DATE_FORMAT" }} </td>
<td class="center"> {% if event.time %} {{ event.time | time:"H:i" }} {% endif %} </td>
<td class="center"> {% if event.meeting_time %} {{ event.meeting_time | time:"H:i" }} {% endif %} </td>
<td class="center"> {{ event.location }} </td>
<td class="center"> <td class="center">
<div class="btn-group event-status-select" data-event-id="{{event.pk}}" data-username="{{user.username}}" > <div class="btn-group event-status-select" data-event-id="{{event.pk}}" data-username="{{user.username}}" >
@ -156,6 +168,13 @@
</div><!--/row--> </div><!--/row-->
</div> </div>
</div> <div class="row">
<div class="span12">
<em>Änderungen werden automatisch gespeichert: </em> <em id="saving">Ok</em>
</div>
</div>
</form>
</div>
{% endblock %} {% endblock %}

View File

@ -129,7 +129,7 @@
{% for event in events %} {% for event in events %}
<tr class="eventRow"> <tr class="eventRow">
<td class="center"> <a href="{{ event.pk }}"> {{ event.title }} </a> </td> <td class="center"> <a href="{{ event.pk }}"> {{ event.title }} </a> </td>
<td class="center"> {{ event.date }} </td> <td class="center"> {{ event.date | date:"SHORT_DATE_FORMAT" }} </td>
{% for p in event.participation %} {% for p in event.participation %}
@ -176,7 +176,6 @@
<div class="span12"> <div class="span12">
<button id="saveButton" class="btn btn-primary" disabled="true">Speichern</button> <button id="saveButton" class="btn btn-primary" disabled="true">Speichern</button>
</div> </div>
</div> </div>
{% endif %}</form> {% endif %}</form>

View File

@ -119,7 +119,7 @@ class EventForm( ModelForm ):
class Meta: class Meta:
model = Event model = Event
fields= [ 'type', 'title', 'date','time', 'meeting_time', 'location', 'map_location', 'desc', ] fields= [ 'type', 'short_desc', 'date', 'end_date', 'time', 'meeting_time', 'location', 'map_location', 'desc', ]
widgets = { widgets = {
'location' : TextInput(), 'location' : TextInput(),
@ -132,13 +132,24 @@ class EventUpdate( UpdateView ):
model = Event model = Event
template_name_suffix = "_update_form" template_name_suffix = "_update_form"
success_url = '.' success_url = '.'
def get_context_data(self, **kwargs):
context = super(UpdateView, self).get_context_data(**kwargs)
context['viewtype'] = "update"
return context
class EventCreate( CreateView ): class EventCreate( CreateView ):
form_class = EventForm form_class = EventForm
model = Event model = Event
template_name_suffix = "_update_form" template_name_suffix = "_update_form"
success_url = '.' success_url = '.'
def get_context_data(self, **kwargs):
context = super(CreateView, self).get_context_data(**kwargs)
context['viewtype'] = "create"
return context

View File

@ -34,7 +34,6 @@ class PlainLocationField(BaseLocationField, CharField):
# south compatibility # south compatibility
try: try:
from south.modelsinspector import add_introspection_rules from south.modelsinspector import add_introspection_rules
add_introspection_rules([], ["^location_field\.models\.LocationField"]) add_introspection_rules([], ["^location_field\.models\.PlainLocationField"])
add_introspection_rules([], ["^django\.contrib\.gis"])
except: except:
pass pass

View File

@ -1,16 +0,0 @@
"""
This file demonstrates writing tests using the unittest module. These will pass
when you run "manage.py test".
Replace this with more appropriate tests for your application.
"""
from django.test import TestCase
class SimpleTest(TestCase):
def test_basic_addition(self):
"""
Tests that 1 + 1 always equals 2.
"""
self.assertEqual(1 + 1, 2)

View File

@ -0,0 +1,96 @@
# 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-09-28 16:57+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"
#: admin.py:17
msgid "musicians"
msgstr "Musiker"
#: admin.py:18
msgid "musician"
msgstr "Musiker"
#: models.py:8
msgid "Trumpet"
msgstr "Trompete"
#: models.py:9
msgid "Trombone"
msgstr "Posaune"
#: models.py:10
msgid "Horn"
msgstr "Horn"
#: models.py:11
msgid "Tuba"
msgstr "Tuba"
#: models.py:26
msgid "user"
msgstr "Benutzer"
#: models.py:28
msgid "image"
msgstr "Bild"
#: models.py:29
msgid "circular thumbnail"
msgstr "Vorschau (rund)"
#: models.py:32
msgid "instrument"
msgstr "Instrument"
#: models.py:34
msgid "birthday"
msgstr "Geburtstag"
#: models.py:36
msgid "street"
msgstr "Straße"
#: models.py:37
msgid "city"
msgstr "Wohnort"
#: models.py:38
msgid "zip_code"
msgstr "PLZ"
#: models.py:40
msgid "phone_home"
msgstr "Telefon Daheim"
#: models.py:41
msgid "phone_mobile"
msgstr "Telefon Mobil"
#: models.py:42
msgid "phone_work"
msgstr "Telefon Arbeit"
#: models.py:44
msgid "Position"
msgstr ""
#: models.py:54
msgid "public_description"
msgstr "Beschreibung (öffentlich)"

View File

@ -0,0 +1,92 @@
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'Musician'
db.create_table(u'musicians_musician', (
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('user', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['auth.User'], unique=True)),
('image', self.gf('django.db.models.fields.files.ImageField')(max_length=100)),
('small_image', self.gf('django.db.models.fields.files.ImageField')(max_length=100)),
('instrument', self.gf('django.db.models.fields.CharField')(max_length=4, blank=True)),
('birthday', self.gf('django.db.models.fields.DateField')(null=True)),
('street', self.gf('django.db.models.fields.CharField')(max_length=80, blank=True)),
('city', self.gf('django.db.models.fields.CharField')(max_length=40, blank=True)),
('zip_code', self.gf('django.db.models.fields.IntegerField')(null=True)),
('phone_home', self.gf('django.db.models.fields.CharField')(max_length=18, blank=True)),
('phone_mobile', self.gf('django.db.models.fields.CharField')(max_length=18, blank=True)),
('phone_work', self.gf('django.db.models.fields.CharField')(max_length=18, blank=True)),
('position', self.gf('django.db.models.fields.IntegerField')(null=True)),
('public_description', self.gf('django.db.models.fields.TextField')(blank=True)),
))
db.send_create_signal(u'musicians', ['Musician'])
def backwards(self, orm):
# Deleting model 'Musician'
db.delete_table(u'musicians_musician')
models = {
u'auth.group': {
'Meta': {'object_name': 'Group'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
u'auth.permission': {
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
u'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
u'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
u'musicians.musician': {
'Meta': {'object_name': 'Musician'},
'birthday': ('django.db.models.fields.DateField', [], {'null': 'True'}),
'city': ('django.db.models.fields.CharField', [], {'max_length': '40', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}),
'instrument': ('django.db.models.fields.CharField', [], {'max_length': '4', 'blank': 'True'}),
'phone_home': ('django.db.models.fields.CharField', [], {'max_length': '18', 'blank': 'True'}),
'phone_mobile': ('django.db.models.fields.CharField', [], {'max_length': '18', 'blank': 'True'}),
'phone_work': ('django.db.models.fields.CharField', [], {'max_length': '18', 'blank': 'True'}),
'position': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
'public_description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'small_image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100'}),
'street': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'}),
'zip_code': ('django.db.models.fields.IntegerField', [], {'null': 'True'})
}
}
complete_apps = ['musicians']

View File

View File

@ -28,7 +28,6 @@ class Musician( models.Model ):
image = models.ImageField( upload_to = musicianPictureName, verbose_name=_("image") ) image = models.ImageField( upload_to = musicianPictureName, verbose_name=_("image") )
small_image = models.ImageField( upload_to = musicianSmallPictureName, verbose_name = _("circular thumbnail") ) small_image = models.ImageField( upload_to = musicianSmallPictureName, verbose_name = _("circular thumbnail") )
# Properties # Properties
instrument = models.CharField( max_length=4, choices=INSTRUMENTS, blank=True, verbose_name=_("instrument") ) instrument = models.CharField( max_length=4, choices=INSTRUMENTS, blank=True, verbose_name=_("instrument") )
@ -42,6 +41,8 @@ class Musician( models.Model ):
phone_mobile = models.CharField( max_length=18, blank=True, verbose_name=_("phone_mobile") ) phone_mobile = models.CharField( max_length=18, blank=True, verbose_name=_("phone_mobile") )
phone_work = models.CharField( max_length=18, blank=True, verbose_name=_("phone_work") ) phone_work = models.CharField( max_length=18, blank=True, verbose_name=_("phone_work") )
position = models.IntegerField( null=True, verbose_name=_("Position") )
@property @property
def isDeepBrass(self): def isDeepBrass(self):
return self.instrument == 'TRB' or self.instrument == "EUPH" or self.instrument == "TUBA" or self.instrument == "HRN" return self.instrument == 'TRB' or self.instrument == "EUPH" or self.instrument == "TUBA" or self.instrument == "HRN"

0
simpleforum/__init__.py Normal file
View File

View File

@ -0,0 +1,74 @@
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'Message'
db.create_table(u'simpleforum_message', (
(u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('titel', self.gf('django.db.models.fields.CharField')(max_length=100)),
('text', self.gf('django.db.models.fields.TextField')()),
('creation_time', self.gf('django.db.models.fields.DateTimeField')()),
('author', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
))
db.send_create_signal(u'simpleforum', ['Message'])
def backwards(self, orm):
# Deleting model 'Message'
db.delete_table(u'simpleforum_message')
models = {
u'auth.group': {
'Meta': {'object_name': 'Group'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
u'auth.permission': {
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
u'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
u'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
u'simpleforum.message': {
'Meta': {'object_name': 'Message'},
'author': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}),
'creation_time': ('django.db.models.fields.DateTimeField', [], {}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'text': ('django.db.models.fields.TextField', [], {}),
'titel': ('django.db.models.fields.CharField', [], {'max_length': '100'})
}
}
complete_apps = ['simpleforum']

View File

View File

@ -38,5 +38,5 @@ def message_view( request ):
context['messages'] = Message.objects.order_by('-creation_time')[:20] context['messages'] = Message.objects.order_by('-creation_time')[:20]
context['archiveMode'] = False context['archiveMode'] = False
return render ( request, 'messages/messages.html', context ) return render ( request, 'simpleforum/simpleforum.html', context )

View File

@ -158,10 +158,10 @@
<div id="route_info_box" class="span5 box_wrapp"> <div id="route_info_box" class="span5 box_wrapp">
<div class="box_cont"> <div class="box_cont">
<div class="head"> <div class="head">
<h6>Fahrt zum Konzert:</h6> <h6>Nächstes Konzert:</h6>
</div> </div>
Nächstes Konzert ist in {{nextConcert.location}} <br/> am {{nextConcert.date}} um {{nextConcert.time | time:"H:i" }} <br/> Nächstes Konzert ist in <br> <em>{{nextConcert.location}}</em> <br> am {{nextConcert.date | date:"SHORT_DATE_FORMAT" }} um {{nextConcert.time | time:"H:i" }} Uhr <br/>
{% if nextConcert.meeting_time %} Treffpunkt ist um {{ nextConcert.meeting_time | time:"H:i" }} <br/> {% endif %} {% if nextConcert.meeting_time %} Treffpunkt ist um {{ nextConcert.meeting_time | time:"H:i" }} Uhr <br/> {% endif %}
<table> <table>
<tr> <td> Fahrzeit:</td> <td> <span id="route_duration"></span> </td> </tr> <tr> <td> Fahrzeit:</td> <td> <span id="route_duration"></span> </td> </tr>

View File

@ -38,9 +38,9 @@
<div class="span6 text"> <div class="span6 text">
<h4>Der nächste Termin:</h4> <h4>Der nächste Termin:</h4>
<p> <p>
{{countdown.event.title}} ist am {{countdown.event.date}} {{countdown.event.title}} ist am {{countdown.event.date | date:"SHORT_DATE_FORMAT" }}
um {{countdown.event.displaytime | time:"H:i" }} um {{countdown.event.displaytime | time:"H:i" }}
in {{countdown.event.location}} in <em>{{countdown.event.location}} </em>
<br/> <br/>
{% if countdown.participation == "?" %} {% if countdown.participation == "?" %}

View File

@ -30,6 +30,11 @@
{% addtoblock "css" strip %}<link rel="stylesheet" href="{{STATIC_URL}}/css/jquery.noty.css" type="text/css" media="screen" /> {% endaddtoblock %} {% addtoblock "css" strip %}<link rel="stylesheet" href="{{STATIC_URL}}/css/jquery.noty.css" type="text/css" media="screen" /> {% endaddtoblock %}
{% addtoblock "css" strip %}<link rel="stylesheet" href="{{STATIC_URL}}/css/noty_theme_default.css" type="text/css" media="screen" /> {% endaddtoblock %} {% addtoblock "css" strip %}<link rel="stylesheet" href="{{STATIC_URL}}/css/noty_theme_default.css" type="text/css" media="screen" /> {% endaddtoblock %}
<!-- For Autocompete -->
{% addtoblock "js" strip %} <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script> {% endaddtoblock %}
{% addtoblock "css" strip %}<link rel="stylesheet" href="{{STATIC_URL}}/css/jquery-ui-1.8.21.custom.css" type="text/css" media="screen" /> {% endaddtoblock %}
<!-- Notifications --> <!-- Notifications -->
{% addtoblock "js" %} {% addtoblock "js" %}
@ -54,7 +59,12 @@
}); });
e.preventDefault(); e.preventDefault();
}); });
} );
$.get( "/login/usernames", function( data ) {
$("#username").autocomplete( { source: data } );
});
});
</script> </script>
{% endaddtoblock %} {% endaddtoblock %}
@ -71,7 +81,7 @@
<div class="span12 footer" action="index.html" method="post"> <div class="span12 footer" action="index.html" method="post">
<form id="loginform"> <form id="loginform">
{% csrf_token %} {% csrf_token %}
<input name="username" type="text" placeholder="Benutzername"> <input name="username" type="text" placeholder="Benutzername" id="username">
<input name="password" type="password" placeholder="Passwort"> <input name="password" type="password" placeholder="Passwort">
<input name="next" type="hidden" value="{{next}}" > <input name="next" type="hidden" value="{{next}}" >
<input type="submit" placeholder="OK" value="einloggen"> <input type="submit" placeholder="OK" value="einloggen">

View File

@ -1,16 +0,0 @@
"""
This file demonstrates writing tests using the unittest module. These will pass
when you run "manage.py test".
Replace this with more appropriate tests for your application.
"""
from django.test import TestCase
class SimpleTest(TestCase):
def test_basic_addition(self):
"""
Tests that 1 + 1 always equals 2.
"""
self.assertEqual(1 + 1, 2)

View File

@ -13,6 +13,7 @@ from eventplanner.models import Event, EventParticipation
from musicians.models import Musician from musicians.models import Musician
from datetime import datetime from datetime import datetime
from django.contrib.auth.models import User
@login_required @login_required
@ -72,11 +73,17 @@ def logout_view(request):
return redirect( login_view ) return redirect( login_view )
def userlistForAutocompletion(request):
result = [ u.username for u in User.objects.all() ]
return HttpResponse( simplejson.dumps(result), mimetype='application/json' )
def login_view( request ): def login_view( request ):
if request.method == 'POST': # If the form has been submitted... if request.method == 'POST': # If the form has been submitted...
username = request.POST['username'] raiseFirstLetter = lambda s: s[:1].upper() + s[1:] if s else ''
username = raiseFirstLetter( request.POST['username'] )
password = request.POST['password'] password = request.POST['password']
user = authenticate(username=username, password=password) user = authenticate( username=username, password=password )
result = dict() result = dict()
result['err'] = "" result['err'] = ""
if user is not None: if user is not None: