Changeset c3cd6c2 for asadb/groups/views.py
- Timestamp:
- Apr 9, 2012, 1:23:43 AM (14 years ago)
- 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)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
asadb/groups/views.py
rffecc7f rc3cd6c2 209 209 } 210 210 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 = None224 msg_type = ""225 account_number = None226 username = None227 group = None228 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 data236 form = AccountLookupForm(request.GET)237 238 if form.is_valid(): # All validation rules pass239 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 username293 294 def clean_treasurer(self, ):295 username = self.cleaned_data['treasurer_kerberos']296 validate_athena(username, True, )297 return username298 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.Group331 332 333 class GroupCreateNgeForm(GroupCreateForm):334 def __init__(self, *args, **kwargs):335 super(GroupCreateNgeForm, self).__init__(*args, **kwargs)336 self.fields['treasurer_name'].required = False337 self.fields['treasurer_kerberos'].required = False338 339 340 class GroupCreateStartupForm(GroupCreateForm):341 def __init__(self, *args, **kwargs):342 super(GroupCreateStartupForm, self).__init__(*args, **kwargs)343 self.fields['activity_category'].required = True344 self.fields['constitution_url'].required = True345 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.fieldsets351 )352 353 def create_group_get_emails(group, group_startup, officer_emails, ):354 # Figure out all the accounts mail parameters355 accounts_count = 0356 create_officer_list = False357 if group_startup.create_officer_list and group.officer_email:358 create_officer_list = True359 accounts_count += 1360 create_group_list = False361 if group_startup.create_group_list and group.group_email:362 create_group_list = True363 accounts_count += 1364 create_athena_locker = False365 if group_startup.create_athena_locker and group.athena_locker:366 create_athena_locker = True367 accounts_count += 1368 officer_list, _, officer_domain = group.officer_email.partition('@')369 group_list, _, group_domain = group.group_email.partition('@')370 371 # Fill out the Context372 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 mail384 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 mail394 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 better404 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.subject408 accounts_mail.body = "Bad domain on officer or group list\n\n" + accounts_mail.body409 410 else:411 accounts_mail = None412 return welcome_mail, accounts_mail413 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_emails426 427 @permission_required('groups.recognize_nge')428 def recognize_nge(request, ):429 msg = None430 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 data441 form = GroupCreateNgeForm(442 request.POST, request.FILES,443 initial=initial,444 instance=group,445 )446 447 if form.is_valid(): # All validation rules pass448 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 form458 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_required467 def startup_form(request, ):468 msg = None469 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 data480 form = GroupCreateStartupForm(481 request.POST, request.FILES,482 initial=initial,483 instance=group,484 )485 486 if form.is_valid(): # All validation rules pass487 group.set_updater(request.user)488 form.save()489 490 group_startup = groups.models.GroupStartup()491 group_startup.group = group492 group_startup.stage = groups.models.GROUP_STARTUP_STAGE_SUBMITTED493 group_startup.submitter = request.user.username494 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 form527 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.group539 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_APPROVED555 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_REJECTED572 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'] = True586 else:587 context['disp_form'] = True588 589 return render_to_response('groups/create/startup_review.html', context, context_instance=RequestContext(request), )590 591 class GroupStartupListView(ListView):592 model = groups.models.GroupStartup593 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 qs600 601 def get_context_data(self, **kwargs):602 context = super(GroupStartupListView, self).get_context_data(**kwargs)603 context['pagename'] = 'groups'604 return context605 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.Group618 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 = None629 super(GroupFilter, self).__init__(data, *args, **kwargs)630 active_pk = groups.models.GroupStatus.objects.get(slug='active').pk631 self.form.initial['group_status'] = active_pk632 633 634 class GroupListView(ListView):635 model = groups.models.Group636 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.qs645 return qs646 647 def get_context_data(self, **kwargs):648 context = super(GroupListView, self).get_context_data(**kwargs)649 # Add in the publisher650 context['pagename'] = 'groups'651 context['filter'] = self.filterset652 return context653 654 211 655 212 def load_officers(group, ): … … 782 339 return render_to_response('groups/group_change_officers.html', context, context_instance=RequestContext(request), ) 783 340 341 342 343 ################## 344 # ACCOUNT LOOKUP # 345 ################## 346 347 class AccountLookupForm(forms.Form): 348 account_number = forms.IntegerField() 349 username = forms.CharField(help_text="Athena username of person to check") 350 351 def 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 400 def 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 409 class 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 462 class 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 469 class 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 482 def 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 543 def 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') 557 def 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 596 def 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') 665 def 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 720 class 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 741 class 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 763 class 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 784 784 @permission_required('groups.view_signatories') 785 785 def view_signatories(request, ):
Note: See TracChangeset
for help on using the changeset viewer.