Changeset ee679c6 for asadb/groups


Ignore:
Timestamp:
Aug 1, 2011, 5:48:34 AM (14 years ago)
Author:
Alex Dehnert <adehnert@…>
Branches:
master, space-access, stable, stage, test-hooks
Children:
7db8f3b
Parents:
1d85006
git-author:
Alex Dehnert <adehnert@…> (08/01/11 05:48:34)
git-committer:
Alex Dehnert <adehnert@…> (08/01/11 05:48:34)
Message:

Add support for officer editing

Location:
asadb/groups
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • asadb/groups/models.py

    r1d85006 ree679c6  
    7171
    7272class OfficeHolder(models.Model):
     73    EXPIRE_OFFSET = datetime.timedelta(seconds=1)
     74
    7375    person = models.CharField(max_length=30)
    7476    role = models.ForeignKey('OfficerRole')
     
    7678    start_time = models.DateTimeField(default=datetime.datetime.now)
    7779    end_time = models.DateTimeField(default=datetime.datetime.max)
     80
     81    def expire(self, ):
     82        self.end_time = datetime.datetime.now()-self.EXPIRE_OFFSET
     83        self.save()
    7884
    7985    def __str__(self, ):
  • asadb/groups/views.py

    r5b68039 ree679c6  
    131131            context['title'] = "Recent Changes"
    132132        return context
     133
     134
     135def load_officers(group, ):
     136    officers = group.officers()
     137    people = list(set([ officer.person for officer in officers ]))
     138    roles  = groups.models.OfficerRole.objects.all()
     139
     140    officers_map = {}
     141    for officer in officers:
     142        officers_map[(officer.person, officer.role)] = officer
     143
     144    return people, roles, officers_map
     145
     146def manage_officers(request, group_id, ):
     147    group = get_object_or_404(groups.models.Group, pk=group_id)
     148
     149    if not request.user.has_perm('groups.change_group', group):
     150        raise PermissionDenied
     151
     152    max_new = 4
     153
     154    people, roles, officers_map = load_officers(group)
     155
     156    msgs = []
     157    changes = []
     158    edited = False
     159    kept = 0
     160    kept_not = 0
     161    if request.method == 'POST': # If the form has been submitted
     162        edited = True
     163
     164        new_people = {}
     165        for i in range(max_new):
     166            key = "extra.%d" % (i, )
     167            if key in request.POST:
     168                # TODO: validate as real usernames
     169                new_people[i] = request.POST[key]
     170        for role in roles:
     171            key = "holders.%s" % (role.slug, )
     172            new_holders = set()
     173            if key in request.POST:
     174                new_holders = set(request.POST.getlist(key, ))
     175            if len(new_holders) > role.max_count:
     176                msgs.append("You selected %d people for %s; only %d are allowed. No changes to %s have been carried out in this update." %
     177                    (len(new_holders), role.display_name, role.max_count, role.display_name, )
     178                )
     179            else:
     180                for person in people:
     181                    if person in new_holders:
     182                        # TODO: validate student status of appropriate officers
     183                        if (person, role) in officers_map:
     184                            #changes.append(("Kept", "yellow", person, role))
     185                            kept += 1
     186                        else:
     187                            holder = groups.models.OfficeHolder(person=person, role=role, group=group,)
     188                            holder.save()
     189                            changes.append(("Added", "green", person, role))
     190                    else:
     191                        if (person, role) in officers_map:
     192                            officers_map[(person, role)].expire()
     193                            changes.append(("Removed", "red", person, role))
     194                        else:
     195                            kept_not += 1
     196                            pass
     197                for i in range(max_new):
     198                    if "extra.%d" % (i, ) in new_holders:
     199                        if i in new_people:
     200                            person = new_people[i]
     201                            holder = groups.models.OfficeHolder(person=person, role=role, group=group,)
     202                            holder.save()
     203                            changes.append(("Added", "green", person, role))
     204
     205        # reload the data
     206        people, roles, officers_map = load_officers(group)
     207
     208    officers_data = []
     209    for person in people:
     210        role_list = []
     211        for role in roles:
     212            if (person, role) in officers_map:
     213                role_list.append((role, True))
     214            else:
     215                role_list.append((role, False))
     216        officers_data.append((False, person, role_list))
     217    null_role_list = [(role, False) for role in roles]
     218    for i in range(max_new):
     219        officers_data.append((True, "extra.%d" % (i, ), null_role_list))
     220
     221    context = {
     222        'group': group,
     223        'roles': roles,
     224        'people': people,
     225        'officers': officers_data,
     226        'edited': edited,
     227        'changes':   changes,
     228        'kept': kept,
     229        'kept_not': kept_not,
     230        'msgs': msgs,
     231    }
     232    return render_to_response('groups/group_change_officers.html', context, context_instance=RequestContext(request), )
Note: See TracChangeset for help on using the changeset viewer.