Changeset b8172c8


Ignore:
Timestamp:
Mar 28, 2013, 6:16:41 AM (13 years ago)
Author:
Alex Dehnert <adehnert@…>
Branches:
master, space-access, stable, stage
Children:
870992c
Parents:
5260840 (diff), c3a5618 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
git-author:
Alex Dehnert <adehnert@…> (03/28/13 06:16:41)
git-committer:
Alex Dehnert <adehnert@…> (03/28/13 06:16:41)
Message:

Merge branch 'midway'

  • midway: Handle duplicate groups Fix spelling of midway permission Add the midway permissions to the asa-ebm group Allow running diff_static_data from any directory Add Midway map link to front page Allow sorting and filtering the midway page Sort imports more Basic list of groups at the midway WIP: midway page WIP: Midway
Files:
4 added
10 edited

Legend:

Unmodified
Added
Removed
  • .gitignore

    r7ef7143 r7d7801f  
    77asadb/media/fysm/slides/
    88asadb/media/page-previews/fysm/
     9asadb/media/midway/maps/
    910asadb/util/saved-data/
    1011asadb/util/static-data/
  • asadb/forms/admin.py

    rbda4d86 r26826c9  
     1from django.contrib import admin
     2
    13import forms.models
    2 from django.contrib import admin
    34
    45class FYSMAdmin(admin.ModelAdmin):
     
    6667    search_fields = ('username', 'groups__officer_email', 'groups__name', 'groups__abbreviation', )
    6768admin.site.register(forms.models.PersonMembershipUpdate, Admin_PersonMembershipUpdate)
     69
     70class Admin_Midway(admin.ModelAdmin):
     71    list_display = (
     72        'pk',
     73        'name',
     74        'slug',
     75        'date',
     76    )
     77    list_display_links = list_display
     78    search_fields = ('name', )
     79    prepopulated_fields = {"slug": ("name",)}
     80admin.site.register(forms.models.Midway, Admin_Midway)
     81
     82class Admin_MidwayAssignment(admin.ModelAdmin):
     83    list_display = (
     84        'pk',
     85        'midway',
     86        'location',
     87        'group',
     88    )
     89    list_display_links = list_display
     90    list_filter = ('midway', )
     91    search_fields = ('location', 'group__name', )
     92admin.site.register(forms.models.MidwayAssignment, Admin_MidwayAssignment)
  • asadb/forms/models.py

    rafc5348 r26826c9  
     1import datetime
     2import os, errno
     3
    14from django.conf import settings
    25from django.db import models
    3 
    4 import datetime
    5 import os, errno
    66
    77import groups.models
     
    205205    def __unicode__(self, ):
    206206        return "PersonMembershipUpdate for %s" % (self.username, )
     207
     208
     209
     210##########
     211# MIDWAY #
     212##########
     213
     214
     215class Midway(models.Model):
     216    name = models.CharField(max_length=50)
     217    slug = models.SlugField()
     218    date = models.DateTimeField()
     219    table_map = models.ImageField(upload_to='midway/maps')
     220
     221    def __str__(self, ):
     222        return "%s" % (self.name, )
     223
     224class MidwayAssignment(models.Model):
     225    midway = models.ForeignKey(Midway)
     226    location = models.CharField(max_length=20)
     227    group = models.ForeignKey(groups.models.Group)
     228
     229    def __str__(self, ):
     230        return "<MidwayAssignment: %s at %s at %s>" % (self.group, self.location, self.midway, )
  • asadb/forms/views.py

    rafc5348 rc3a5618  
    1 import forms.models
    2 import groups.models
    3 import groups.views
    4 import util.emails
     1import collections
     2import csv
     3import datetime
     4import StringIO
    55
    66from django.conf import settings
     
    1515from django.core.urlresolvers import reverse
    1616from django.core.mail import EmailMessage, mail_admins
     17from django.forms import FileField
    1718from django.forms import Form
    1819from django.forms import ModelForm
     
    2223from django.db.models import Q, Count
    2324
    24 import csv
    25 import datetime
    26 import StringIO
     25import django_filters
     26
     27import forms.models
     28import groups.models
     29import groups.views
     30import util.emails
    2731
    2832#################
     
    554558
    555559    return HttpResponse(buf.getvalue(), mimetype='text/csv', )
     560
     561
     562
     563##########
     564# Midway #
     565##########
     566
     567def midway_map_latest(request, ):
     568    midways = forms.models.Midway.objects.order_by('-date')[:1]
     569    if len(midways) == 0:
     570        raise Http404("No midways found.")
     571    else:
     572        url = reverse('midway-map', args=(midways[0].slug, ))
     573        return HttpResponseRedirect(url)
     574
     575
     576class MidwayAssignmentFilter(django_filters.FilterSet):
     577    name = django_filters.CharFilter(name='group__name', lookup_type='icontains', label="Name contains")
     578    abbreviation = django_filters.CharFilter(name='group__abbreviation', lookup_type='iexact', label="Abbreviation is")
     579    activity_category = django_filters.ModelChoiceFilter(
     580        label='Activity category',
     581        name='group__activity_category',
     582        queryset=groups.models.ActivityCategory.objects,
     583    )
     584
     585    class Meta:
     586        model = forms.models.MidwayAssignment
     587        fields = [
     588            'name',
     589            'abbreviation',
     590            'activity_category',
     591        ]
     592        order_by = (
     593            ('group__name', 'Name', ),
     594            ('group__abbreviation', 'Abbreviation', ),
     595            ('group__activity_category__name', 'Activity category', ),
     596            ('location', 'Location', ),
     597        )
     598
     599
     600class MidwayMapView(DetailView):
     601    context_object_name = "midway"
     602    model = forms.models.Midway
     603    template_name = 'midway/map.html'
     604
     605    def get_context_data(self, **kwargs):
     606        # Call the base implementation first to get a context
     607        context = super(MidwayMapView, self).get_context_data(**kwargs)
     608       
     609        filterset = MidwayAssignmentFilter(self.request.GET)
     610        context['assignments'] = filterset.qs
     611        context['filter'] = filterset
     612        context['pagename'] = 'midway'
     613
     614        return context
     615
     616
     617class MidwayAssignmentsUploadForm(Form):
     618    assignments = FileField()
     619
     620@permission_required('forms.add_midwayassignment')
     621def midway_assignment_upload(request, slug, ):
     622    midway = get_object_or_404(forms.models.Midway, slug=slug, )
     623
     624    uploaded = False
     625    found = []
     626    issues = collections.defaultdict(list)
     627
     628    if request.method == 'POST': # If the form has been submitted...
     629        form = MidwayAssignmentsUploadForm(request.POST, request.FILES, ) # A form bound to the POST data
     630
     631        if form.is_valid(): # All validation rules pass
     632            uploaded = True
     633            reader = csv.DictReader(request.FILES['assignments'])
     634            for row in reader:
     635                group_name = row['Group']
     636                group_officers = row['officers']
     637                table = row['Table']
     638                issue = False
     639                try:
     640                    group = groups.models.Group.objects.get(name=group_name)
     641                    assignment = forms.models.MidwayAssignment(
     642                        midway=midway,
     643                        location=table,
     644                        group=group,
     645                    )
     646                    assignment.save()
     647                    found.append(assignment)
     648                    status = group.group_status.slug
     649                    if status != 'active':
     650                        issue = 'status=%s (added anyway)' % (status, )
     651                except groups.models.Group.DoesNotExist:
     652                    issue = 'unknown group (ignored)'
     653                except groups.models.Group.MultipleObjectsReturned:
     654                    issue = 'multiple groups found (ignored)'
     655                if issue:
     656                    issues[issue].append((group_name, group_officers, table))
     657            for issue in issues:
     658                issues[issue] = sorted(issues[issue], key=lambda x: x[0])
     659
     660    else:
     661        form = MidwayAssignmentsUploadForm() # An unbound form
     662
     663    context = {
     664        'midway':midway,
     665        'form':form,
     666        'uploaded': uploaded,
     667        'found': found,
     668        'issues': dict(issues),
     669        'pagename':'midway',
     670    }
     671    return render_to_response('midway/upload.html', context, context_instance=RequestContext(request), )
  • asadb/groups/models.py

    r9b22b0f r26826c9  
    1 from django.conf import settings
    2 from django.db import models
    3 from django.core.validators import RegexValidator
    4 from django.contrib.auth.models import User
    5 from django.template.defaultfilters import slugify
    6 import reversion
    7 
    81import datetime
    92import filecmp
     
    169import urllib
    1710import urllib2
     11
     12from django.conf import settings
     13from django.db import models
     14from django.core.validators import RegexValidator
     15from django.contrib.auth.models import User
     16from django.template.defaultfilters import slugify
     17
     18import reversion
    1819
    1920import mit
  • asadb/groups/views.py

    r5260840 rb8172c8  
    44import csv
    55import datetime
    6 
    7 import groups.models
    86
    97from django.contrib.auth.decorators import user_passes_test, login_required, permission_required
     
    3028import django_filters
    3129
     30import groups.models
    3231from util.db_form_utils import StaticWidget
    3332import util.db_filters
  • asadb/template/index.html

    rde2f0ac r1cfab5a  
    4444        <li><a href='{%url fysm-select%}'>Submit an entry</a></li>
    4545    </ul></li>
     46    <li>Midway assignments: <a href='{% url midway-map-latest %}'>map</a></li>
    4647    <li>Membership updates<ul>
    4748        <li><a href='{%url membership-update-cycle %}'>Group update</a></li>
  • asadb/urls.py

    rafc5348 r1cfab5a  
    7373    url(r'^membership/admin/issues.csv$', forms.views.group_confirmation_issues, name='membership-issues', ),
    7474
     75    # Midway
     76    url(r'^midway/latest/$', forms.views.midway_map_latest, name='midway-map-latest', ),
     77    url(r'^midway/(?P<slug>[\w-]+)/$', forms.views.MidwayMapView.as_view(), name='midway-map', ),
     78    url(r'^midway/(?P<slug>[\w-]+)/assign/$', forms.views.midway_assignment_upload, name='midway-assign', ),
     79
    7580    # Group list
    7681    (r'^groups/', include(groups.urls.urls(), ), ),
  • asadb/util/diff_static_data.sh

    rc060d8c raab0dc8  
    55date
    66
    7 cd static-data
     7cd "$(dirname "$0")/static-data"
    88
    99../dump_group_perms.py > group-perms.py
  • asadb/template/groups/create/startup_review.html

    rac93a0c r172255b  
    1414<tr><th>Description</th><td>{{group.description}}</td></tr>
    1515
    16 <tr><th colspan='2'>Type</th></tr>
     16<tr><th colspan='2'>Officers</th></tr>
    1717<tr><th>President</th><td>{{startup.president_name}} ({{startup.president_kerberos}})</td></tr>
    1818<tr><th>Treasurer</th><td>{{startup.treasurer_name}} ({{startup.treasurer_kerberos}})</td></tr>
Note: See TracChangeset for help on using the changeset viewer.