Event resturcturing
- new short_description field instead of title - autosave text - autocompletion on login
This commit is contained in:
		
							parent
							
								
									6c3a7ca408
								
							
						
					
					
						commit
						d71c35bcd7
					
				
										
											Binary file not shown.
										
									
								
							|  | @ -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  | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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) | ||||||
|  | @ -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.
										
									
								
							|  | @ -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" | ||||||
|  |  | ||||||
|  | @ -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'] | ||||||
|  | @ -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 == "": | ||||||
|  |  | ||||||
|  | @ -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 %} <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> | ||||||
|  | @ -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, | ||||||
|  | @ -63,7 +59,6 @@ $(document).ready(function(){ | ||||||
| 		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>' ) | ||||||
| 	 | 	 | ||||||
|  | @ -73,6 +68,47 @@ $(document).ready(function(){ | ||||||
| 		 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 %} | ||||||
|  |  | ||||||
|  | @ -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 ); | ||||||
|  | @ -64,6 +67,7 @@ | ||||||
| 			 | 			 | ||||||
| 			$(".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> | ||||||
|  | 			  				    {% if not perms.eventplanner.change_event %} | ||||||
|  | 						  			<td class="center">  {{ event.title }} </td> | ||||||
|  | 						  		{% else %} | ||||||
| 						  			<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> | 						  		{% endif %} | ||||||
| 						  		<td class="center">  {% if event.time %} {{ event.time }} {% endif %} </td> | 						  		<td class="center"> {{ event.date | date:"SHORT_DATE_FORMAT" }} </td> | ||||||
| 						  		<!--  <td class="center">  {{ event.location }} </td> --> | 						  		<td class="center">  {% if event.time %} {{ event.time | time:"H:i" }} {% endif %} </td> | ||||||
| 						  		<td class="center"> Ort </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 class="row"> | ||||||
|  | 			<div class="span12"> | ||||||
|  | 		  <em>Änderungen werden automatisch gespeichert: </em> <em id="saving">Ok</em> | ||||||
| 			</div> | 			</div> | ||||||
|  | 		</div> | ||||||
|  | 	</form> | ||||||
|  | 	 | ||||||
|  | </div> | ||||||
| 
 | 
 | ||||||
| {% endblock %} | {% endblock %} | ||||||
|  | @ -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> | ||||||
| 			 | 			 | ||||||
|  |  | ||||||
|  | @ -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(), | ||||||
|  | @ -133,13 +133,24 @@ class EventUpdate( UpdateView ): | ||||||
|     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 | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -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 | ||||||
|  |  | ||||||
|  | @ -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) |  | ||||||
|  | @ -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)" | ||||||
|  | 
 | ||||||
|  | @ -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'] | ||||||
|  | @ -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,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'] | ||||||
|  | @ -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 ) | ||||||
| 
 | 
 | ||||||
|  | @ -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> | ||||||
|  |  | ||||||
|  | @ -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 == "?" %} | ||||||
|  |  | ||||||
|  | @ -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"> | ||||||
|  |  | ||||||
|  | @ -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) |  | ||||||
|  | @ -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: | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue