Changeset 34ae23b
- Timestamp:
- Oct 17, 2011, 12:05:07 PM (15 years ago)
- Branches:
- master, space-access, stable, stage, test-hooks
- Children:
- eabc6ee
- Parents:
- b04e142 (diff), ca21c49 (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@…> (10/17/11 12:05:07)
- git-committer:
- Alex Dehnert <adehnert@…> (10/17/11 12:05:07)
- Location:
- asadb
- Files:
-
- 21 added
- 8 edited
-
forms/admin.py (modified) (1 diff)
-
forms/migrations/0005_group_membership_update.py (added)
-
forms/migrations/0006_person_membership_update.py (added)
-
forms/migrations/0007_fix_fields_community.py (added)
-
forms/migrations/0008_add_email_preface.py (added)
-
forms/migrations/0009_add_confirmation_cycle.py (added)
-
forms/migrations/0010_move_people_to_cycles.py (added)
-
forms/models.py (modified) (1 diff)
-
forms/update_validations.py (added)
-
forms/views.py (modified) (2 diffs)
-
settings/local_settings.dev-template.py (added)
-
template/groups/groups_signatories.html (modified) (1 diff)
-
template/membership/anti-hazing.txt (added)
-
template/membership/confirm.html (added)
-
template/membership/submit-confirm-email.txt (added)
-
template/membership/submitted.html (added)
-
template/membership/thanks.html (added)
-
template/membership/update.html (added)
-
urls.py (modified) (1 diff)
-
groups/diffs.py (added)
-
groups/urls.py (modified) (1 diff)
-
groups/views.py (modified) (7 diffs)
-
media/style/style.css (modified) (1 diff)
-
template/groups/diffs/asa-update-mail.txt (added)
-
template/groups/diffs/new-group-accounts.txt (added)
-
template/groups/diffs/new-group-announce.txt (added)
-
template/groups/diffs/sao-update-mail.txt (added)
-
template/groups/group_create.html (added)
-
util/emails.py (added)
Legend:
- Unmodified
- Added
- Removed
-
asadb/forms/admin.py
rbb674c2 re1f5425 22 22 admin.site.register(forms.models.FYSM, FYSMAdmin) 23 23 admin.site.register(forms.models.FYSMCategory, FYSMCategoryAdmin) 24 25 class Admin_GroupConfirmationCycle(admin.ModelAdmin): 26 list_display = ( 27 'pk', 28 'name', 29 'slug', 30 'create_date', 31 ) 32 list_display_links = ('pk', 'name', 'slug', ) 33 prepopulated_fields = {"slug": ("name",)} 34 admin.site.register(forms.models.GroupConfirmationCycle, Admin_GroupConfirmationCycle) 35 36 class Admin_GroupMembershipUpdate(admin.ModelAdmin): 37 list_display = ( 38 'pk', 39 'group', 40 'update_time', 41 'updater_name', 42 'updater_title', 43 'num_undergrads', 44 'num_grads', 45 'num_alum', 46 'num_other_affiliate', 47 'num_other', 48 ) 49 list_display_links = ('pk', 'group', ) 50 search_fields = ('group__name', 'group__abbreviation', 'updater_name', ) 51 admin.site.register(forms.models.GroupMembershipUpdate, Admin_GroupMembershipUpdate) 52 53 class Admin_PersonMembershipUpdate(admin.ModelAdmin): 54 list_display = ( 55 'pk', 56 'username', 57 'cycle', 58 'update_time', 59 'deleted', 60 'valid', 61 ) 62 list_filter = ('valid', 'groups', ) 63 list_display_links = ('pk', 'username', 'cycle', ) 64 admin.site.register(forms.models.PersonMembershipUpdate, Admin_PersonMembershipUpdate) -
asadb/forms/models.py
rbb674c2 rc297267 135 135 preview.update_time = cls.never_updated 136 136 preview.save() 137 138 139 class GroupConfirmationCycle(models.Model): 140 name = models.CharField(max_length=30) 141 slug = models.SlugField() 142 create_date = models.DateTimeField(default=datetime.datetime.now) 143 144 def __unicode__(self, ): 145 return u"GroupConfirmationCycle %d: %s" % (self.id, self.name, ) 146 147 @classmethod 148 def latest(cls, ): 149 return cls.objects.order_by('-create_date')[0] 150 151 152 class GroupMembershipUpdate(models.Model): 153 update_time = models.DateTimeField(default=datetime.datetime.utcfromtimestamp(0)) 154 updater_name = models.CharField(max_length=30) 155 updater_title = models.CharField(max_length=30, help_text="You need not hold any particular title in the group, but we like to know who is completing the form.") 156 157 group = models.ForeignKey(groups.models.Group, help_text="If your group does not appear in the list above, then please email asa-exec@mit.edu.") 158 group_email = models.EmailField(help_text="The text of the law will be automatically distributed to your members via this list, in order to comply with the law.") 159 officer_email = models.EmailField() 160 161 membership_definition = models.TextField() 162 num_undergrads = models.IntegerField() 163 num_grads = models.IntegerField() 164 num_alum = models.IntegerField() 165 num_other_affiliate = models.IntegerField() 166 num_other = models.IntegerField() 167 168 membership_list = models.TextField(help_text="Member emails on separate lines (Athena usernames where applicable)") 169 170 email_preface = models.TextField(blank=True, help_text="If you would like, you may add text here that will preface the text of the policies when it is sent out to the group membership list provided above.") 171 172 hazing_statement = "By checking this, I hereby affirm that I have read and understand Chapter 269: Sections 17, 18, and 19 of Massachusetts Law. I furthermore attest that I have provided the appropriate address or will otherwise distribute to group members, pledges, and/or applicants, copies of Massachusetts Law 269: 17, 18, 19 and that our organization, group, or team agrees to comply with the provisions of that law. (See below for text.)" 173 no_hazing = models.BooleanField(help_text=hazing_statement) 174 175 discrimination_statement = "By checking this, I hereby affirm that I have read and understand the MIT Non-Discrimination Policy. I furthermore attest that our organization, group, or team agrees to not discriminate against individuals on the basis of race, color, sex, sexual orientation, gender identity, religion, disability, age, genetic information, veteran status, ancestry, or national or ethnic origin." 176 no_discrimination = models.BooleanField(help_text=discrimination_statement) 177 178 def __unicode__(self, ): 179 return "GroupMembershipUpdate for %s" % (self.group, ) 180 181 182 VALID_UNSET = 0 183 VALID_AUTOVALIDATED = 10 184 VALID_OVERRIDDEN = 20 # confirmed by an admin 185 VALID_AUTOREJECTED = -10 186 VALID_HANDREJECTED = -20 187 VALID_CHOICES = ( 188 (VALID_UNSET, "unvalidated"), 189 (VALID_AUTOVALIDATED, "autovalidated"), 190 (VALID_OVERRIDDEN, "hand-validated"), 191 (VALID_AUTOREJECTED, "autorejected"), 192 (VALID_HANDREJECTED, "hand-rejected"), 193 ) 194 195 class PersonMembershipUpdate(models.Model): 196 update_time = models.DateTimeField(default=datetime.datetime.utcfromtimestamp(0)) 197 username = models.CharField(max_length=30) 198 cycle = models.ForeignKey(GroupConfirmationCycle) 199 deleted = models.DateTimeField(default=None, null=True, blank=True, ) 200 valid = models.IntegerField(choices=VALID_CHOICES, default=VALID_UNSET) 201 groups = models.ManyToManyField(groups.models.Group, help_text="By selecting a group here, you indicate that you are an active member of the group in question.<br>If your group does not appear in the list above, then please email asa-exec@mit.edu.<br>") 202 203 def __unicode__(self, ): 204 return "PersonMembershipUpdate for %s" % (self.username, ) -
asadb/forms/views.py
rd3167b9 rca21c49 1 1 import forms.models 2 2 import groups.models 3 import groups.views 3 4 import settings 4 5 5 from django.contrib.auth.decorators import user_passes_test, login_required 6 from django.views.generic import list_detail 6 from django.contrib.auth.decorators import user_passes_test, login_required, permission_required 7 from django.views.generic import list_detail, ListView, DetailView 7 8 from django.shortcuts import render_to_response, get_object_or_404 8 9 from django.template import RequestContext 9 10 from django.template import Context, Template 10 11 from django.template.loader import get_template 11 from django.http import Http404, HttpResponseRedirect 12 from django.http import Http404, HttpResponseRedirect, HttpResponse 12 13 from django.core.urlresolvers import reverse 13 14 from django.core.mail import EmailMessage, mail_admins 14 15 from django.forms import Form 15 16 from django.forms import ModelForm 16 from django.forms import ModelChoiceField 17 from django.db.models import Q 18 17 from django.forms import ModelChoiceField, ModelMultipleChoiceField 18 from django.db import connection 19 from django.db.models import Q, Count 20 21 import csv 19 22 import datetime 23 import StringIO 20 24 21 25 ################# … … 220 224 } 221 225 return render_to_response('fysm/thanks.html', context, context_instance=RequestContext(request), ) 226 227 ##################### 228 # Membership update # 229 ##################### 230 231 class Form_GroupMembershipUpdate(ModelForm): 232 group = ModelChoiceField(queryset=groups.models.Group.active_groups.all()) 233 234 def __init__(self, *args, **kwargs): 235 super(Form_GroupMembershipUpdate, self).__init__(*args, **kwargs) 236 self.fields['no_hazing'].required = True 237 238 class Meta: 239 model = forms.models.GroupMembershipUpdate 240 fields = [ 241 'group', 242 'updater_title', 243 'group_email', 244 'officer_email', 245 'email_preface', 246 'no_hazing', 247 'no_discrimination', 248 'membership_definition', 249 'num_undergrads', 250 'num_grads', 251 'num_alum', 252 'num_other_affiliate', 253 'num_other', 254 'membership_list', 255 ] 256 257 @login_required 258 def group_membership_update(request, ): 259 year = datetime.date.today().year 260 261 initial = { 262 } 263 update_obj = forms.models.GroupMembershipUpdate() 264 update_obj.update_time = datetime.datetime.now() 265 update_obj.updater_name = request.user.username 266 267 confirm_path = reverse('membership-confirm', ) 268 confirm_uri = '%s://%s%s' % (request.is_secure() and 'https' or 'http', 269 request.get_host(), confirm_path) 270 271 if request.method == 'POST': # If the form has been submitted... 272 form = Form_GroupMembershipUpdate(request.POST, request.FILES, instance=update_obj) # A form bound to the POST data 273 274 if form.is_valid(): # All validation rules pass 275 request_obj = form.save() 276 group_obj = request_obj.group 277 278 279 # Send email 280 tmpl = get_template('membership/anti-hazing.txt') 281 ctx = Context({ 282 'update': request_obj, 283 'group': group_obj, 284 'submitter': request.user, 285 }) 286 body = tmpl.render(ctx) 287 email = EmailMessage( 288 subject='Anti-Hazing and Non-Discrimination Acknowledgement for %s' % ( 289 group_obj.name, 290 ), 291 body=body, 292 from_email=request.user.email, 293 to=[request_obj.group_email, ], 294 cc=[request_obj.officer_email, ], 295 bcc=['asa-db-outgoing@mit.edu', ], 296 ) 297 email.send() 298 299 # Send email 300 tmpl = get_template('membership/submit-confirm-email.txt') 301 ctx = Context({ 302 'update': request_obj, 303 'group': group_obj, 304 'submitter': request.user, 305 'confirm_uri': confirm_uri, 306 }) 307 body = tmpl.render(ctx) 308 email = EmailMessage( 309 subject='ASA Membership Information for %s' % ( 310 group_obj.name, 311 ), 312 body=body, 313 from_email=request.user.email, 314 to=[request_obj.officer_email, ], 315 bcc=['asa-db-outgoing@mit.edu', ], 316 ) 317 email.send() 318 319 return HttpResponseRedirect(reverse('membership-thanks', )) # Redirect after POST 320 321 else: 322 form = Form_GroupMembershipUpdate(initial=initial, ) # An unbound form 323 324 context = { 325 'form':form, 326 'confirm_uri': confirm_uri, 327 'pagename':'groups', 328 } 329 return render_to_response('membership/update.html', context, context_instance=RequestContext(request), ) 330 331 class Form_PersonMembershipUpdate(ModelForm): 332 groups = ModelMultipleChoiceField(queryset=groups.models.Group.active_groups.all()) 333 class Meta: 334 model = forms.models.PersonMembershipUpdate 335 fields = [ 336 'groups', 337 ] 338 339 @login_required 340 def person_membership_update(request, ): 341 year = datetime.date.today().year 342 343 initial = { 344 } 345 cycle = forms.models.GroupConfirmationCycle.latest() 346 try: 347 update_obj = forms.models.PersonMembershipUpdate.objects.get( 348 username=request.user.username, 349 deleted__isnull=True, 350 cycle=cycle, 351 ) 352 selected_groups = update_obj.groups.all() 353 print "Got update" 354 except forms.models.PersonMembershipUpdate.DoesNotExist: 355 update_obj = forms.models.PersonMembershipUpdate() 356 update_obj.update_time = datetime.datetime.now() 357 update_obj.username = request.user.username 358 update_obj.cycle = cycle 359 selected_groups = [] 360 361 accounts = groups.models.AthenaMoiraAccount 362 try: 363 person = accounts.active_accounts.get(username=request.user.username) 364 if person.is_student(): 365 update_obj.valid = forms.models.VALID_AUTOVALIDATED 366 else: 367 update_obj.valid = forms.models.VALID_AUTOREJECTED 368 except accounts.DoesNotExist: 369 pass 370 update_obj.valid = forms.models.VALID_AUTOREJECTED 371 372 update_obj.save() 373 374 qs = groups.models.Group.active_groups 375 filterset = groups.views.GroupFilter(request.GET, qs) 376 filtered_groups = filterset.qs.all() 377 show_filtered_groups = ('search' in request.GET) 378 379 message = "" 380 message_type = "info" 381 382 if request.method == 'POST' and 'add-remove' in request.POST: 383 group = groups.models.Group.objects.get(id=request.POST['group']) 384 if request.POST['action'] == 'remove': 385 if group in update_obj.groups.all(): 386 update_obj.groups.remove(group) 387 message = "You have been successfully removed from %s." % (group, ) 388 else: 389 message = "Sorry, but you're not in %s." % (group, ) 390 message_type = "warn" 391 elif request.POST['action'] == 'add': 392 if group in update_obj.groups.all(): 393 message = "Sorry, but you're already in %s." % (group, ) 394 message_type = "warn" 395 else: 396 update_obj.groups.add(group) 397 message = "You have been successfully added to %s." % (group, ) 398 else: 399 message = "Uh, somehow you tried to do something besides adding and removing..." 400 message_type = "alert" 401 402 if request.method == 'POST' and 'list' in request.POST: # If the form has been submitted... 403 form = Form_PersonMembershipUpdate(request.POST, request.FILES, instance=update_obj) # A form bound to the POST data 404 405 if form.is_valid(): # All validation rules pass 406 request_obj = form.save() 407 message = "Update saved" 408 409 else: 410 form = Form_PersonMembershipUpdate(initial=initial, instance=update_obj, ) # An unbound form 411 412 context = { 413 'form':form, 414 'filter':filterset, 415 'show_filtered_groups':show_filtered_groups, 416 'filtered_groups':filtered_groups, 417 'member_groups':selected_groups, 418 'message': message, 419 'message_type': message_type, 420 'pagename':'groups', 421 } 422 return render_to_response('membership/confirm.html', context, context_instance=RequestContext(request), ) 423 424 425 class View_GroupMembershipList(ListView): 426 context_object_name = "group_list" 427 template_name = "membership/submitted.html" 428 429 def get_queryset(self): 430 group_updates = forms.models.GroupMembershipUpdate.objects.all() 431 group_updates = group_updates.filter( 432 group__personmembershipupdate__deleted__isnull=True, 433 group__personmembershipupdate__valid__gt=0, 434 ) 435 group_updates = group_updates.annotate(num_confirms=Count('group__personmembershipupdate')) 436 #print len(list(group_updates)) 437 #for query in connection.queries: print query 438 return group_updates 439 440 441 @permission_required('groups.view_group_private_info') 442 def group_confirmation_issues(request, ): 443 active_groups = groups.models.Group.active_groups 444 group_updates = forms.models.GroupMembershipUpdate.objects.all() 445 people_confirmations = forms.models.PersonMembershipUpdate.objects.filter( 446 deleted__isnull=True, 447 valid__gt=0, 448 ) 449 450 buf = StringIO.StringIO() 451 output = csv.writer(buf) 452 output.writerow(['group_id', 'group_name', 'issue', 'num_confirm', 'officer_email', ]) 453 454 q_present = Q(id__in=group_updates.values('group')) 455 missing_groups = active_groups.filter(~q_present) 456 #print len(list(group_updates)) 457 for group in missing_groups: 458 num_confirms = len(people_confirmations.filter(groups=group)) 459 output.writerow([ 460 group.id, 461 group.name, 462 'unsubmitted', 463 num_confirms, 464 group.officer_email, 465 ]) 466 467 for group_update in group_updates: 468 group = group_update.group 469 num_confirms = len(people_confirmations.filter(groups=group)) 470 if num_confirms < 5: 471 output.writerow([ 472 group.id, 473 group.name, 474 'confirmations', 475 num_confirms, 476 group.officer_email, 477 ]) 478 479 480 return HttpResponse(buf.getvalue(), mimetype='text/plain', ) -
asadb/template/groups/groups_signatories.html
rfbb362a rce7fd92 16 16 17 17 <h2>The Groups</h2> 18 19 {% if changes %}20 <table class='pretty-table'>21 <tr>22 <th>Action</th>23 <th>Person</th>24 <th>Role</th>25 </tr>26 {% for verb, color, person, role in changes %}27 <tr><td style='background-color: {{color}}; color: black'>{{verb}}</td><td>{{person}}</td><td>{{role.display_name}}</td></tr>28 {% endfor %}29 </table>30 {% endif %}31 32 {%if edited %}33 <p>Untouched were {{kept}} filled people/role combinations and {{kept_not}} unfilled combinations.</p>34 {% endif %}35 18 36 19 <table class='pretty-table'> -
asadb/urls.py
rfbb362a r0b72bfd 29 29 url(r'^fysm/(?:(\d+)/)?(?:([\w-]+)/)?$', forms.views.fysm_by_years, name='fysm', ), 30 30 31 url(r'^membership/update/$', forms.views.group_membership_update, name='membership-update', ), 32 url(r'^membership/confirm/$', forms.views.person_membership_update, name='membership-confirm', ), 33 url( 34 r'^membership/thanks/$', 35 'django.views.generic.simple.direct_to_template', 36 {'template': 'membership/thanks.html', 'extra_context': { 'pagename':'groups' }, }, 37 name='membership-thanks', 38 ), 39 url(r'^membership/submitted/$', forms.views.View_GroupMembershipList.as_view(), name='membership-submitted', ), 40 url(r'^membership/admin/issues.csv$', forms.views.group_confirmation_issues, name='membership-issues', ), 41 31 42 # Group list 32 43 (r'^groups/', include(groups.urls.urls(), ), ), -
asadb/groups/urls.py
rfbb362a rb04e142 13 13 (r'^(?P<pk>\d+)/', include(group_patterns, ), ), 14 14 url(r'^$', groups.views.GroupListView.as_view(), name='list', ), 15 url(r'^create/(?P<status>\w+)?$', groups.views.create_group, name='create', ), 15 16 url(r'^search/$', groups.views.search_groups, name='search', ), 16 17 url(r'^recent_changes/$', groups.views.GroupHistoryView.as_view(), name='manage-history', ), -
asadb/groups/views.py
rfbb362a rb04e142 17 17 from django.core.urlresolvers import reverse 18 18 from django.core.mail import EmailMessage, mail_admins 19 from django.forms import Form20 from django.forms import ModelForm21 from django.forms import ModelChoiceField19 from django.forms import CharField, ModelChoiceField, MultipleChoiceField 20 from django.forms import Form, ModelForm 21 from django.forms import ValidationError 22 22 from django.db import connection 23 23 from django.db.models import Q … … 28 28 29 29 from util.db_form_utils import StaticWidget 30 30 from util.emails import email_from_template 31 32 33 34 ############ 35 # Homepage # 36 ############ 31 37 32 38 def view_homepage(request, ): … … 56 62 } 57 63 return render_to_response('index.html', context, context_instance=RequestContext(request), ) 64 65 66 67 ################ 68 # Single group # 69 ################ 70 71 class GroupDetailView(DetailView): 72 context_object_name = "group" 73 model = groups.models.Group 74 def get_context_data(self, **kwargs): 75 # Call the base implementation first to get a context 76 context = super(GroupDetailView, self).get_context_data(**kwargs) 77 group = context['group'] 78 79 # Indicate whether this person should be able to see "private" info 80 context['viewpriv'] = self.request.user.has_perm('groups.view_group_private_info', group) 81 context['adminpriv'] = self.request.user.has_perm('groups.admin_group', group) 82 context['notes'] = group.viewable_notes(self.request.user) 83 84 # People involved in the group 85 just_roles = groups.models.OfficerRole.objects.all() 86 if context['viewpriv'] or self.request.user.has_perm('groups.view_signatories'): 87 # Can see the non-public stuff 88 pass 89 else: 90 just_roles = just_roles.filter(publicly_visible=True) 91 roles = [] 92 for role in just_roles: 93 roles.append((role.display_name, role, group.officers(role=role), )) 94 context['roles'] = roles 95 96 return context 58 97 59 98 … … 136 175 request_obj.save() 137 176 form.save_m2m() 138 139 # Send email140 #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()161 177 msg = "Thanks for editing!" 162 178 else: … … 173 189 return render_to_response('groups/group_change_main.html', context, context_instance=RequestContext(request), ) 174 190 191 def validate_athena(username, student=False, ): 192 try: 193 person = groups.models.AthenaMoiraAccount.active_accounts.get(username=username) 194 if student and not person.is_student(): 195 raise ValidationError('This must be a current student.') 196 except groups.models.AthenaMoiraAccount.DoesNotExist: 197 raise ValidationError('This must be a valid Athena username.') 198 199 class GroupCreateForm(form_utils.forms.BetterModelForm): 200 create_which = MultipleChoiceField( 201 choices=[ 202 ('officer_email', 'officer list', ), 203 ('group_email', 'group list', ), 204 ('athena_locker', 'Athena locker', ), 205 ], 206 ) 207 208 president = CharField(min_length=3, max_length=8, ) 209 treasurer = CharField(min_length=3, max_length=8, ) 210 def clean_president(self, ): 211 username = self.cleaned_data['president'] 212 validate_athena(username, True, ) 213 return username 214 215 def clean_treasurer(self, ): 216 username = self.cleaned_data['treasurer'] 217 validate_athena(username, True, ) 218 return username 219 220 class Meta: 221 fieldsets = [ 222 ('basic', { 223 'legend': 'Basic Information', 224 'fields': ['name', 'abbreviation', 'activity_category', 'description', ], 225 }), 226 ('officers', { 227 'legend': 'Officers', 228 'fields': ['president', 'treasurer', ], 229 }), 230 ('technical', { 231 'legend': 'Technical Information', 232 'fields': ['officer_email', 'group_email', 'athena_locker', 'create_which', ], 233 }), 234 ('Category', { 235 'legend': 'Category', 236 'fields': ['group_status', 'group_class', ], 237 }), 238 ('financial', { 239 'legend': 'Financial Information', 240 'fields': ['group_funding', 'main_account_id', 'funding_account_id', ], 241 }), 242 ('more-info', { 243 'legend': 'Additional Information', 244 'fields': ['constitution_url', ], 245 }), 246 ] 247 model = groups.models.Group 248 249 250 @permission_required('groups.add_group') 251 def create_group(request, status=None,): 252 if not status: status = 'active' 253 groupstatus = get_object_or_404(groups.models.GroupStatus, slug=status) 254 255 msg = None 256 257 initial = { 258 'create_which': ['officer_email', 'group_email', 'athena_locker', ], 259 } 260 group = groups.models.Group() 261 group.group_status = groupstatus 262 group.recognition_date = datetime.datetime.now() 263 if request.method == 'POST': # If the form has been submitted... 264 # A form bound to the POST data 265 form = GroupCreateForm( 266 request.POST, request.FILES, 267 initial=initial, 268 instance=group, 269 ) 270 271 if form.is_valid(): # All validation rules pass 272 # Basic setup 273 group.set_updater(request.user) 274 form.save() 275 276 # Officers 277 groups.models.OfficeHolder( 278 person=form.cleaned_data['president'], 279 role=groups.models.OfficerRole.objects.get(slug='president'), 280 group=group, 281 ).save() 282 groups.models.OfficeHolder( 283 person=form.cleaned_data['treasurer'], 284 role=groups.models.OfficerRole.objects.get(slug='treasurer'), 285 group=group, 286 ).save() 287 officer_emails = [ 288 '%s@mit.edu' % (form.cleaned_data['president'], ), 289 '%s@mit.edu' % (form.cleaned_data['treasurer'], ), 290 ] 291 292 # Sending mail 293 mail_context = Context({ 294 'group': group, 295 'formdata': form.cleaned_data, 296 }) 297 298 # Welcome mail 299 email_from_template( 300 tmpl='groups/diffs/new-group-announce.txt', 301 context=mail_context, 302 subject='ASA Group Recognition: %s' % (group.name, ), 303 to=officer_emails, 304 cc=['asa-new-group-announce@mit.edu'], 305 from_email='asa-exec@mit.edu', 306 ).send() 307 if len(form.cleaned_data['create_which']) > 0: 308 email_from_template( 309 tmpl='groups/diffs/new-group-accounts.txt', 310 context=mail_context, 311 subject='New Student Activity: %s' % (group.name, ), 312 to=['accounts@mit.edu'], 313 cc=officer_emails+['asa-admin@mit.edu'], 314 from_email='asa-admin@mit.edu', 315 ).send() 316 317 318 return redirect(reverse('groups:group-detail', args=[group.pk])) 319 else: 320 msg = "Validation failed. See below for details." 321 322 else: 323 form = GroupCreateForm(initial=initial, instance=group, ) # An unbound form 324 325 context = { 326 'form': form, 327 'msg': msg, 328 'pagename': 'groups', 329 } 330 return render_to_response('groups/group_create.html', context, context_instance=RequestContext(request), ) 331 332 ################## 333 # Multiple group # 334 ################## 175 335 176 336 class GroupFilter(django_filters.FilterSet): … … 208 368 context['pagename'] = 'groups' 209 369 context['filter'] = self.filterset 210 return context211 212 213 class GroupDetailView(DetailView):214 context_object_name = "group"215 model = groups.models.Group216 def get_context_data(self, **kwargs):217 # Call the base implementation first to get a context218 context = super(GroupDetailView, self).get_context_data(**kwargs)219 group = context['group']220 221 # Indicate whether this person should be able to see "private" info222 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 group227 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 stuff230 pass231 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'] = roles237 238 return context239 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 = None247 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_entries258 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"266 370 return context 267 371 … … 439 543 } 440 544 return render_to_response('groups/group_search.html', context, context_instance=RequestContext(request), ) 545 546 547 class GroupHistoryView(ListView): 548 context_object_name = "version_list" 549 template_name = "groups/group_version.html" 550 551 def get_queryset(self): 552 history_entries = None 553 if 'pk' in self.kwargs: 554 group = get_object_or_404(groups.models.Group, pk=self.kwargs['pk']) 555 history_entries = reversion.models.Version.objects.get_for_object(group) 556 else: 557 history_entries = reversion.models.Version.objects.all() 558 group_content_type = ContentType.objects.get_for_model(groups.models.Group) 559 history_entries = history_entries.filter(content_type=group_content_type) 560 length = len(history_entries) 561 if length > 150: 562 history_entries = history_entries[length-100:] 563 return history_entries 564 565 def get_context_data(self, **kwargs): 566 context = super(GroupHistoryView, self).get_context_data(**kwargs) 567 if 'pk' in self.kwargs: 568 group = get_object_or_404(groups.models.Group, pk=self.kwargs['pk']) 569 context['title'] = "History for %s" % (group.name, ) 570 else: 571 context['title'] = "Recent Changes" 572 return context -
asadb/media/style/style.css
rf0a4fc4 r754d5a4 236 236 text-align: center; 237 237 } 238 239 /********* 240 * FORMS * 241 *********/ 242 243 form table tr.optional th 244 { 245 font-weight: normal; 246 font-style: italic; 247 }
Note: See TracChangeset
for help on using the changeset viewer.