Changeset 34ae23b


Ignore:
Timestamp:
Oct 17, 2011, 12:05:07 PM (15 years ago)
Author:
Alex Dehnert <adehnert@…>
Branches:
master, space-access, stable, stage, test-hooks
Children:
eabc6ee
Parents:
b04e142 (diff), ca21c49 (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@…> (10/17/11 12:05:07)
git-committer:
Alex Dehnert <adehnert@…> (10/17/11 12:05:07)
Message:

Merge branch 'master' into new-db

Location:
asadb
Files:
21 added
8 edited

Legend:

Unmodified
Added
Removed
  • asadb/forms/admin.py

    rbb674c2 re1f5425  
    2222admin.site.register(forms.models.FYSM, FYSMAdmin)
    2323admin.site.register(forms.models.FYSMCategory, FYSMCategoryAdmin)
     24
     25class Admin_GroupConfirmationCycle(admin.ModelAdmin):
     26    list_display = (
     27        'pk',
     28        'name',
     29        'slug',
     30        'create_date',
     31    )
     32    list_display_links = ('pk', 'name', 'slug', )
     33    prepopulated_fields = {"slug": ("name",)}
     34admin.site.register(forms.models.GroupConfirmationCycle, Admin_GroupConfirmationCycle)
     35
     36class Admin_GroupMembershipUpdate(admin.ModelAdmin):
     37    list_display = (
     38        'pk',
     39        'group',
     40        'update_time',
     41        'updater_name',
     42        'updater_title',
     43        'num_undergrads',
     44        'num_grads',
     45        'num_alum',
     46        'num_other_affiliate',
     47        'num_other',
     48    )
     49    list_display_links = ('pk', 'group', )
     50    search_fields = ('group__name', 'group__abbreviation', 'updater_name', )
     51admin.site.register(forms.models.GroupMembershipUpdate, Admin_GroupMembershipUpdate)
     52
     53class Admin_PersonMembershipUpdate(admin.ModelAdmin):
     54    list_display = (
     55        'pk',
     56        'username',
     57        'cycle',
     58        'update_time',
     59        'deleted',
     60        'valid',
     61    )
     62    list_filter = ('valid', 'groups', )
     63    list_display_links = ('pk', 'username', 'cycle', )
     64admin.site.register(forms.models.PersonMembershipUpdate, Admin_PersonMembershipUpdate)
  • asadb/forms/models.py

    rbb674c2 rc297267  
    135135            preview.update_time = cls.never_updated
    136136            preview.save()
     137
     138
     139class GroupConfirmationCycle(models.Model):
     140    name = models.CharField(max_length=30)
     141    slug = models.SlugField()
     142    create_date = models.DateTimeField(default=datetime.datetime.now)
     143
     144    def __unicode__(self, ):
     145        return u"GroupConfirmationCycle %d: %s" % (self.id, self.name, )
     146
     147    @classmethod
     148    def latest(cls, ):
     149        return cls.objects.order_by('-create_date')[0]
     150
     151
     152class GroupMembershipUpdate(models.Model):
     153    update_time = models.DateTimeField(default=datetime.datetime.utcfromtimestamp(0))
     154    updater_name = models.CharField(max_length=30)
     155    updater_title = models.CharField(max_length=30, help_text="You need not hold any particular title in the group, but we like to know who is completing the form.")
     156   
     157    group = models.ForeignKey(groups.models.Group, help_text="If your group does not appear in the list above, then please email asa-exec@mit.edu.")
     158    group_email = models.EmailField(help_text="The text of the law will be automatically distributed to your members via this list, in order to comply with the law.")
     159    officer_email = models.EmailField()
     160
     161    membership_definition = models.TextField()
     162    num_undergrads = models.IntegerField()
     163    num_grads = models.IntegerField()
     164    num_alum = models.IntegerField()
     165    num_other_affiliate = models.IntegerField()
     166    num_other = models.IntegerField()
     167
     168    membership_list = models.TextField(help_text="Member emails on separate lines (Athena usernames where applicable)")
     169
     170    email_preface = models.TextField(blank=True, help_text="If you would like, you may add text here that will preface the text of the policies when it is sent out to the group membership list provided above.")
     171
     172    hazing_statement = "By checking this, I hereby affirm that I have read and understand Chapter 269: Sections 17, 18, and 19 of Massachusetts Law. I furthermore attest that I have provided the appropriate address or will otherwise distribute to group members, pledges, and/or applicants, copies of Massachusetts Law 269: 17, 18, 19 and that our organization, group, or team agrees to comply with the provisions of that law. (See below for text.)"
     173    no_hazing = models.BooleanField(help_text=hazing_statement)
     174
     175    discrimination_statement = "By checking this, I hereby affirm that I have read and understand the MIT Non-Discrimination Policy.  I furthermore attest that our organization, group, or team agrees to not discriminate against individuals on the basis of race, color, sex, sexual orientation, gender identity, religion, disability, age, genetic information, veteran status, ancestry, or national or ethnic origin."
     176    no_discrimination = models.BooleanField(help_text=discrimination_statement)
     177
     178    def __unicode__(self, ):
     179        return "GroupMembershipUpdate for %s" % (self.group, )
     180
     181
     182VALID_UNSET         = 0
     183VALID_AUTOVALIDATED = 10
     184VALID_OVERRIDDEN    = 20    # confirmed by an admin
     185VALID_AUTOREJECTED      = -10
     186VALID_HANDREJECTED      = -20
     187VALID_CHOICES = (
     188    (VALID_UNSET,           "unvalidated"),
     189    (VALID_AUTOVALIDATED,   "autovalidated"),
     190    (VALID_OVERRIDDEN,      "hand-validated"),
     191    (VALID_AUTOREJECTED,    "autorejected"),
     192    (VALID_HANDREJECTED,    "hand-rejected"),
     193)
     194
     195class PersonMembershipUpdate(models.Model):
     196    update_time = models.DateTimeField(default=datetime.datetime.utcfromtimestamp(0))
     197    username = models.CharField(max_length=30)
     198    cycle = models.ForeignKey(GroupConfirmationCycle)
     199    deleted = models.DateTimeField(default=None, null=True, blank=True, )
     200    valid = models.IntegerField(choices=VALID_CHOICES, default=VALID_UNSET)
     201    groups = models.ManyToManyField(groups.models.Group, help_text="By selecting a group here, you indicate that you are an active member of the group in question.<br>If your group does not appear in the list above, then please email asa-exec@mit.edu.<br>")
     202
     203    def __unicode__(self, ):
     204        return "PersonMembershipUpdate for %s" % (self.username, )
  • asadb/forms/views.py

    rd3167b9 rca21c49  
    11import forms.models
    22import groups.models
     3import groups.views
    34import settings
    45
    5 from django.contrib.auth.decorators import user_passes_test, login_required
    6 from django.views.generic import list_detail
     6from django.contrib.auth.decorators import user_passes_test, login_required, permission_required
     7from django.views.generic import list_detail, ListView, DetailView
    78from django.shortcuts import render_to_response, get_object_or_404
    89from django.template import RequestContext
    910from django.template import Context, Template
    1011from django.template.loader import get_template
    11 from django.http import Http404, HttpResponseRedirect
     12from django.http import Http404, HttpResponseRedirect, HttpResponse
    1213from django.core.urlresolvers import reverse
    1314from django.core.mail import EmailMessage, mail_admins
    1415from django.forms import Form
    1516from django.forms import ModelForm
    16 from django.forms import ModelChoiceField
    17 from django.db.models import Q
    18 
     17from django.forms import ModelChoiceField, ModelMultipleChoiceField
     18from django.db import connection
     19from django.db.models import Q, Count
     20
     21import csv
    1922import datetime
     23import StringIO
    2024
    2125#################
     
    220224    }
    221225    return render_to_response('fysm/thanks.html', context, context_instance=RequestContext(request), )
     226
     227#####################
     228# Membership update #
     229#####################
     230
     231class Form_GroupMembershipUpdate(ModelForm):
     232    group = ModelChoiceField(queryset=groups.models.Group.active_groups.all())
     233
     234    def __init__(self, *args, **kwargs):
     235        super(Form_GroupMembershipUpdate, self).__init__(*args, **kwargs)
     236        self.fields['no_hazing'].required = True
     237
     238    class Meta:
     239        model = forms.models.GroupMembershipUpdate
     240        fields = [
     241            'group',
     242            'updater_title',
     243            'group_email',
     244            'officer_email',
     245            'email_preface',
     246            'no_hazing',
     247            'no_discrimination',
     248            'membership_definition',
     249            'num_undergrads',
     250            'num_grads',
     251            'num_alum',
     252            'num_other_affiliate',
     253            'num_other',
     254            'membership_list',
     255        ]
     256
     257@login_required
     258def group_membership_update(request, ):
     259    year = datetime.date.today().year
     260
     261    initial = {
     262    }
     263    update_obj = forms.models.GroupMembershipUpdate()
     264    update_obj.update_time  = datetime.datetime.now()
     265    update_obj.updater_name = request.user.username
     266
     267    confirm_path = reverse('membership-confirm', )
     268    confirm_uri = '%s://%s%s' % (request.is_secure() and 'https' or 'http',
     269         request.get_host(), confirm_path)
     270
     271    if request.method == 'POST': # If the form has been submitted...
     272        form = Form_GroupMembershipUpdate(request.POST, request.FILES, instance=update_obj) # A form bound to the POST data
     273
     274        if form.is_valid(): # All validation rules pass
     275            request_obj = form.save()
     276            group_obj = request_obj.group
     277
     278
     279            # Send email
     280            tmpl = get_template('membership/anti-hazing.txt')
     281            ctx = Context({
     282                'update': request_obj,
     283                'group': group_obj,
     284                'submitter': request.user,
     285            })
     286            body = tmpl.render(ctx)
     287            email = EmailMessage(
     288                subject='Anti-Hazing and Non-Discrimination Acknowledgement for %s' % (
     289                    group_obj.name,
     290                ),
     291                body=body,
     292                from_email=request.user.email,
     293                to=[request_obj.group_email, ],
     294                cc=[request_obj.officer_email, ],
     295                bcc=['asa-db-outgoing@mit.edu', ],
     296            )
     297            email.send()
     298
     299            # Send email
     300            tmpl = get_template('membership/submit-confirm-email.txt')
     301            ctx = Context({
     302                'update': request_obj,
     303                'group': group_obj,
     304                'submitter': request.user,
     305                'confirm_uri': confirm_uri,
     306            })
     307            body = tmpl.render(ctx)
     308            email = EmailMessage(
     309                subject='ASA Membership Information for %s' % (
     310                    group_obj.name,
     311                ),
     312                body=body,
     313                from_email=request.user.email,
     314                to=[request_obj.officer_email, ],
     315                bcc=['asa-db-outgoing@mit.edu', ],
     316            )
     317            email.send()
     318
     319            return HttpResponseRedirect(reverse('membership-thanks', )) # Redirect after POST
     320
     321    else:
     322        form = Form_GroupMembershipUpdate(initial=initial, ) # An unbound form
     323
     324    context = {
     325        'form':form,
     326        'confirm_uri': confirm_uri,
     327        'pagename':'groups',
     328    }
     329    return render_to_response('membership/update.html', context, context_instance=RequestContext(request), )
     330
     331class Form_PersonMembershipUpdate(ModelForm):
     332    groups = ModelMultipleChoiceField(queryset=groups.models.Group.active_groups.all())
     333    class Meta:
     334        model = forms.models.PersonMembershipUpdate
     335        fields = [
     336            'groups',
     337        ]
     338
     339@login_required
     340def person_membership_update(request, ):
     341    year = datetime.date.today().year
     342
     343    initial = {
     344    }
     345    cycle = forms.models.GroupConfirmationCycle.latest()
     346    try:
     347        update_obj = forms.models.PersonMembershipUpdate.objects.get(
     348            username=request.user.username,
     349            deleted__isnull=True,
     350            cycle=cycle,
     351        )
     352        selected_groups = update_obj.groups.all()
     353        print "Got update"
     354    except forms.models.PersonMembershipUpdate.DoesNotExist:
     355        update_obj = forms.models.PersonMembershipUpdate()
     356        update_obj.update_time  = datetime.datetime.now()
     357        update_obj.username = request.user.username
     358        update_obj.cycle = cycle
     359        selected_groups = []
     360
     361    accounts = groups.models.AthenaMoiraAccount
     362    try:
     363        person = accounts.active_accounts.get(username=request.user.username)
     364        if person.is_student():
     365            update_obj.valid = forms.models.VALID_AUTOVALIDATED
     366        else:
     367            update_obj.valid = forms.models.VALID_AUTOREJECTED
     368    except accounts.DoesNotExist:
     369        pass
     370        update_obj.valid = forms.models.VALID_AUTOREJECTED
     371
     372    update_obj.save()
     373
     374    qs = groups.models.Group.active_groups
     375    filterset = groups.views.GroupFilter(request.GET, qs)
     376    filtered_groups = filterset.qs.all()
     377    show_filtered_groups = ('search' in request.GET)
     378
     379    message = ""
     380    message_type = "info"
     381
     382    if request.method == 'POST' and 'add-remove' in request.POST:
     383        group = groups.models.Group.objects.get(id=request.POST['group'])
     384        if request.POST['action'] == 'remove':
     385            if group in update_obj.groups.all():
     386                update_obj.groups.remove(group)
     387                message = "You have been successfully removed from %s." % (group, )
     388            else:
     389                message = "Sorry, but you're not in %s." % (group, )
     390                message_type = "warn"
     391        elif request.POST['action'] == 'add':
     392            if group in update_obj.groups.all():
     393                message = "Sorry, but you're already in %s." % (group, )
     394                message_type = "warn"
     395            else:
     396                update_obj.groups.add(group)
     397                message = "You have been successfully added to %s." % (group, )
     398        else:
     399            message = "Uh, somehow you tried to do something besides adding and removing..."
     400            message_type = "alert"
     401
     402    if request.method == 'POST' and 'list' in request.POST: # If the form has been submitted...
     403        form = Form_PersonMembershipUpdate(request.POST, request.FILES, instance=update_obj) # A form bound to the POST data
     404
     405        if form.is_valid(): # All validation rules pass
     406            request_obj = form.save()
     407            message = "Update saved"
     408
     409    else:
     410        form = Form_PersonMembershipUpdate(initial=initial, instance=update_obj, ) # An unbound form
     411
     412    context = {
     413        'form':form,
     414        'filter':filterset,
     415        'show_filtered_groups':show_filtered_groups,
     416        'filtered_groups':filtered_groups,
     417        'member_groups':selected_groups,
     418        'message': message,
     419        'message_type': message_type,
     420        'pagename':'groups',
     421    }
     422    return render_to_response('membership/confirm.html', context, context_instance=RequestContext(request), )
     423
     424
     425class View_GroupMembershipList(ListView):
     426    context_object_name = "group_list"
     427    template_name = "membership/submitted.html"
     428
     429    def get_queryset(self):
     430        group_updates = forms.models.GroupMembershipUpdate.objects.all()
     431        group_updates = group_updates.filter(
     432            group__personmembershipupdate__deleted__isnull=True,
     433            group__personmembershipupdate__valid__gt=0,
     434        )
     435        group_updates = group_updates.annotate(num_confirms=Count('group__personmembershipupdate'))
     436        #print len(list(group_updates))
     437        #for query in connection.queries: print query
     438        return group_updates
     439
     440
     441@permission_required('groups.view_group_private_info')
     442def group_confirmation_issues(request, ):
     443    active_groups = groups.models.Group.active_groups
     444    group_updates = forms.models.GroupMembershipUpdate.objects.all()
     445    people_confirmations = forms.models.PersonMembershipUpdate.objects.filter(
     446        deleted__isnull=True,
     447        valid__gt=0,
     448    )
     449
     450    buf = StringIO.StringIO()
     451    output = csv.writer(buf)
     452    output.writerow(['group_id', 'group_name', 'issue', 'num_confirm', 'officer_email', ])
     453
     454    q_present = Q(id__in=group_updates.values('group'))
     455    missing_groups = active_groups.filter(~q_present)
     456    #print len(list(group_updates))
     457    for group in missing_groups:
     458        num_confirms = len(people_confirmations.filter(groups=group))
     459        output.writerow([
     460            group.id,
     461            group.name,
     462            'unsubmitted',
     463            num_confirms,
     464            group.officer_email,
     465        ])
     466
     467    for group_update in group_updates:
     468        group = group_update.group
     469        num_confirms = len(people_confirmations.filter(groups=group))
     470        if num_confirms < 5:
     471            output.writerow([
     472                group.id,
     473                group.name,
     474                'confirmations',
     475                num_confirms,
     476                group.officer_email,
     477            ])
     478
     479
     480    return HttpResponse(buf.getvalue(), mimetype='text/plain', )
  • asadb/template/groups/groups_signatories.html

    rfbb362a rce7fd92  
    1616
    1717<h2>The Groups</h2>
    18 
    19 {% if changes %}
    20 <table class='pretty-table'>
    21 <tr>
    22     <th>Action</th>
    23     <th>Person</th>
    24     <th>Role</th>
    25 </tr>
    26 {% for verb, color, person, role in changes %}
    27     <tr><td style='background-color: {{color}}; color: black'>{{verb}}</td><td>{{person}}</td><td>{{role.display_name}}</td></tr>
    28 {% endfor %}
    29 </table>
    30 {% endif %}
    31 
    32 {%if edited %}
    33 <p>Untouched were {{kept}} filled people/role combinations and {{kept_not}} unfilled combinations.</p>
    34 {% endif %}
    3518
    3619<table class='pretty-table'>
  • asadb/urls.py

    rfbb362a r0b72bfd  
    2929    url(r'^fysm/(?:(\d+)/)?(?:([\w-]+)/)?$', forms.views.fysm_by_years, name='fysm', ),
    3030
     31    url(r'^membership/update/$', forms.views.group_membership_update, name='membership-update', ),
     32    url(r'^membership/confirm/$', forms.views.person_membership_update, name='membership-confirm', ),
     33    url(
     34        r'^membership/thanks/$',
     35        'django.views.generic.simple.direct_to_template',
     36        {'template': 'membership/thanks.html', 'extra_context': { 'pagename':'groups' }, },
     37        name='membership-thanks',
     38    ),
     39    url(r'^membership/submitted/$', forms.views.View_GroupMembershipList.as_view(), name='membership-submitted', ),
     40    url(r'^membership/admin/issues.csv$', forms.views.group_confirmation_issues, name='membership-issues', ),
     41
    3142    # Group list
    3243    (r'^groups/', include(groups.urls.urls(), ), ),
  • asadb/groups/urls.py

    rfbb362a rb04e142  
    1313    (r'^(?P<pk>\d+)/', include(group_patterns, ), ),
    1414    url(r'^$', groups.views.GroupListView.as_view(), name='list', ),
     15    url(r'^create/(?P<status>\w+)?$', groups.views.create_group, name='create', ),
    1516    url(r'^search/$', groups.views.search_groups, name='search', ),
    1617    url(r'^recent_changes/$', groups.views.GroupHistoryView.as_view(), name='manage-history', ),
  • asadb/groups/views.py

    rfbb362a rb04e142  
    1717from django.core.urlresolvers import reverse
    1818from django.core.mail import EmailMessage, mail_admins
    19 from django.forms import Form
    20 from django.forms import ModelForm
    21 from django.forms import ModelChoiceField
     19from django.forms import CharField, ModelChoiceField, MultipleChoiceField
     20from django.forms import Form, ModelForm
     21from django.forms import ValidationError
    2222from django.db import connection
    2323from django.db.models import Q
     
    2828
    2929from util.db_form_utils import StaticWidget
    30 
     30from util.emails import email_from_template
     31
     32
     33
     34############
     35# Homepage #
     36############
    3137
    3238def view_homepage(request, ):
     
    5662    }
    5763    return render_to_response('index.html', context, context_instance=RequestContext(request), )
     64
     65
     66
     67################
     68# Single group #
     69################
     70
     71class GroupDetailView(DetailView):
     72    context_object_name = "group"
     73    model = groups.models.Group
     74    def get_context_data(self, **kwargs):
     75        # Call the base implementation first to get a context
     76        context = super(GroupDetailView, self).get_context_data(**kwargs)
     77        group = context['group']
     78
     79        # Indicate whether this person should be able to see "private" info
     80        context['viewpriv'] = self.request.user.has_perm('groups.view_group_private_info', group)
     81        context['adminpriv'] = self.request.user.has_perm('groups.admin_group', group)
     82        context['notes'] = group.viewable_notes(self.request.user)
     83
     84        # People involved in the group
     85        just_roles = groups.models.OfficerRole.objects.all()
     86        if context['viewpriv'] or self.request.user.has_perm('groups.view_signatories'):
     87            # Can see the non-public stuff
     88            pass
     89        else:
     90            just_roles = just_roles.filter(publicly_visible=True)
     91        roles = []
     92        for role in just_roles:
     93            roles.append((role.display_name, role, group.officers(role=role), ))
     94        context['roles'] = roles
     95
     96        return context
    5897
    5998
     
    136175            request_obj.save()
    137176            form.save_m2m()
    138 
    139             # Send email
    140             #tmpl = get_template('fysm/update_email.txt')
    141             #ctx = Context({
    142             #    'group': group_obj,
    143             #    'fysm': fysm_obj,
    144             #    'view_uri': view_uri,
    145             #    'submitter': request.user,
    146             #    'request': request,
    147             #    'sender': "ASA FYSM team",
    148             #})
    149             #body = tmpl.render(ctx)
    150             #email = EmailMessage(
    151             #    subject='FYSM entry for "%s" updated by "%s"' % (
    152             #        group_obj.name,
    153             #        request.user,
    154             #    ),
    155             #    body=body,
    156             #    from_email='asa-fysm@mit.edu',
    157             #    to=[group_obj.officer_email, request.user.email, ],
    158             #    bcc=['asa-fysm-submissions@mit.edu', ]
    159             #)
    160             #email.send()
    161177            msg = "Thanks for editing!"
    162178        else:
     
    173189    return render_to_response('groups/group_change_main.html', context, context_instance=RequestContext(request), )
    174190
     191def validate_athena(username, student=False, ):
     192    try:
     193        person = groups.models.AthenaMoiraAccount.active_accounts.get(username=username)
     194        if student and not person.is_student():
     195            raise ValidationError('This must be a current student.')
     196    except groups.models.AthenaMoiraAccount.DoesNotExist:
     197        raise ValidationError('This must be a valid Athena username.')
     198
     199class GroupCreateForm(form_utils.forms.BetterModelForm):
     200    create_which = MultipleChoiceField(
     201        choices=[
     202            ('officer_email', 'officer list', ),
     203            ('group_email', 'group list', ),
     204            ('athena_locker', 'Athena locker', ),
     205        ],
     206    )
     207
     208    president = CharField(min_length=3, max_length=8, )
     209    treasurer = CharField(min_length=3, max_length=8, )
     210    def clean_president(self, ):
     211        username = self.cleaned_data['president']
     212        validate_athena(username, True, )
     213        return username
     214
     215    def clean_treasurer(self, ):
     216        username = self.cleaned_data['treasurer']
     217        validate_athena(username, True, )
     218        return username
     219
     220    class Meta:
     221        fieldsets = [
     222            ('basic', {
     223                'legend': 'Basic Information',
     224                'fields': ['name', 'abbreviation', 'activity_category', 'description', ],
     225            }),
     226            ('officers', {
     227                'legend': 'Officers',
     228                'fields': ['president', 'treasurer', ],
     229            }),
     230            ('technical', {
     231                'legend': 'Technical Information',
     232                'fields': ['officer_email', 'group_email', 'athena_locker', 'create_which', ],
     233            }),
     234            ('Category', {
     235                'legend': 'Category',
     236                'fields': ['group_status', 'group_class', ],
     237            }),
     238            ('financial', {
     239                'legend': 'Financial Information',
     240                'fields': ['group_funding', 'main_account_id', 'funding_account_id', ],
     241            }),
     242            ('more-info', {
     243                'legend': 'Additional Information',
     244                'fields': ['constitution_url', ],
     245            }),
     246        ]
     247        model = groups.models.Group
     248
     249
     250@permission_required('groups.add_group')
     251def create_group(request, status=None,):
     252    if not status: status = 'active'
     253    groupstatus = get_object_or_404(groups.models.GroupStatus, slug=status)
     254   
     255    msg = None
     256
     257    initial = {
     258        'create_which': ['officer_email', 'group_email', 'athena_locker', ],
     259    }
     260    group = groups.models.Group()
     261    group.group_status = groupstatus
     262    group.recognition_date  = datetime.datetime.now()
     263    if request.method == 'POST': # If the form has been submitted...
     264        # A form bound to the POST data
     265        form = GroupCreateForm(
     266            request.POST, request.FILES,
     267            initial=initial,
     268            instance=group,
     269        )
     270
     271        if form.is_valid(): # All validation rules pass
     272            # Basic setup
     273            group.set_updater(request.user)
     274            form.save()
     275
     276            # Officers
     277            groups.models.OfficeHolder(
     278                person=form.cleaned_data['president'],
     279                role=groups.models.OfficerRole.objects.get(slug='president'),
     280                group=group,
     281            ).save()
     282            groups.models.OfficeHolder(
     283                person=form.cleaned_data['treasurer'],
     284                role=groups.models.OfficerRole.objects.get(slug='treasurer'),
     285                group=group,
     286            ).save()
     287            officer_emails = [
     288                '%s@mit.edu' % (form.cleaned_data['president'], ),
     289                '%s@mit.edu' % (form.cleaned_data['treasurer'], ),
     290            ]
     291
     292            # Sending mail
     293            mail_context = Context({
     294                'group': group,
     295                'formdata': form.cleaned_data,
     296            })
     297
     298            # Welcome mail
     299            email_from_template(
     300                tmpl='groups/diffs/new-group-announce.txt',
     301                context=mail_context,
     302                subject='ASA Group Recognition: %s' % (group.name, ),
     303                to=officer_emails,
     304                cc=['asa-new-group-announce@mit.edu'],
     305                from_email='asa-exec@mit.edu',
     306            ).send()
     307            if len(form.cleaned_data['create_which']) > 0:
     308                email_from_template(
     309                    tmpl='groups/diffs/new-group-accounts.txt',
     310                    context=mail_context,
     311                    subject='New Student Activity: %s' % (group.name, ),
     312                    to=['accounts@mit.edu'],
     313                    cc=officer_emails+['asa-admin@mit.edu'],
     314                    from_email='asa-admin@mit.edu',
     315                ).send()
     316
     317
     318            return redirect(reverse('groups:group-detail', args=[group.pk]))
     319        else:
     320            msg = "Validation failed. See below for details."
     321
     322    else:
     323        form = GroupCreateForm(initial=initial, instance=group, ) # An unbound form
     324
     325    context = {
     326        'form':  form,
     327        'msg':   msg,
     328        'pagename':   'groups',
     329    }
     330    return render_to_response('groups/group_create.html', context, context_instance=RequestContext(request), )
     331
     332##################
     333# Multiple group #
     334##################
    175335
    176336class GroupFilter(django_filters.FilterSet):
     
    208368        context['pagename'] = 'groups'
    209369        context['filter'] = self.filterset
    210         return context
    211 
    212 
    213 class GroupDetailView(DetailView):
    214     context_object_name = "group"
    215     model = groups.models.Group
    216     def get_context_data(self, **kwargs):
    217         # Call the base implementation first to get a context
    218         context = super(GroupDetailView, self).get_context_data(**kwargs)
    219         group = context['group']
    220 
    221         # Indicate whether this person should be able to see "private" info
    222         context['viewpriv'] = self.request.user.has_perm('groups.view_group_private_info', group)
    223         context['adminpriv'] = self.request.user.has_perm('groups.admin_group', group)
    224         context['notes'] = group.viewable_notes(self.request.user)
    225 
    226         # People involved in the group
    227         just_roles = groups.models.OfficerRole.objects.all()
    228         if context['viewpriv'] or self.request.user.has_perm('groups.view_signatories'):
    229             # Can see the non-public stuff
    230             pass
    231         else:
    232             just_roles = just_roles.filter(publicly_visible=True)
    233         roles = []
    234         for role in just_roles:
    235             roles.append((role.display_name, role, group.officers(role=role), ))
    236         context['roles'] = roles
    237 
    238         return context
    239 
    240 
    241 class GroupHistoryView(ListView):
    242     context_object_name = "version_list"
    243     template_name = "groups/group_version.html"
    244 
    245     def get_queryset(self):
    246         history_entries = None
    247         if 'pk' in self.kwargs:
    248             group = get_object_or_404(groups.models.Group, pk=self.kwargs['pk'])
    249             history_entries = reversion.models.Version.objects.get_for_object(group)
    250         else:
    251             history_entries = reversion.models.Version.objects.all()
    252             group_content_type = ContentType.objects.get_for_model(groups.models.Group)
    253             history_entries = history_entries.filter(content_type=group_content_type)
    254         length = len(history_entries)
    255         if length > 150:
    256             history_entries = history_entries[length-100:]
    257         return history_entries
    258 
    259     def get_context_data(self, **kwargs):
    260         context = super(GroupHistoryView, self).get_context_data(**kwargs)
    261         if 'pk' in self.kwargs:
    262             group = get_object_or_404(groups.models.Group, pk=self.kwargs['pk'])
    263             context['title'] = "History for %s" % (group.name, )
    264         else:
    265             context['title'] = "Recent Changes"
    266370        return context
    267371
     
    439543        }
    440544        return render_to_response('groups/group_search.html', context, context_instance=RequestContext(request), )
     545
     546
     547class GroupHistoryView(ListView):
     548    context_object_name = "version_list"
     549    template_name = "groups/group_version.html"
     550
     551    def get_queryset(self):
     552        history_entries = None
     553        if 'pk' in self.kwargs:
     554            group = get_object_or_404(groups.models.Group, pk=self.kwargs['pk'])
     555            history_entries = reversion.models.Version.objects.get_for_object(group)
     556        else:
     557            history_entries = reversion.models.Version.objects.all()
     558            group_content_type = ContentType.objects.get_for_model(groups.models.Group)
     559            history_entries = history_entries.filter(content_type=group_content_type)
     560        length = len(history_entries)
     561        if length > 150:
     562            history_entries = history_entries[length-100:]
     563        return history_entries
     564
     565    def get_context_data(self, **kwargs):
     566        context = super(GroupHistoryView, self).get_context_data(**kwargs)
     567        if 'pk' in self.kwargs:
     568            group = get_object_or_404(groups.models.Group, pk=self.kwargs['pk'])
     569            context['title'] = "History for %s" % (group.name, )
     570        else:
     571            context['title'] = "Recent Changes"
     572        return context
  • asadb/media/style/style.css

    rf0a4fc4 r754d5a4  
    236236    text-align: center;
    237237}
     238
     239/*********
     240 * FORMS *
     241 *********/
     242
     243form table tr.optional th
     244{
     245    font-weight: normal;
     246    font-style: italic;
     247}
Note: See TracChangeset for help on using the changeset viewer.