Changeset 6fc0921


Ignore:
Timestamp:
Nov 17, 2011, 5:28:01 PM (14 years ago)
Author:
Alex Dehnert <adehnert@…>
Branches:
master, space-access, stable, stage, test-hooks
Children:
283099c
Parents:
728cafa (diff), 29a7eca (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@…> (11/17/11 17:28:01)
git-committer:
Alex Dehnert <adehnert@…> (11/17/11 17:28:01)
Message:

Merge branch 'new-db'

Files:
27 added
13 edited

Legend:

Unmodified
Added
Removed
  • asadb/groups/admin.py

    r3107c52 rac93a0c  
    2727admin.site.register(groups.models.Group, GroupAdmin)
    2828
     29
     30class Admin_GroupStartup(VersionAdmin):
     31    list_display = (
     32        'id',
     33        'group',
     34        'stage',
     35        'submitter',
     36        'president_kerberos',
     37        'create_officer_list',
     38        'create_group_list',
     39        'create_athena_locker',
     40    )
     41    list_display_links = ('id', 'group', )
     42    search_fields = [ 'group__name', 'group__abbreviation', 'submitter', 'president_kerberos', ]
     43admin.site.register(groups.models.GroupStartup, Admin_GroupStartup)
    2944
    3045class Admin_GroupNote(VersionAdmin):
  • asadb/groups/models.py

    r3275ab1 rfd6ed57  
    9696            ('admin_group', 'Administer basic group information'),
    9797            ('view_signatories', 'View signatory information for all groups'),
    98         )
     98            ('recognize_nge', 'Recognize Non-Group Entity'),
     99            ('recognize_group', 'Recognize groups'),
     100        )
     101
     102
     103GROUP_STARTUP_STAGE_SUBMITTED = 10
     104GROUP_STARTUP_STAGE_APPROVED = 20
     105GROUP_STARTUP_STAGE_REJECTED = -10
     106GROUP_STARTUP_STAGE = (
     107    (GROUP_STARTUP_STAGE_SUBMITTED,     'submitted'),
     108    (GROUP_STARTUP_STAGE_APPROVED,      'approved'),
     109    (GROUP_STARTUP_STAGE_REJECTED,      'rejected'),
     110)
     111
     112class GroupStartup(models.Model):
     113    group = models.ForeignKey(Group)
     114    stage = models.IntegerField(choices=GROUP_STARTUP_STAGE)
     115    submitter = models.CharField(max_length=30, editable=False, )
     116    create_officer_list = models.BooleanField()
     117    create_group_list = models.BooleanField()
     118    create_athena_locker = models.BooleanField()
     119    president_name = models.CharField(max_length=50)
     120    president_kerberos = models.CharField(max_length=8)
     121    treasurer_name = models.CharField(max_length=50)
     122    treasurer_kerberos = models.CharField(max_length=8)
    99123
    100124
  • asadb/groups/urls.py

    rfbb362a raa2aa58  
    1313    (r'^(?P<pk>\d+)/', include(group_patterns, ), ),
    1414    url(r'^$', groups.views.GroupListView.as_view(), name='list', ),
     15    url(r'^startup/$', groups.views.startup_form, name='startup', ),
     16    url(r'^startup/review/$', groups.views.GroupStartupListView.as_view(), name='startup-list', ),
     17    url(r'^startup/review/(?P<pk>\d+)$', groups.views.recognize_normal_group, name='startup-recognize', ),
     18    url(r'^recognize/nge/$', groups.views.recognize_nge, name='recognize-nge', ),
    1519    url(r'^search/$', groups.views.search_groups, name='search', ),
    1620    url(r'^recent_changes/$', groups.views.GroupHistoryView.as_view(), name='manage-history', ),
    1721    url(r'^signatories/$', groups.views.view_signatories, name='signatories', ),
     22    url(r'^account_lookup/$', groups.views.account_lookup, name='account-lookup', ),
    1823)
    1924
  • asadb/groups/views.py

    rfbb362a rfd6ed57  
    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 import forms
     20from django.forms import ValidationError
    2221from django.db import connection
    2322from django.db.models import Q
     
    2827
    2928from util.db_form_utils import StaticWidget
    30 
     29from util.emails import email_from_template
     30
     31
     32
     33############
     34# Homepage #
     35############
    3136
    3237def view_homepage(request, ):
     
    5661    }
    5762    return render_to_response('index.html', context, context_instance=RequestContext(request), )
     63
     64
     65
     66################
     67# Single group #
     68################
     69
     70class GroupDetailView(DetailView):
     71    context_object_name = "group"
     72    model = groups.models.Group
     73    def get_context_data(self, **kwargs):
     74        # Call the base implementation first to get a context
     75        context = super(GroupDetailView, self).get_context_data(**kwargs)
     76        group = context['group']
     77
     78        # Indicate whether this person should be able to see "private" info
     79        context['viewpriv'] = self.request.user.has_perm('groups.view_group_private_info', group)
     80        context['adminpriv'] = self.request.user.has_perm('groups.admin_group', group)
     81        context['notes'] = group.viewable_notes(self.request.user)
     82
     83        # People involved in the group
     84        just_roles = groups.models.OfficerRole.objects.all()
     85        if context['viewpriv'] or self.request.user.has_perm('groups.view_signatories'):
     86            # Can see the non-public stuff
     87            pass
     88        else:
     89            just_roles = just_roles.filter(publicly_visible=True)
     90        roles = []
     91        for role in just_roles:
     92            roles.append((role.display_name, role, group.officers(role=role), ))
     93        context['roles'] = roles
     94
     95        return context
    5896
    5997
     
    136174            request_obj.save()
    137175            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()
    161176            msg = "Thanks for editing!"
    162177        else:
     
    173188    return render_to_response('groups/group_change_main.html', context, context_instance=RequestContext(request), )
    174189
     190
     191##################
     192# GROUP CREATION #
     193##################
     194
     195def validate_athena(username, student=False, ):
     196    try:
     197        person = groups.models.AthenaMoiraAccount.active_accounts.get(username=username)
     198        if student and not person.is_student():
     199            raise ValidationError('This must be a current student.')
     200    except groups.models.AthenaMoiraAccount.DoesNotExist:
     201        raise ValidationError('This must be a valid Athena username.')
     202
     203
     204class GroupCreateForm(form_utils.forms.BetterModelForm):
     205    create_officer_list = forms.BooleanField(required=False)
     206    create_group_list = forms.BooleanField(required=False)
     207    create_athena_locker = forms.BooleanField(required=False)
     208
     209    president_name = forms.CharField(max_length=50, )
     210    president_kerberos = forms.CharField(min_length=3, max_length=8, )
     211    treasurer_name = forms.CharField(max_length=50)
     212    treasurer_kerberos = forms.CharField(min_length=3, max_length=8, )
     213    def clean_president(self, ):
     214        username = self.cleaned_data['president_kerberos']
     215        validate_athena(username, True, )
     216        return username
     217
     218    def clean_treasurer(self, ):
     219        username = self.cleaned_data['treasurer_kerberos']
     220        validate_athena(username, True, )
     221        return username
     222
     223    class Meta:
     224        fieldsets = [
     225            ('basic', {
     226                'legend': 'Basic Information',
     227                'fields': ['name', 'abbreviation', 'description', ],
     228            }),
     229            ('officers', {
     230                'legend': 'Officers',
     231                'fields': ['president_name', 'president_kerberos', 'treasurer_name', 'treasurer_kerberos', ],
     232            }),
     233            ('type', {
     234                'legend': 'Type',
     235                'fields': ['activity_category', 'group_class', 'group_funding', ],
     236            }),
     237            ('technical', {
     238                'legend': 'Technical Information',
     239                'fields': [
     240                    'officer_email', 'create_officer_list',
     241                    'group_email', 'create_group_list',
     242                    'athena_locker', 'create_athena_locker',
     243                ],
     244            }),
     245            ('financial', {
     246                'legend': 'Financial Information',
     247                'fields': ['main_account_id', 'funding_account_id', ],
     248            }),
     249            ('constitution', {
     250                'legend': 'Constitution',
     251                'fields': ['constitution_url', ],
     252            }),
     253        ]
     254        model = groups.models.Group
     255
     256
     257class GroupCreateNgeForm(GroupCreateForm):
     258    def __init__(self, *args, **kwargs):
     259        super(GroupCreateNgeForm, self).__init__(*args, **kwargs)
     260        self.fields['treasurer_name'].required = False
     261        self.fields['treasurer_kerberos'].required = False
     262
     263
     264class GroupCreateStartupForm(GroupCreateForm):
     265    def __init__(self, *args, **kwargs):
     266        super(GroupCreateStartupForm, self).__init__(*args, **kwargs)
     267        self.fields['activity_category'].required = True
     268        self.fields['constitution_url'].required = True
     269        self.fields['constitution_url'].help_text = "Please put a copy of your finalized constitution on a publicly-accessible website (e.g. your group's, or your own, Public folder), and link to it in the box above."
     270
     271    class Meta(GroupCreateForm.Meta):
     272        fieldsets = filter(
     273            lambda fieldset: fieldset[0] not in ['financial', ],
     274            GroupCreateForm.Meta.fieldsets
     275        )
     276
     277def create_group_get_emails(group, group_startup, officer_emails, ):
     278    # Figure out all the accounts mail parameters
     279    accounts_count = 0
     280    create_officer_list = False
     281    if group_startup.create_officer_list and group.officer_email:
     282        create_officer_list = True
     283        accounts_count += 1
     284    create_group_list = False
     285    if group_startup.create_group_list and group.group_email:
     286        create_group_list = True
     287        accounts_count += 1
     288    create_athena_locker = False
     289    if group_startup.create_athena_locker and group.athena_locker:
     290        create_athena_locker = True
     291        accounts_count += 1
     292    officer_list, _, officer_domain = group.officer_email.partition('@')
     293    group_list, _, group_domain = group.group_email.partition('@')
     294
     295    # Fill out the Context
     296    mail_context = Context({
     297        'group': group,
     298        'group_startup': group_startup,
     299        'create_officer_list': create_officer_list,
     300        'create_group_list': create_group_list,
     301        'create_athena_locker': create_athena_locker,
     302        'officer_list': officer_list,
     303        'group_list': group_list,
     304        'officer_emails': officer_emails,
     305    })
     306
     307    # Welcome mail
     308    welcome_mail = email_from_template(
     309        tmpl='groups/diffs/new-group-announce.txt',
     310        context=mail_context,
     311        subject='ASA Group Recognition: %s' % (group.name, ),
     312        to=officer_emails,
     313        cc=['asa-new-group-announce@mit.edu'],
     314        from_email='asa-exec@mit.edu',
     315    )
     316
     317    # Accounts mail
     318    if accounts_count > 0:
     319        accounts_mail = email_from_template(
     320            tmpl='groups/diffs/new-group-accounts.txt',
     321            context=mail_context,
     322            subject='New Student Activity: %s' % (group.name, ),
     323            to=['accounts@mit.edu'],
     324            cc=officer_emails+['asa-admin@mit.edu'],
     325            from_email='asa-admin@mit.edu',
     326        )
     327        # XXX: Handle this better
     328        if officer_domain != 'mit.edu' or (create_group_list and group_domain != 'mit.edu'):
     329            accounts_mail.to = ['asa-groups@mit.edu']
     330            accounts_mail.cc = ['asa-db@mit.edu']
     331            accounts_mail.subject = "ERROR: " + accounts_mail.subject
     332            accounts_mail.body = "Bad domain on officer or group list\n\n" + accounts_mail.body
     333
     334    else:
     335        accounts_mail = None
     336    return welcome_mail, accounts_mail
     337
     338def create_group_officers(group, formdata, save=True, ):
     339    officer_emails = [ ]
     340    for officer in ('president', 'treasurer', ):
     341        username = formdata[officer+'_kerberos']
     342        if username:
     343            if save: groups.models.OfficeHolder(
     344                person=username,
     345                role=groups.models.OfficerRole.objects.get(slug=officer),
     346                group=group,
     347            ).save()
     348            officer_emails.append('%s@mit.edu' % (formdata[officer+'_kerberos'], ))
     349    return officer_emails
     350
     351@permission_required('groups.recognize_nge')
     352def recognize_nge(request, ):
     353    msg = None
     354
     355    initial = {
     356        'create_officer_list': False,
     357        'create_group_list': False,
     358        'create_athena_locker': True,
     359    }
     360    group = groups.models.Group()
     361    group.group_status = groups.models.GroupStatus.objects.get(slug='nge', )
     362    group.recognition_date  = datetime.datetime.now()
     363    if request.method == 'POST': # If the form has been submitted...
     364        # A form bound to the POST data
     365        form = GroupCreateNgeForm(
     366            request.POST, request.FILES,
     367            initial=initial,
     368            instance=group,
     369        )
     370
     371        if form.is_valid(): # All validation rules pass
     372            group.set_updater(request.user)
     373            form.save()
     374            officer_emails = create_group_officers(group, form.cleaned_data, )
     375
     376            return redirect(reverse('groups:group-detail', args=[group.pk]))
     377        else:
     378            msg = "Validation failed. See below for details."
     379
     380    else:
     381        form = GroupCreateNgeForm(initial=initial, instance=group, ) # An unbound form
     382
     383    context = {
     384        'form':  form,
     385        'msg':   msg,
     386        'pagename':   'groups',
     387    }
     388    return render_to_response('groups/create/nge.html', context, context_instance=RequestContext(request), )
     389
     390def startup_form(request, ):
     391    msg = None
     392
     393    initial = {
     394        'create_officer_list': True,
     395        'create_group_list': True,
     396        'create_athena_locker': True,
     397    }
     398    group = groups.models.Group()
     399    group.group_status = groups.models.GroupStatus.objects.get(slug='applying', )
     400    group.recognition_date  = datetime.datetime.now()
     401    if request.method == 'POST': # If the form has been submitted...
     402        # A form bound to the POST data
     403        form = GroupCreateStartupForm(
     404            request.POST, request.FILES,
     405            initial=initial,
     406            instance=group,
     407        )
     408
     409        if form.is_valid(): # All validation rules pass
     410            group.set_updater(request.user)
     411            form.save()
     412
     413            group_startup = groups.models.GroupStartup()
     414            group_startup.group = group
     415            group_startup.stage = groups.models.GROUP_STARTUP_STAGE_SUBMITTED
     416            group_startup.submitter = request.user.username
     417
     418            group_startup.create_officer_list = form.cleaned_data['create_officer_list']
     419            group_startup.create_group_list = form.cleaned_data['create_group_list']
     420            group_startup.create_athena_locker = form.cleaned_data['create_athena_locker']
     421
     422            group_startup.president_name = form.cleaned_data['president_name']
     423            group_startup.president_kerberos = form.cleaned_data['president_kerberos']
     424            group_startup.treasurer_name = form.cleaned_data['treasurer_name']
     425            group_startup.treasurer_kerberos = form.cleaned_data['treasurer_kerberos']
     426
     427            group_startup.save()
     428
     429            context = {
     430                'group':            group,
     431                'group_startup':    group_startup,
     432                'pagename':         'groups',
     433            }
     434
     435            email_from_template(
     436                tmpl='groups/create/startup-submitted-email.txt',
     437                context=context,
     438                subject='ASA Startup Application: %s' % (group.name, ),
     439                to=[request.user.email] + create_group_officers(group, form.cleaned_data, save=False, ),
     440                cc=['asa-groups@mit.edu'],
     441                from_email='asa-groups@mit.edu',
     442            ).send()
     443
     444            return render_to_response('groups/create/startup_thanks.html', context, context_instance=RequestContext(request), )
     445        else:
     446            msg = "Validation failed. See below for details."
     447
     448    else:
     449        form = GroupCreateStartupForm(initial=initial, instance=group, ) # An unbound form
     450
     451    context = {
     452        'form':  form,
     453        'msg':   msg,
     454        'pagename':   'groups',
     455    }
     456    return render_to_response('groups/create/startup.html', context, context_instance=RequestContext(request), )
     457
     458class GroupRecognitionForm(forms.Form):
     459    test = forms.BooleanField()
     460
     461@permission_required('groups.recognize_group')
     462def recognize_normal_group(request, pk, ):
     463    group_startup = get_object_or_404(groups.models.GroupStartup, pk=pk, )
     464    group = group_startup.group
     465
     466    context = {
     467        'startup': group_startup,
     468        'group': group,
     469        'pagename' : 'groups',
     470    }
     471
     472    if group.group_status.slug != 'applying':
     473        return render_to_response('groups/create/err.not-applying.html', context, context_instance=RequestContext(request), )
     474    if group_startup.stage != groups.models.GROUP_STARTUP_STAGE_SUBMITTED:
     475        return render_to_response('groups/create/err.not-applying.html', context, context_instance=RequestContext(request), )
     476
     477    context['msg'] = ""
     478    if request.method == 'POST':
     479        if 'approve' in request.POST:
     480            group_startup.stage = groups.models.GROUP_STARTUP_STAGE_APPROVED
     481            group_startup.save()
     482
     483            group.group_status = groups.models.GroupStatus.objects.get(slug='active')
     484            group.constitution_url = ""
     485            group.recognition_date = datetime.date.today()
     486            group.set_updater(request.user)
     487
     488            group.save()
     489            officer_emails = create_group_officers(group, group_startup.__dict__, )
     490            welcome_mail, accounts_mail = create_group_get_emails(group, group_startup, officer_emails, )
     491            welcome_mail.send()
     492            if accounts_mail:
     493                accounts_mail.send()
     494            context['msg'] = 'Group approved.'
     495            context['msg_type'] = 'info'
     496        elif 'reject' in request.POST:
     497            group_startup.stage = groups.models.GROUP_STARTUP_STAGE_REJECTED
     498            group_startup.save()
     499            group.group_status = groups.models.GroupStatus.objects.get(slug='derecognized')
     500            group.save()
     501            note = groups.models.GroupNote(
     502                author=request.user.username,
     503                body="Group rejected during recognition process.",
     504                acl_read_group=True,
     505                acl_read_offices=True,
     506                group=group,
     507            ).save()
     508            context['msg'] = 'Group rejected.'
     509            context['msg_type'] = 'info'
     510        else:
     511            context['disp_form'] = True
     512    else:
     513        context['disp_form'] = True
     514
     515    return render_to_response('groups/create/startup_review.html', context, context_instance=RequestContext(request), )
     516
     517class GroupStartupListView(ListView):
     518    model = groups.models.GroupStartup
     519    template_object_name = 'startup'
     520
     521    def get_queryset(self, ):
     522        qs = super(GroupStartupListView, self).get_queryset()
     523        qs = qs.filter(stage=groups.models.GROUP_STARTUP_STAGE_SUBMITTED)
     524        qs = qs.select_related('group')
     525        return qs
     526
     527    def get_context_data(self, **kwargs):
     528        context = super(GroupStartupListView, self).get_context_data(**kwargs)
     529        context['pagename'] = 'groups'
     530        return context
     531
     532
     533##################
     534# Multiple group #
     535##################
    175536
    176537class GroupFilter(django_filters.FilterSet):
     
    208569        context['pagename'] = 'groups'
    209570        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"
    266571        return context
    267572
     
    439744        }
    440745        return render_to_response('groups/group_search.html', context, context_instance=RequestContext(request), )
     746
     747
     748class GroupHistoryView(ListView):
     749    context_object_name = "version_list"
     750    template_name = "groups/group_version.html"
     751
     752    def get_queryset(self):
     753        history_entries = None
     754        if 'pk' in self.kwargs:
     755            group = get_object_or_404(groups.models.Group, pk=self.kwargs['pk'])
     756            history_entries = reversion.models.Version.objects.get_for_object(group)
     757        else:
     758            history_entries = reversion.models.Version.objects.all()
     759            group_content_type = ContentType.objects.get_for_model(groups.models.Group)
     760            history_entries = history_entries.filter(content_type=group_content_type)
     761        length = len(history_entries)
     762        if length > 150:
     763            history_entries = history_entries[length-100:]
     764        return history_entries
     765
     766    def get_context_data(self, **kwargs):
     767        context = super(GroupHistoryView, self).get_context_data(**kwargs)
     768        if 'pk' in self.kwargs:
     769            group = get_object_or_404(groups.models.Group, pk=self.kwargs['pk'])
     770            context['title'] = "History for %s" % (group.name, )
     771        else:
     772            context['title'] = "Recent Changes"
     773        return context
     774
     775
     776class AccountLookupForm(forms.Form):
     777    account_number = forms.IntegerField()
     778    username = forms.CharField(help_text="Athena username of person to check")
     779
     780def account_lookup(request, ):
     781    msg = None
     782    msg_type = ""
     783    account_number = None
     784    username = None
     785    group = None
     786    office_holders = []
     787
     788    visible_roles  = groups.models.OfficerRole.objects.filter(publicly_visible=True)
     789
     790    initial = {}
     791
     792    if 'search' in request.GET: # If the form has been submitted...
     793        # A form bound to the POST data
     794        form = AccountLookupForm(request.GET)
     795
     796        if form.is_valid(): # All validation rules pass
     797            account_number = form.cleaned_data['account_number']
     798            username = form.cleaned_data['username']
     799            account_q = Q(main_account_id=account_number) | Q(funding_account_id=account_number)
     800            try:
     801                group = groups.models.Group.objects.get(account_q)
     802                office_holders = group.officers(person=username)
     803                office_holders = office_holders.filter(role__in=visible_roles)
     804            except groups.models.Group.DoesNotExist:
     805                msg = "Group not found"
     806                msg_type = "error"
     807
     808    else:
     809        form = AccountLookupForm()
     810
     811    context = {
     812        'username':     username,
     813        'account_number': account_number,
     814        'group':        group,
     815        'office_holders': office_holders,
     816        'form':         form,
     817        'msg':          msg,
     818        'msg_type':     msg_type,
     819        'visible_roles':    visible_roles,
     820    }
     821    return render_to_response('groups/account_lookup.html', context, context_instance=RequestContext(request), )
  • 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}
  • asadb/mit/__init__.py

    r9c1f0b2 r2b38cb9  
    3333        username = user.username
    3434        user.password = "ScriptsSSLAuth"
    35         con = ldap.open('ldap.mit.edu')
     35        con = ldap.open('ldap-too.mit.edu')
    3636        con.simple_bind_s("", "")
    3737        dn = "dc=mit,dc=edu"
  • asadb/settings.py

    r1de230f rea217bd  
    88DEBUG = False
    99TEMPLATE_DEBUG = DEBUG
     10
     11# Is this the main, production deployment?
     12# If not, we won't try to propagate things to other systems.
     13# (For example, no changing asa-official membership.)
     14PRODUCTION_DEPLOYMENT = False
    1015
    1116ADMINS = (
     
    6368# List of callables that know how to import templates from various sources.
    6469TEMPLATE_LOADERS = (
    65     'django.template.loaders.filesystem.load_template_source',
     70    'django.template.loaders.filesystem.Loader',
    6671    'django.template.loaders.app_directories.load_template_source',
    6772#     'django.template.loaders.eggs.load_template_source',
  • asadb/template/form_utils/fields_as_trs.html

    r4bc3ab9 reabc6ee  
    1010    {{ field.errors }}
    1111    {{ field }}
     12    {% if field.help_text %}<p>{{ field.help_text }}</p>{% endif %}
    1213  </td>
    1314</tr>
  • asadb/template/groups/group_detail.html

    rfbb362a r47998d1  
    77{% if adminpriv %}<a href='{%url groups:group-manage-main group.pk %}'>[update]</a></p>{%endif%}
    88</h1>
     9
     10<div class='messagebox errorbox'>
     11<p>Note: Fields marked [redacted temporarily] are being redacted for part of the beta, but are likely to be public later on. Please contact asa-db@mit.edu if you object to them becoming public.</p>
     12</div>
    913
    1014<table class='pretty-table'>
     
    2125<tr><th>Website</th><td><a href="{{group.website_url}}">{{group.website_url}}</a></td></tr>
    2226<tr><th>Meeting times</th><td>{{group.meeting_times}}</td></tr>
    23 <tr><th>Officer email</th><td>{{group.officer_email}}</td></tr>
     27<tr><th>Officer email</th><td>redacted-temporarily@mit.edu</td></tr>
    2428{% if viewpriv %}<tr class='private-info'>
    2529    <th>Group email</th>
     
    3236    <th>{{name}}{%if not role.publicly_visible %}*{%endif%}</th>
    3337    <td><ul>
    34     {% for person in people %}<li>{{person.person}}</li>{%endfor%}
     38    {% for person in people %}<li>[redacted temporarily]</li>{%endfor%}
    3539    </ul></td>
    3640</tr>
     
    4448<tr><th colspan='2'>Financial Information</th></tr>
    4549<tr><th>Funding status</th><td>{{group.group_funding}}</td></tr>
    46 <tr><th>Main Account</th><td>{{group.main_account_id}}</td></tr>
    47 <tr><th>Funding Account</th><td>{{group.funding_account_id}}</td></tr>
     50<tr><th>Main Account</th><td>272[redacted temporarily]</td></tr>
     51<tr><th>Funding Account</th><td>272[redacted temporarily]</td></tr>
    4852
    4953<tr><th colspan='2'>Additional Information</th></tr>
  • asadb/template/index.html

    rfbb362a r191ec87  
    1414    </ul></li>
    1515    {%if perms.groups.view_signatories %}<li><a href='{% url groups:signatories %}'>View Signatories</a></li>{%endif%}
     16    <li>Group recognition<ul>
     17        <li><a href='http://web.mit.edu/asa/start/new-group-app.html'>New Group Application</a></li>
     18        {%if perms.groups.add_group %}<li><a href='{% url groups:startup %}'>Startup form</a></li>{%endif%}
     19        {%if perms.groups.add_group %}<li><a href='{% url groups:startup-list %}'>Review startup applications</a></li>{%endif%}
     20        {%if perms.groups.recognize_nge %}<li><a href='{% url groups:recognize-nge %}'>Recognize Non-Group Entity</a></li>{%endif%}
     21    </ul></li>
    1622</ul>
    1723
  • asadb/util/db_form_utils.py

    r9b911db rb63d6b2  
    2626
    2727    def value_from_datadict(self, data, files, name, ):
     28        for choice_value, choice_label in self.choices:
     29            if choice_label == unicode(self.value):
     30                return choice_value
    2831        return self.value
    2932
  • .gitignore

    r3ffb210 r728cafa  
    88asadb/media/page-previews/fysm/
    99asadb/util/saved-data/
     10asadb/util/static-data/
    1011asadb/util/warehouse-dump.csv
  • asadb/util/warehouse-refresh.sh

    r14e96b3 r5c77dea  
    1515echo
    1616echo Changes in this commit:
    17 git show
     17git show --stat
    1818
    1919echo
     
    3030echo
    3131echo Changes in this commit:
    32 git show
     32git show --stat
    3333
    3434echo
Note: See TracChangeset for help on using the changeset viewer.