Changeset bda4d86


Ignore:
Timestamp:
Nov 4, 2012, 2:45:54 AM (14 years ago)
Author:
Alex Dehnert <adehnert@…>
Branches:
master, space-access, stable, stage
Children:
72a3d90
Parents:
ef00d33
git-author:
Alex Dehnert <adehnert@…> (11/04/12 01:13:13)
git-committer:
Alex Dehnert <adehnert@…> (11/04/12 02:45:54)
Message:

Finish support for group membership update cycles

The revised workflow is that you visit a group selection page, and select a
group to update. That checks authz (ASA-#169) and then loads any old update in
the appropriate cycle (ASA-#27).

Location:
asadb
Files:
1 added
8 edited

Legend:

Unmodified
Added
Removed
  • asadb/forms/admin.py

    r0229bd5 rbda4d86  
    3838        'pk',
    3939        'group',
     40        'cycle',
    4041        'update_time',
    4142        'updater_name',
     
    4748        'num_other',
    4849    )
     50    list_filter = ('cycle', )
    4951    list_display_links = ('pk', 'group', )
    5052    search_fields = ('group__name', 'group__abbreviation', 'updater_name', )
  • asadb/forms/models.py

    r8eca9da rbda4d86  
    155155    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.")
    156156   
     157    cycle = models.ForeignKey(GroupConfirmationCycle)
    157158    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.", db_index=True, )
    158159    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.")
  • asadb/forms/views.py

    ref00d33 rbda4d86  
    66
    77from django.contrib.auth.decorators import user_passes_test, login_required, permission_required
     8from django.core.exceptions import PermissionDenied
    89from django.views.generic import list_detail, ListView, DetailView
    910from django.shortcuts import render_to_response, get_object_or_404
     
    4041            self.fields["group"].queryset = queryset
    4142
    42 def select_group(request, url_name_after, pagename='homepage', queryset=None, ):
     43def select_group(request, url_name_after, url_args=[], pagename='homepage', queryset=None, title="", msg=""):
    4344    if request.method == 'POST': # If the form has been submitted...
    4445        # A form bound to the POST data
     
    4647        if form.is_valid(): # All validation rules pass
    4748            group = form.cleaned_data['group'].id
    48             return HttpResponseRedirect(reverse(url_name_after, args=[group],)) # Redirect after POST
     49            return HttpResponseRedirect(reverse(url_name_after, args=url_args+[group],)) # Redirect after POST
    4950    else:
    5051        form = SelectGroupForm(queryset=queryset, ) # An unbound form
    5152
     53    if not title: title = "Select group"
    5254    context = {
    5355        'form':form,
     56        'title':title,
     57        'msg':msg,
    5458        'pagename':pagename,
    5559    }
     
    243247membership_update_qs = groups.models.Group.objects.filter(group_status__slug__in=['active', 'suspended', ])
    244248
     249@login_required
     250def group_membership_update_select_group(request, ):
     251    cycle = forms.models.GroupConfirmationCycle.latest()
     252
     253    users_groups = groups.models.Group.involved_groups(request.user.username)
     254    qs = membership_update_qs.filter(pk__in=users_groups)
     255
     256    return select_group(request=request,
     257        url_name_after='membership-update-group',
     258        url_args=[cycle.slug],
     259        pagename='groups',
     260        queryset=qs,
     261        title="Submit membership update for...",
     262        msg="The list below contains only groups that list you as being involved. You must be an administrator of a group to submit an update.",
     263    )
     264
    245265class Form_GroupMembershipUpdate(ModelForm):
    246     group = ModelChoiceField(queryset=membership_update_qs)
    247 
    248266    def __init__(self, *args, **kwargs):
    249267        super(Form_GroupMembershipUpdate, self).__init__(*args, **kwargs)
     
    253271        model = forms.models.GroupMembershipUpdate
    254272        fields = [
    255             'group',
    256273            'updater_title',
    257274            'group_email',
     
    270287
    271288@login_required
    272 def group_membership_update(request, ):
    273     initial = {
    274     }
    275     update_obj = forms.models.GroupMembershipUpdate()
    276     update_obj.update_time  = datetime.datetime.now()
    277     update_obj.updater_name = request.user.username
     289def group_membership_update(request, cycle_slug, pk, ):
     290    cycle = get_object_or_404(forms.models.GroupConfirmationCycle, slug=cycle_slug)
     291    group_obj = get_object_or_404(groups.models.Group, pk=pk)
     292    if not request.user.has_perm('groups.admin_group', group_obj):
     293        raise PermissionDenied
     294
     295    try:
     296        update_obj = forms.models.GroupMembershipUpdate.objects.get(group=group_obj, cycle=cycle, )
     297    except forms.models.GroupMembershipUpdate.DoesNotExist:
     298        update_obj = None
    278299
    279300    confirm_path = reverse('membership-confirm', )
     
    281302         request.get_host(), confirm_path)
    282303
    283     if request.method == 'POST': # If the form has been submitted...
     304    if request.method == 'POST':
    284305        form = Form_GroupMembershipUpdate(request.POST, request.FILES, instance=update_obj) # A form bound to the POST data
    285306
    286307        if form.is_valid(): # All validation rules pass
     308            # Update the updater info
     309            form.instance.group = group_obj
     310            form.instance.cycle = cycle
     311            form.instance.update_time  = datetime.datetime.now()
     312            form.instance.updater_name = request.user.username
    287313            request_obj = form.save()
    288             group_obj = request_obj.group
    289 
    290314
    291315            # Send email
     
    332356
    333357    else:
    334         form = Form_GroupMembershipUpdate(initial=initial, ) # An unbound form
     358        form = Form_GroupMembershipUpdate(instance=update_obj)
    335359
    336360    context = {
    337361        'form':form,
     362        'group':group_obj,
    338363        'confirm_uri': confirm_uri,
    339364        'pagename':'groups',
     
    457482
    458483    def get_queryset(self):
     484        cycle = forms.models.GroupConfirmationCycle.latest()
    459485        group_updates = forms.models.GroupMembershipUpdate.objects.all()
    460486        group_updates = group_updates.filter(
     487            cycle=cycle,
     488            group__personmembershipupdate__cycle=cycle,
    461489            group__personmembershipupdate__deleted__isnull=True,
    462490            group__personmembershipupdate__valid__gt=0,
  • asadb/groups/models.py

    r54babcd rbda4d86  
    105105    def __str__(self, ):
    106106        return self.name
     107
     108    @staticmethod
     109    def involved_groups(username):
     110        current_officers = OfficeHolder.current_holders.filter(person=username)
     111        users_groups = Group.objects.filter(officeholder__in=current_officers).distinct()
     112        return users_groups
    107113
    108114    @classmethod
  • asadb/template/forms/select.html

    rc9d8369 rbda4d86  
    44{% block content %}
    55
    6 <h2>Select Group</h2>
     6<h2>{{title}}</h2>
     7
     8{% if msg %}<p>{{msg}}</p>{%endif%}
    79
    810<form method="post" action="">
  • asadb/template/index.html

    r826a126 rbda4d86  
    4444    </ul></li>
    4545    <li>Membership updates<ul>
    46         <li><a href='{%url membership-update%}'>Group update</a></li>
     46        <li><a href='{%url membership-update-cycle %}'>Group update</a></li>
    4747        <li><a href='{%url membership-confirm%}'>Individual confirmations</a></li>
    4848        <li><a href='{%url membership-submitted%}'>Groups with submitted updates</a></li>
  • asadb/template/membership/update.html

    rf48884a rbda4d86  
    5757{% csrf_token %}
    5858<table class='pretty-table'>
     59<tr>
     60    <th>Group</th>
     61    <td>{{group}}</td>
     62</tr>
    5963{{ form.as_table }}
    6064<tr><th colspan='2'><input type='submit' value='Submit membership update' /></th></tr>
  • asadb/urls.py

    r2c86ed1 rbda4d86  
    4646    url(r'^fysm/(?:(\d+)/)?(?:([\w-]+)/)?$', forms.views.fysm_by_years, name='fysm', ),
    4747
    48     url(r'^membership/update/$', forms.views.group_membership_update, name='membership-update', ),
     48    url(
     49        regex=r'^membership/update/$',
     50        view=forms.views.group_membership_update_select_group,
     51        name='membership-update-cycle',
     52    ),
     53    url(r'^membership/update/(?P<cycle_slug>[\w-]+)/(?P<pk>\d+)/$', forms.views.group_membership_update, name='membership-update-group', ),
    4954    url(r'^membership/confirm/$', forms.views.person_membership_update, name='membership-confirm', ),
    5055    url(
Note: See TracChangeset for help on using the changeset viewer.