Ignore:
Timestamp:
Apr 9, 2012, 1:23:43 AM (14 years ago)
Author:
Alex Dehnert <adehnert@…>
Branches:
master, space-access, stable, stage
Children:
59a438a
Parents:
2c86ed1
git-author:
Alex Dehnert <adehnert@…> (04/09/12 01:23:43)
git-committer:
Alex Dehnert <adehnert@…> (04/09/12 01:23:43)
Message:

Move officer management up to group management

File:
1 edited

Legend:

Unmodified
Added
Removed
  • asadb/groups/views.py

    rffecc7f rc3cd6c2  
    209209    }
    210210    return render_to_response('groups/group_change_main.html', context, context_instance=RequestContext(request), )
    211 
    212 
    213 
    214 ##################
    215 # ACCOUNT LOOKUP #
    216 ##################
    217 
    218 class AccountLookupForm(forms.Form):
    219     account_number = forms.IntegerField()
    220     username = forms.CharField(help_text="Athena username of person to check")
    221 
    222 def account_lookup(request, ):
    223     msg = None
    224     msg_type = ""
    225     account_number = None
    226     username = None
    227     group = None
    228     office_holders = []
    229 
    230     visible_roles  = groups.models.OfficerRole.objects.filter(publicly_visible=True)
    231 
    232     initial = {}
    233 
    234     if 'search' in request.GET: # If the form has been submitted...
    235         # A form bound to the POST data
    236         form = AccountLookupForm(request.GET)
    237 
    238         if form.is_valid(): # All validation rules pass
    239             account_number = form.cleaned_data['account_number']
    240             username = form.cleaned_data['username']
    241             account_q = Q(main_account_id=account_number) | Q(funding_account_id=account_number)
    242             try:
    243                 group = groups.models.Group.objects.get(account_q)
    244                 office_holders = group.officers(person=username)
    245                 office_holders = office_holders.filter(role__in=visible_roles)
    246             except groups.models.Group.DoesNotExist:
    247                 msg = "Group not found"
    248                 msg_type = "error"
    249 
    250     else:
    251         form = AccountLookupForm()
    252 
    253     context = {
    254         'username':     username,
    255         'account_number': account_number,
    256         'group':        group,
    257         'office_holders': office_holders,
    258         'form':         form,
    259         'msg':          msg,
    260         'msg_type':     msg_type,
    261         'visible_roles':    visible_roles,
    262     }
    263     return render_to_response('groups/account_lookup.html', context, context_instance=RequestContext(request), )
    264 
    265 
    266 
    267 ##################
    268 # GROUP CREATION #
    269 ##################
    270 
    271 def validate_athena(username, student=False, ):
    272     try:
    273         person = groups.models.AthenaMoiraAccount.active_accounts.get(username=username)
    274         if student and not person.is_student():
    275             raise ValidationError('This must be a current student.')
    276     except groups.models.AthenaMoiraAccount.DoesNotExist:
    277         raise ValidationError('This must be a valid Athena username.')
    278 
    279 
    280 class GroupCreateForm(form_utils.forms.BetterModelForm):
    281     create_officer_list = forms.BooleanField(required=False)
    282     create_group_list = forms.BooleanField(required=False)
    283     create_athena_locker = forms.BooleanField(required=False)
    284 
    285     president_name = forms.CharField(max_length=50, )
    286     president_kerberos = forms.CharField(min_length=3, max_length=8, )
    287     treasurer_name = forms.CharField(max_length=50)
    288     treasurer_kerberos = forms.CharField(min_length=3, max_length=8, )
    289     def clean_president(self, ):
    290         username = self.cleaned_data['president_kerberos']
    291         validate_athena(username, True, )
    292         return username
    293 
    294     def clean_treasurer(self, ):
    295         username = self.cleaned_data['treasurer_kerberos']
    296         validate_athena(username, True, )
    297         return username
    298 
    299     class Meta:
    300         fieldsets = [
    301             ('basic', {
    302                 'legend': 'Basic Information',
    303                 'fields': ['name', 'abbreviation', 'description', ],
    304             }),
    305             ('officers', {
    306                 'legend': 'Officers',
    307                 'fields': ['president_name', 'president_kerberos', 'treasurer_name', 'treasurer_kerberos', ],
    308             }),
    309             ('type', {
    310                 'legend': 'Type',
    311                 'fields': ['activity_category', 'group_class', 'group_funding', ],
    312             }),
    313             ('technical', {
    314                 'legend': 'Technical Information',
    315                 'fields': [
    316                     'officer_email', 'create_officer_list',
    317                     'group_email', 'create_group_list',
    318                     'athena_locker', 'create_athena_locker',
    319                 ],
    320             }),
    321             ('financial', {
    322                 'legend': 'Financial Information',
    323                 'fields': ['main_account_id', 'funding_account_id', ],
    324             }),
    325             ('constitution', {
    326                 'legend': 'Constitution',
    327                 'fields': ['constitution_url', ],
    328             }),
    329         ]
    330         model = groups.models.Group
    331 
    332 
    333 class GroupCreateNgeForm(GroupCreateForm):
    334     def __init__(self, *args, **kwargs):
    335         super(GroupCreateNgeForm, self).__init__(*args, **kwargs)
    336         self.fields['treasurer_name'].required = False
    337         self.fields['treasurer_kerberos'].required = False
    338 
    339 
    340 class GroupCreateStartupForm(GroupCreateForm):
    341     def __init__(self, *args, **kwargs):
    342         super(GroupCreateStartupForm, self).__init__(*args, **kwargs)
    343         self.fields['activity_category'].required = True
    344         self.fields['constitution_url'].required = True
    345         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."
    346 
    347     class Meta(GroupCreateForm.Meta):
    348         fieldsets = filter(
    349             lambda fieldset: fieldset[0] not in ['financial', ],
    350             GroupCreateForm.Meta.fieldsets
    351         )
    352 
    353 def create_group_get_emails(group, group_startup, officer_emails, ):
    354     # Figure out all the accounts mail parameters
    355     accounts_count = 0
    356     create_officer_list = False
    357     if group_startup.create_officer_list and group.officer_email:
    358         create_officer_list = True
    359         accounts_count += 1
    360     create_group_list = False
    361     if group_startup.create_group_list and group.group_email:
    362         create_group_list = True
    363         accounts_count += 1
    364     create_athena_locker = False
    365     if group_startup.create_athena_locker and group.athena_locker:
    366         create_athena_locker = True
    367         accounts_count += 1
    368     officer_list, _, officer_domain = group.officer_email.partition('@')
    369     group_list, _, group_domain = group.group_email.partition('@')
    370 
    371     # Fill out the Context
    372     mail_context = Context({
    373         'group': group,
    374         'group_startup': group_startup,
    375         'create_officer_list': create_officer_list,
    376         'create_group_list': create_group_list,
    377         'create_athena_locker': create_athena_locker,
    378         'officer_list': officer_list,
    379         'group_list': group_list,
    380         'officer_emails': officer_emails,
    381     })
    382 
    383     # Welcome mail
    384     welcome_mail = email_from_template(
    385         tmpl='groups/diffs/new-group-announce.txt',
    386         context=mail_context,
    387         subject='ASA Group Recognition: %s' % (group.name, ),
    388         to=officer_emails,
    389         cc=['asa-new-group-announce@mit.edu'],
    390         from_email='asa-exec@mit.edu',
    391     )
    392 
    393     # Accounts mail
    394     if accounts_count > 0:
    395         accounts_mail = email_from_template(
    396             tmpl='groups/diffs/new-group-accounts.txt',
    397             context=mail_context,
    398             subject='New Student Activity: %s' % (group.name, ),
    399             to=['accounts@mit.edu'],
    400             cc=officer_emails+['asa-admin@mit.edu'],
    401             from_email='asa-admin@mit.edu',
    402         )
    403         # XXX: Handle this better
    404         if officer_domain != 'mit.edu' or (create_group_list and group_domain != 'mit.edu'):
    405             accounts_mail.to = ['asa-groups@mit.edu']
    406             accounts_mail.cc = ['asa-db@mit.edu']
    407             accounts_mail.subject = "ERROR: " + accounts_mail.subject
    408             accounts_mail.body = "Bad domain on officer or group list\n\n" + accounts_mail.body
    409 
    410     else:
    411         accounts_mail = None
    412     return welcome_mail, accounts_mail
    413 
    414 def create_group_officers(group, formdata, save=True, ):
    415     officer_emails = [ ]
    416     for officer in ('president', 'treasurer', ):
    417         username = formdata[officer+'_kerberos']
    418         if username:
    419             if save: groups.models.OfficeHolder(
    420                 person=username,
    421                 role=groups.models.OfficerRole.objects.get(slug=officer),
    422                 group=group,
    423             ).save()
    424             officer_emails.append('%s@mit.edu' % (formdata[officer+'_kerberos'], ))
    425     return officer_emails
    426 
    427 @permission_required('groups.recognize_nge')
    428 def recognize_nge(request, ):
    429     msg = None
    430 
    431     initial = {
    432         'create_officer_list': False,
    433         'create_group_list': False,
    434         'create_athena_locker': True,
    435     }
    436     group = groups.models.Group()
    437     group.group_status = groups.models.GroupStatus.objects.get(slug='nge', )
    438     group.recognition_date  = datetime.datetime.now()
    439     if request.method == 'POST': # If the form has been submitted...
    440         # A form bound to the POST data
    441         form = GroupCreateNgeForm(
    442             request.POST, request.FILES,
    443             initial=initial,
    444             instance=group,
    445         )
    446 
    447         if form.is_valid(): # All validation rules pass
    448             group.set_updater(request.user)
    449             form.save()
    450             officer_emails = create_group_officers(group, form.cleaned_data, save=True, )
    451 
    452             return redirect(reverse('groups:group-detail', args=[group.pk]))
    453         else:
    454             msg = "Validation failed. See below for details."
    455 
    456     else:
    457         form = GroupCreateNgeForm(initial=initial, instance=group, ) # An unbound form
    458 
    459     context = {
    460         'form':  form,
    461         'msg':   msg,
    462         'pagename':   'groups',
    463     }
    464     return render_to_response('groups/create/nge.html', context, context_instance=RequestContext(request), )
    465 
    466 @login_required
    467 def startup_form(request, ):
    468     msg = None
    469 
    470     initial = {
    471         'create_officer_list': True,
    472         'create_group_list': True,
    473         'create_athena_locker': True,
    474     }
    475     group = groups.models.Group()
    476     group.group_status = groups.models.GroupStatus.objects.get(slug='applying', )
    477     group.recognition_date  = datetime.datetime.now()
    478     if request.method == 'POST': # If the form has been submitted...
    479         # A form bound to the POST data
    480         form = GroupCreateStartupForm(
    481             request.POST, request.FILES,
    482             initial=initial,
    483             instance=group,
    484         )
    485 
    486         if form.is_valid(): # All validation rules pass
    487             group.set_updater(request.user)
    488             form.save()
    489 
    490             group_startup = groups.models.GroupStartup()
    491             group_startup.group = group
    492             group_startup.stage = groups.models.GROUP_STARTUP_STAGE_SUBMITTED
    493             group_startup.submitter = request.user.username
    494 
    495             group_startup.create_officer_list = form.cleaned_data['create_officer_list']
    496             group_startup.create_group_list = form.cleaned_data['create_group_list']
    497             group_startup.create_athena_locker = form.cleaned_data['create_athena_locker']
    498 
    499             group_startup.president_name = form.cleaned_data['president_name']
    500             group_startup.president_kerberos = form.cleaned_data['president_kerberos']
    501             group_startup.treasurer_name = form.cleaned_data['treasurer_name']
    502             group_startup.treasurer_kerberos = form.cleaned_data['treasurer_kerberos']
    503 
    504             group_startup.save()
    505 
    506             context = {
    507                 'group':            group,
    508                 'group_startup':    group_startup,
    509                 'pagename':         'groups',
    510             }
    511 
    512             email_from_template(
    513                 tmpl='groups/create/startup-submitted-email.txt',
    514                 context=context,
    515                 subject='ASA Startup Application: %s' % (group.name, ),
    516                 to=[request.user.email] + create_group_officers(group, form.cleaned_data, save=False, ),
    517                 cc=['asa-groups@mit.edu'],
    518                 from_email='asa-groups@mit.edu',
    519             ).send()
    520 
    521             return render_to_response('groups/create/startup_thanks.html', context, context_instance=RequestContext(request), )
    522         else:
    523             msg = "Validation failed. See below for details."
    524 
    525     else:
    526         form = GroupCreateStartupForm(initial=initial, instance=group, ) # An unbound form
    527 
    528     context = {
    529         'form':  form,
    530         'msg':   msg,
    531         'pagename':   'groups',
    532     }
    533     return render_to_response('groups/create/startup.html', context, context_instance=RequestContext(request), )
    534 
    535 @permission_required('groups.recognize_group')
    536 def recognize_normal_group(request, pk, ):
    537     group_startup = get_object_or_404(groups.models.GroupStartup, pk=pk, )
    538     group = group_startup.group
    539 
    540     context = {
    541         'startup': group_startup,
    542         'group': group,
    543         'pagename' : 'groups',
    544     }
    545 
    546     if group.group_status.slug != 'applying':
    547         return render_to_response('groups/create/err.not-applying.html', context, context_instance=RequestContext(request), )
    548     if group_startup.stage != groups.models.GROUP_STARTUP_STAGE_SUBMITTED:
    549         return render_to_response('groups/create/err.not-applying.html', context, context_instance=RequestContext(request), )
    550 
    551     context['msg'] = ""
    552     if request.method == 'POST':
    553         if 'approve' in request.POST:
    554             group_startup.stage = groups.models.GROUP_STARTUP_STAGE_APPROVED
    555             group_startup.save()
    556 
    557             group.group_status = groups.models.GroupStatus.objects.get(slug='active')
    558             group.constitution_url = ""
    559             group.recognition_date = datetime.datetime.now()
    560             group.set_updater(request.user)
    561 
    562             group.save()
    563             officer_emails = create_group_officers(group, group_startup.__dict__, )
    564             welcome_mail, accounts_mail = create_group_get_emails(group, group_startup, officer_emails, )
    565             welcome_mail.send()
    566             if accounts_mail:
    567                 accounts_mail.send()
    568             context['msg'] = 'Group approved.'
    569             context['msg_type'] = 'info'
    570         elif 'reject' in request.POST:
    571             group_startup.stage = groups.models.GROUP_STARTUP_STAGE_REJECTED
    572             group_startup.save()
    573             group.group_status = groups.models.GroupStatus.objects.get(slug='derecognized')
    574             group.save()
    575             note = groups.models.GroupNote(
    576                 author=request.user.username,
    577                 body="Group rejected during recognition process.",
    578                 acl_read_group=True,
    579                 acl_read_offices=True,
    580                 group=group,
    581             ).save()
    582             context['msg'] = 'Group rejected.'
    583             context['msg_type'] = 'info'
    584         else:
    585             context['disp_form'] = True
    586     else:
    587         context['disp_form'] = True
    588 
    589     return render_to_response('groups/create/startup_review.html', context, context_instance=RequestContext(request), )
    590 
    591 class GroupStartupListView(ListView):
    592     model = groups.models.GroupStartup
    593     template_object_name = 'startup'
    594 
    595     def get_queryset(self, ):
    596         qs = super(GroupStartupListView, self).get_queryset()
    597         qs = qs.filter(stage=groups.models.GROUP_STARTUP_STAGE_SUBMITTED)
    598         qs = qs.select_related('group')
    599         return qs
    600 
    601     def get_context_data(self, **kwargs):
    602         context = super(GroupStartupListView, self).get_context_data(**kwargs)
    603         context['pagename'] = 'groups'
    604         return context
    605 
    606 
    607 
    608 ##################
    609 # Multiple group #
    610 ##################
    611 
    612 class GroupFilter(django_filters.FilterSet):
    613     name = django_filters.CharFilter(lookup_type='icontains', label="Name contains")
    614     abbreviation = django_filters.CharFilter(lookup_type='iexact', label="Abbreviation is")
    615 
    616     class Meta:
    617         model = groups.models.Group
    618         fields = [
    619             'name',
    620             'abbreviation',
    621             'activity_category',
    622             'group_class',
    623             'group_status',
    624             'group_funding',
    625         ]
    626 
    627     def __init__(self, data=None, *args, **kwargs):
    628         if not data: data = None
    629         super(GroupFilter, self).__init__(data, *args, **kwargs)
    630         active_pk = groups.models.GroupStatus.objects.get(slug='active').pk
    631         self.form.initial['group_status'] = active_pk
    632 
    633 
    634 class GroupListView(ListView):
    635     model = groups.models.Group
    636     template_object_name = 'group'
    637 
    638     def get(self, *args, **kwargs):
    639         qs = super(GroupListView, self).get_queryset()
    640         self.filterset = GroupFilter(self.request.GET, qs)
    641         return super(GroupListView, self).get(*args, **kwargs)
    642 
    643     def get_queryset(self, ):
    644         qs = self.filterset.qs
    645         return qs
    646 
    647     def get_context_data(self, **kwargs):
    648         context = super(GroupListView, self).get_context_data(**kwargs)
    649         # Add in the publisher
    650         context['pagename'] = 'groups'
    651         context['filter'] = self.filterset
    652         return context
    653 
    654211
    655212def load_officers(group, ):
     
    782339    return render_to_response('groups/group_change_officers.html', context, context_instance=RequestContext(request), )
    783340
     341
     342
     343##################
     344# ACCOUNT LOOKUP #
     345##################
     346
     347class AccountLookupForm(forms.Form):
     348    account_number = forms.IntegerField()
     349    username = forms.CharField(help_text="Athena username of person to check")
     350
     351def account_lookup(request, ):
     352    msg = None
     353    msg_type = ""
     354    account_number = None
     355    username = None
     356    group = None
     357    office_holders = []
     358
     359    visible_roles  = groups.models.OfficerRole.objects.filter(publicly_visible=True)
     360
     361    initial = {}
     362
     363    if 'search' in request.GET: # If the form has been submitted...
     364        # A form bound to the POST data
     365        form = AccountLookupForm(request.GET)
     366
     367        if form.is_valid(): # All validation rules pass
     368            account_number = form.cleaned_data['account_number']
     369            username = form.cleaned_data['username']
     370            account_q = Q(main_account_id=account_number) | Q(funding_account_id=account_number)
     371            try:
     372                group = groups.models.Group.objects.get(account_q)
     373                office_holders = group.officers(person=username)
     374                office_holders = office_holders.filter(role__in=visible_roles)
     375            except groups.models.Group.DoesNotExist:
     376                msg = "Group not found"
     377                msg_type = "error"
     378
     379    else:
     380        form = AccountLookupForm()
     381
     382    context = {
     383        'username':     username,
     384        'account_number': account_number,
     385        'group':        group,
     386        'office_holders': office_holders,
     387        'form':         form,
     388        'msg':          msg,
     389        'msg_type':     msg_type,
     390        'visible_roles':    visible_roles,
     391    }
     392    return render_to_response('groups/account_lookup.html', context, context_instance=RequestContext(request), )
     393
     394
     395
     396##################
     397# GROUP CREATION #
     398##################
     399
     400def validate_athena(username, student=False, ):
     401    try:
     402        person = groups.models.AthenaMoiraAccount.active_accounts.get(username=username)
     403        if student and not person.is_student():
     404            raise ValidationError('This must be a current student.')
     405    except groups.models.AthenaMoiraAccount.DoesNotExist:
     406        raise ValidationError('This must be a valid Athena username.')
     407
     408
     409class GroupCreateForm(form_utils.forms.BetterModelForm):
     410    create_officer_list = forms.BooleanField(required=False)
     411    create_group_list = forms.BooleanField(required=False)
     412    create_athena_locker = forms.BooleanField(required=False)
     413
     414    president_name = forms.CharField(max_length=50, )
     415    president_kerberos = forms.CharField(min_length=3, max_length=8, )
     416    treasurer_name = forms.CharField(max_length=50)
     417    treasurer_kerberos = forms.CharField(min_length=3, max_length=8, )
     418    def clean_president(self, ):
     419        username = self.cleaned_data['president_kerberos']
     420        validate_athena(username, True, )
     421        return username
     422
     423    def clean_treasurer(self, ):
     424        username = self.cleaned_data['treasurer_kerberos']
     425        validate_athena(username, True, )
     426        return username
     427
     428    class Meta:
     429        fieldsets = [
     430            ('basic', {
     431                'legend': 'Basic Information',
     432                'fields': ['name', 'abbreviation', 'description', ],
     433            }),
     434            ('officers', {
     435                'legend': 'Officers',
     436                'fields': ['president_name', 'president_kerberos', 'treasurer_name', 'treasurer_kerberos', ],
     437            }),
     438            ('type', {
     439                'legend': 'Type',
     440                'fields': ['activity_category', 'group_class', 'group_funding', ],
     441            }),
     442            ('technical', {
     443                'legend': 'Technical Information',
     444                'fields': [
     445                    'officer_email', 'create_officer_list',
     446                    'group_email', 'create_group_list',
     447                    'athena_locker', 'create_athena_locker',
     448                ],
     449            }),
     450            ('financial', {
     451                'legend': 'Financial Information',
     452                'fields': ['main_account_id', 'funding_account_id', ],
     453            }),
     454            ('constitution', {
     455                'legend': 'Constitution',
     456                'fields': ['constitution_url', ],
     457            }),
     458        ]
     459        model = groups.models.Group
     460
     461
     462class GroupCreateNgeForm(GroupCreateForm):
     463    def __init__(self, *args, **kwargs):
     464        super(GroupCreateNgeForm, self).__init__(*args, **kwargs)
     465        self.fields['treasurer_name'].required = False
     466        self.fields['treasurer_kerberos'].required = False
     467
     468
     469class GroupCreateStartupForm(GroupCreateForm):
     470    def __init__(self, *args, **kwargs):
     471        super(GroupCreateStartupForm, self).__init__(*args, **kwargs)
     472        self.fields['activity_category'].required = True
     473        self.fields['constitution_url'].required = True
     474        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."
     475
     476    class Meta(GroupCreateForm.Meta):
     477        fieldsets = filter(
     478            lambda fieldset: fieldset[0] not in ['financial', ],
     479            GroupCreateForm.Meta.fieldsets
     480        )
     481
     482def create_group_get_emails(group, group_startup, officer_emails, ):
     483    # Figure out all the accounts mail parameters
     484    accounts_count = 0
     485    create_officer_list = False
     486    if group_startup.create_officer_list and group.officer_email:
     487        create_officer_list = True
     488        accounts_count += 1
     489    create_group_list = False
     490    if group_startup.create_group_list and group.group_email:
     491        create_group_list = True
     492        accounts_count += 1
     493    create_athena_locker = False
     494    if group_startup.create_athena_locker and group.athena_locker:
     495        create_athena_locker = True
     496        accounts_count += 1
     497    officer_list, _, officer_domain = group.officer_email.partition('@')
     498    group_list, _, group_domain = group.group_email.partition('@')
     499
     500    # Fill out the Context
     501    mail_context = Context({
     502        'group': group,
     503        'group_startup': group_startup,
     504        'create_officer_list': create_officer_list,
     505        'create_group_list': create_group_list,
     506        'create_athena_locker': create_athena_locker,
     507        'officer_list': officer_list,
     508        'group_list': group_list,
     509        'officer_emails': officer_emails,
     510    })
     511
     512    # Welcome mail
     513    welcome_mail = email_from_template(
     514        tmpl='groups/diffs/new-group-announce.txt',
     515        context=mail_context,
     516        subject='ASA Group Recognition: %s' % (group.name, ),
     517        to=officer_emails,
     518        cc=['asa-new-group-announce@mit.edu'],
     519        from_email='asa-exec@mit.edu',
     520    )
     521
     522    # Accounts mail
     523    if accounts_count > 0:
     524        accounts_mail = email_from_template(
     525            tmpl='groups/diffs/new-group-accounts.txt',
     526            context=mail_context,
     527            subject='New Student Activity: %s' % (group.name, ),
     528            to=['accounts@mit.edu'],
     529            cc=officer_emails+['asa-admin@mit.edu'],
     530            from_email='asa-admin@mit.edu',
     531        )
     532        # XXX: Handle this better
     533        if officer_domain != 'mit.edu' or (create_group_list and group_domain != 'mit.edu'):
     534            accounts_mail.to = ['asa-groups@mit.edu']
     535            accounts_mail.cc = ['asa-db@mit.edu']
     536            accounts_mail.subject = "ERROR: " + accounts_mail.subject
     537            accounts_mail.body = "Bad domain on officer or group list\n\n" + accounts_mail.body
     538
     539    else:
     540        accounts_mail = None
     541    return welcome_mail, accounts_mail
     542
     543def create_group_officers(group, formdata, save=True, ):
     544    officer_emails = [ ]
     545    for officer in ('president', 'treasurer', ):
     546        username = formdata[officer+'_kerberos']
     547        if username:
     548            if save: groups.models.OfficeHolder(
     549                person=username,
     550                role=groups.models.OfficerRole.objects.get(slug=officer),
     551                group=group,
     552            ).save()
     553            officer_emails.append('%s@mit.edu' % (formdata[officer+'_kerberos'], ))
     554    return officer_emails
     555
     556@permission_required('groups.recognize_nge')
     557def recognize_nge(request, ):
     558    msg = None
     559
     560    initial = {
     561        'create_officer_list': False,
     562        'create_group_list': False,
     563        'create_athena_locker': True,
     564    }
     565    group = groups.models.Group()
     566    group.group_status = groups.models.GroupStatus.objects.get(slug='nge', )
     567    group.recognition_date  = datetime.datetime.now()
     568    if request.method == 'POST': # If the form has been submitted...
     569        # A form bound to the POST data
     570        form = GroupCreateNgeForm(
     571            request.POST, request.FILES,
     572            initial=initial,
     573            instance=group,
     574        )
     575
     576        if form.is_valid(): # All validation rules pass
     577            group.set_updater(request.user)
     578            form.save()
     579            officer_emails = create_group_officers(group, form.cleaned_data, save=True, )
     580
     581            return redirect(reverse('groups:group-detail', args=[group.pk]))
     582        else:
     583            msg = "Validation failed. See below for details."
     584
     585    else:
     586        form = GroupCreateNgeForm(initial=initial, instance=group, ) # An unbound form
     587
     588    context = {
     589        'form':  form,
     590        'msg':   msg,
     591        'pagename':   'groups',
     592    }
     593    return render_to_response('groups/create/nge.html', context, context_instance=RequestContext(request), )
     594
     595@login_required
     596def startup_form(request, ):
     597    msg = None
     598
     599    initial = {
     600        'create_officer_list': True,
     601        'create_group_list': True,
     602        'create_athena_locker': True,
     603    }
     604    group = groups.models.Group()
     605    group.group_status = groups.models.GroupStatus.objects.get(slug='applying', )
     606    group.recognition_date  = datetime.datetime.now()
     607    if request.method == 'POST': # If the form has been submitted...
     608        # A form bound to the POST data
     609        form = GroupCreateStartupForm(
     610            request.POST, request.FILES,
     611            initial=initial,
     612            instance=group,
     613        )
     614
     615        if form.is_valid(): # All validation rules pass
     616            group.set_updater(request.user)
     617            form.save()
     618
     619            group_startup = groups.models.GroupStartup()
     620            group_startup.group = group
     621            group_startup.stage = groups.models.GROUP_STARTUP_STAGE_SUBMITTED
     622            group_startup.submitter = request.user.username
     623
     624            group_startup.create_officer_list = form.cleaned_data['create_officer_list']
     625            group_startup.create_group_list = form.cleaned_data['create_group_list']
     626            group_startup.create_athena_locker = form.cleaned_data['create_athena_locker']
     627
     628            group_startup.president_name = form.cleaned_data['president_name']
     629            group_startup.president_kerberos = form.cleaned_data['president_kerberos']
     630            group_startup.treasurer_name = form.cleaned_data['treasurer_name']
     631            group_startup.treasurer_kerberos = form.cleaned_data['treasurer_kerberos']
     632
     633            group_startup.save()
     634
     635            context = {
     636                'group':            group,
     637                'group_startup':    group_startup,
     638                'pagename':         'groups',
     639            }
     640
     641            email_from_template(
     642                tmpl='groups/create/startup-submitted-email.txt',
     643                context=context,
     644                subject='ASA Startup Application: %s' % (group.name, ),
     645                to=[request.user.email] + create_group_officers(group, form.cleaned_data, save=False, ),
     646                cc=['asa-groups@mit.edu'],
     647                from_email='asa-groups@mit.edu',
     648            ).send()
     649
     650            return render_to_response('groups/create/startup_thanks.html', context, context_instance=RequestContext(request), )
     651        else:
     652            msg = "Validation failed. See below for details."
     653
     654    else:
     655        form = GroupCreateStartupForm(initial=initial, instance=group, ) # An unbound form
     656
     657    context = {
     658        'form':  form,
     659        'msg':   msg,
     660        'pagename':   'groups',
     661    }
     662    return render_to_response('groups/create/startup.html', context, context_instance=RequestContext(request), )
     663
     664@permission_required('groups.recognize_group')
     665def recognize_normal_group(request, pk, ):
     666    group_startup = get_object_or_404(groups.models.GroupStartup, pk=pk, )
     667    group = group_startup.group
     668
     669    context = {
     670        'startup': group_startup,
     671        'group': group,
     672        'pagename' : 'groups',
     673    }
     674
     675    if group.group_status.slug != 'applying':
     676        return render_to_response('groups/create/err.not-applying.html', context, context_instance=RequestContext(request), )
     677    if group_startup.stage != groups.models.GROUP_STARTUP_STAGE_SUBMITTED:
     678        return render_to_response('groups/create/err.not-applying.html', context, context_instance=RequestContext(request), )
     679
     680    context['msg'] = ""
     681    if request.method == 'POST':
     682        if 'approve' in request.POST:
     683            group_startup.stage = groups.models.GROUP_STARTUP_STAGE_APPROVED
     684            group_startup.save()
     685
     686            group.group_status = groups.models.GroupStatus.objects.get(slug='active')
     687            group.constitution_url = ""
     688            group.recognition_date = datetime.datetime.now()
     689            group.set_updater(request.user)
     690
     691            group.save()
     692            officer_emails = create_group_officers(group, group_startup.__dict__, )
     693            welcome_mail, accounts_mail = create_group_get_emails(group, group_startup, officer_emails, )
     694            welcome_mail.send()
     695            if accounts_mail:
     696                accounts_mail.send()
     697            context['msg'] = 'Group approved.'
     698            context['msg_type'] = 'info'
     699        elif 'reject' in request.POST:
     700            group_startup.stage = groups.models.GROUP_STARTUP_STAGE_REJECTED
     701            group_startup.save()
     702            group.group_status = groups.models.GroupStatus.objects.get(slug='derecognized')
     703            group.save()
     704            note = groups.models.GroupNote(
     705                author=request.user.username,
     706                body="Group rejected during recognition process.",
     707                acl_read_group=True,
     708                acl_read_offices=True,
     709                group=group,
     710            ).save()
     711            context['msg'] = 'Group rejected.'
     712            context['msg_type'] = 'info'
     713        else:
     714            context['disp_form'] = True
     715    else:
     716        context['disp_form'] = True
     717
     718    return render_to_response('groups/create/startup_review.html', context, context_instance=RequestContext(request), )
     719
     720class GroupStartupListView(ListView):
     721    model = groups.models.GroupStartup
     722    template_object_name = 'startup'
     723
     724    def get_queryset(self, ):
     725        qs = super(GroupStartupListView, self).get_queryset()
     726        qs = qs.filter(stage=groups.models.GROUP_STARTUP_STAGE_SUBMITTED)
     727        qs = qs.select_related('group')
     728        return qs
     729
     730    def get_context_data(self, **kwargs):
     731        context = super(GroupStartupListView, self).get_context_data(**kwargs)
     732        context['pagename'] = 'groups'
     733        return context
     734
     735
     736
     737##################
     738# Multiple group #
     739##################
     740
     741class GroupFilter(django_filters.FilterSet):
     742    name = django_filters.CharFilter(lookup_type='icontains', label="Name contains")
     743    abbreviation = django_filters.CharFilter(lookup_type='iexact', label="Abbreviation is")
     744
     745    class Meta:
     746        model = groups.models.Group
     747        fields = [
     748            'name',
     749            'abbreviation',
     750            'activity_category',
     751            'group_class',
     752            'group_status',
     753            'group_funding',
     754        ]
     755
     756    def __init__(self, data=None, *args, **kwargs):
     757        if not data: data = None
     758        super(GroupFilter, self).__init__(data, *args, **kwargs)
     759        active_pk = groups.models.GroupStatus.objects.get(slug='active').pk
     760        self.form.initial['group_status'] = active_pk
     761
     762
     763class GroupListView(ListView):
     764    model = groups.models.Group
     765    template_object_name = 'group'
     766
     767    def get(self, *args, **kwargs):
     768        qs = super(GroupListView, self).get_queryset()
     769        self.filterset = GroupFilter(self.request.GET, qs)
     770        return super(GroupListView, self).get(*args, **kwargs)
     771
     772    def get_queryset(self, ):
     773        qs = self.filterset.qs
     774        return qs
     775
     776    def get_context_data(self, **kwargs):
     777        context = super(GroupListView, self).get_context_data(**kwargs)
     778        # Add in the publisher
     779        context['pagename'] = 'groups'
     780        context['filter'] = self.filterset
     781        return context
     782
     783
    784784@permission_required('groups.view_signatories')
    785785def view_signatories(request, ):
Note: See TracChangeset for help on using the changeset viewer.