def draw_prize_winners(request): currentEvent = viewutil.get_selected_event(request) params = {'feed': 'todraw'} if currentEvent is not None: params['event'] = currentEvent.id prizes = search_filters.run_model_query('prize', params, user=request.user) if request.method == 'POST': form = forms.DrawPrizeWinnersForm(prizes=prizes, data=request.POST) if form.is_valid(): for prize in form.cleaned_data['prizes']: status = True while status and not prize.maxed_winners(): status, data = prizeutil.draw_prize( prize, seed=form.cleaned_data['seed']) prize.error = data['error'] if not status else '' logutil.change(request, prize, 'Prize Drawing') return render( request, 'admin/draw_prize_winners_post.html', {'prizes': form.cleaned_data['prizes']}, ) else: form = forms.DrawPrizeWinnersForm(prizes=prizes) return render(request, 'admin/draw_prize_winners.html', {'form': form})
def bid_set_state_action(self, request, queryset, value, recursive=False): if not request.user.has_perm('tracker.can_edit_locked_event'): unchanged = queryset.filter(event__locked=True) if unchanged.exists(): messages.warning( request, '%d bid(s) unchanged due to the event being locked.' % unchanged.count(), ) queryset = queryset.filter(event__locked=False) if not recursive: unchanged = queryset.filter(parent__isnull=False) if unchanged.exists(): messages.warning( request, '%d bid(s) possibly unchanged because you can only use the dropdown on top level bids.' % unchanged.count(), ) queryset = queryset.filter(parent__isnull=True) total = queryset.count() for b in queryset: b.state = value b.clean() b.save( ) # can't use queryset.update because that doesn't send the post_save signals logutil.change(request, b, ['state']) if total and not recursive: messages.success(request, '%d bid(s) changed to %s.' % (total, value)) return total
def merge_donors_view(request): if request.method == 'POST': objects = [int(x) for x in request.POST['objects'].split(',')] form = forms.MergeObjectsForm(model=models.Donor, objects=objects, data=request.POST) if form.is_valid(): viewutil.merge_donors(form.cleaned_data['root'], form.cleaned_data['objects']) logutil.change( request, form.cleaned_data['root'], 'Merged donor {0} with {1}'.format( form.cleaned_data['root'], ','.join( [str(d) for d in form.cleaned_data['objects']]), ), ) return HttpResponseRedirect( reverse('admin:tracker_donor_changelist')) else: objects = [int(x) for x in request.GET['objects'].split(',')] form = forms.MergeObjectsForm(model=models.Donor, objects=objects) return render(request, 'admin/tracker/merge_donors.html', {'form': form})
def edit(request): edit_params = request.POST edit_type = edit_params['type'] Model = modelmap.get(edit_type, None) if Model is None: raise KeyError('%s is not a recognized model type' % edit_type) Model = modelmap[edit_type] model_admin = get_admin(Model) obj = Model.objects.get(pk=edit_params['id']) if not model_admin.has_change_permission(request, obj): raise PermissionDenied( 'You do not have permission to change that object') good_fields = filter_fields(edit_params.keys(), model_admin, request) bad_fields = set(good_fields) - set(edit_params.keys()) if bad_fields: raise PermissionDenied( 'You do not have permission to set the following field(s) on the requested object: %s' % ','.join(sorted(bad_fields))) changed_fields = [] for k, v in edit_params.items(): if k in ('type', 'id'): continue old_value = getattr(obj, k) if hasattr(old_value, 'all'): # accounts for m2m relationships old_value = [str(x) for x in old_value.all()] new_value = parse_value(Model, k, v, request.user) if type(new_value) == list: # accounts for m2m relationships getattr(obj, k).set(new_value) new_value = [str(x) for x in new_value] else: setattr(obj, k, new_value) if str(old_value) != str(new_value): if old_value and not new_value: changed_fields.append('Changed %s from "%s" to empty.' % (k, old_value)) elif not old_value and new_value: changed_fields.append('Changed %s from empty to "%s".' % (k, new_value)) else: changed_fields.append('Changed %s from "%s" to "%s".' % (k, old_value, new_value)) obj.full_clean() models = obj.save() or [obj] if changed_fields: logutil.change(request, obj, ' '.join(changed_fields)) resp = HttpResponse( serializers.serialize('json', models, ensure_ascii=False), content_type='application/json;charset=utf-8', ) if 'queries' in request.GET and request.user.has_perm( 'tracker.view_queries'): return HttpResponse( json.dumps(connection.queries, ensure_ascii=False, indent=1), content_type='application/json;charset=utf-8', ) return resp
def merge_donors_view(request, *args, **kwargs): if request.method == 'POST': objects = map(lambda x: int(x), request.POST['objects'].split(',')) form = forms.MergeObjectsForm(model=tracker.models.Donor,objects=objects, data=request.POST) if form.is_valid(): viewutil.merge_donors(form.cleaned_data['root'], form.cleaned_data['objects']) logutil.change(request, form.cleaned_data['root'], u'Merged donor {0} with {1}'.format(form.cleaned_data['root'], ','.join(map(lambda d: unicode(d), form.cleaned_data['objects'])))) return HttpResponseRedirect(reverse('admin:tracker_donor_changelist')) else: donors = map(lambda x: int(x), request.GET['objects'].split(',')) form = forms.MergeObjectsForm(model=tracker.models.Donor,donors=donors) return render(request, 'admin/merge_donors.html', dictionary={'form': form})
def prize_key_import(request, prize): try: prize = models.Prize.objects.get(pk=prize) except models.Prize.DoesNotExist: raise Http404 if not prize.key_code: messages.error(request, 'Cannot import prize keys to non key prizes.') return HttpResponseRedirect( reverse('admin:tracker_prize_changelist')) if prize.event.locked and not request.user.has_perm( 'tracker.can_edit_locked_events'): raise PermissionDenied form = PrizeKeyImportForm( data=request.POST if request.method == 'POST' else None) if form.is_valid(): models.PrizeKey.objects.bulk_create([ models.PrizeKey(prize=prize, key=key) for key in form.cleaned_data['keys'] ]) prize.save() count = len(form.cleaned_data['keys']) logutil.change(request, prize, 'Added %d key(s).' % count) messages.info(request, '%d key(s) added to prize.' % count) return HttpResponseRedirect( reverse('admin:tracker_prize_changelist')) return render( request, 'admin/generic_form.html', { 'site_header': 'Donation Tracker', 'title': 'Import keys for %s' % prize, 'breadcrumbs': ( ( reverse('admin:app_list', kwargs=dict(app_label='tracker')), 'Tracker', ), (reverse('admin:tracker_prize_changelist'), 'Prizes'), (reverse('admin:tracker_prize_change', args=(prize.id, )), prize), (None, 'Import Keys'), ), 'form': form, 'action': request.path, }, )
def draw_prize(request): try: if not request.user.has_perm('tracker.change_prize'): return HttpResponse('Access denied',status=403,content_type='text/plain;charset=utf-8') requestParams = viewutil.request_params(request) id = int(requestParams['id']) prize = Prize.objects.get(pk=id) if prize.maxed_winners(): maxWinnersMessage = "Prize: " + prize.name + " already has a winner." if prize.maxwinners == 1 else "Prize: " + prize.name + " already has the maximum number of winners allowed." return HttpResponse(json.dumps({'error': maxWinnersMessage}),status=409,content_type='application/json;charset=utf-8') skipKeyCheck = requestParams.get('skipkey', False) if not skipKeyCheck: eligible = prize.eligible_donors() if not eligible: return HttpResponse(json.dumps({'error': 'Prize has no eligible donors'}),status=409,content_type='application/json;charset=utf-8') key = hash(json.dumps(eligible)) if 'key' not in requestParams: return HttpResponse(json.dumps({'key': key}),content_type='application/json;charset=utf-8') else: try: inputKey = type(key)(requestParams['key']) if inputKey != key: return HttpResponse(json.dumps({'error': 'Key field did not match expected value'},ensure_ascii=False),status=400,content_type='application/json;charset=utf-8') except (ValueError,KeyError),e: return HttpResponse(json.dumps({'error': 'Key field was missing or malformed', 'exception': '%s %s' % (type(e),e)},ensure_ascii=False),status=400,content_type='application/json;charset=utf-8') if 'queries' in request.GET and request.user.has_perm('tracker.view_queries'): return HttpResponse(json.dumps(connection.queries, ensure_ascii=False, indent=1),content_type='application/json;charset=utf-8') limit = requestParams.get('limit', prize.maxwinners) if not limit: limit = prize.maxwinners currentCount = prize.current_win_count() status = True results = [] while status and currentCount < limit: status, data = prizeutil.draw_prize(prize, seed=requestParams.get('seed',None)) if status: currentCount += 1 results.append(data) logutil.change(request,prize,u'Picked winner. %.2f,%.2f' % (data['sum'],data['result'])) return HttpResponse(json.dumps({'success': results}, ensure_ascii=False),content_type='application/json;charset=utf-8') else: return HttpResponse(json.dumps(data),status=400,content_type='application/json;charset=utf-8')
def show_completed_bids(request): current = viewutil.get_selected_event(request) params = {'feed': 'completed'} if current: params['event'] = current.id bids = filters.run_model_query('bid', params, user=request.user, mode='admin') bidList = list(bids) if request.method == 'POST': for bid in bidList: bid.state = 'CLOSED' bid.save() logutil.change(request, bid, u'Closed {0}'.format(unicode(bid))) return render(request, 'admin/completed_bids_post.html', { 'bids': bidList }) return render(request, 'admin/completed_bids.html', { 'bids': bidList })
def add(request): add_params = request.POST add_type = add_params['type'] Model = modelmap.get(add_type, None) if Model is None: raise KeyError('%s is not a recognized model type' % add_type) model_admin = get_admin(Model) if not model_admin.has_add_permission(request): raise PermissionDenied( 'You do not have permission to add a model of the requested type' ) good_fields = filter_fields(add_params.keys(), model_admin, request) bad_fields = set(good_fields) - set(add_params.keys()) if bad_fields: raise PermissionDenied( 'You do not have permission to set the following field(s) on new objects: %s' % ','.join(sorted(bad_fields)) ) newobj = Model() changed_fields = [] m2m_collections = [] for k, v in add_params.items(): if k in ('type', 'id'): continue new_value = parse_value(Model, k, v, request.user) if type(new_value) == list: # accounts for m2m relationships m2m_collections.append((k, new_value)) new_value = [str(x) for x in new_value] else: setattr(newobj, k, new_value) changed_fields.append('Set %s to "%s".' % (k, new_value)) newobj.full_clean() models = newobj.save() or [newobj] for k, v in m2m_collections: getattr(newobj, k).set(v) logutil.addition(request, newobj) logutil.change(request, newobj, ' '.join(changed_fields)) resp = HttpResponse( serializers.serialize('json', models, ensure_ascii=False), content_type='application/json;charset=utf-8', ) if 'queries' in request.GET and request.user.has_perm('tracker.view_queries'): return HttpResponse( json.dumps(connection.queries, ensure_ascii=False, indent=1), content_type='application/json;charset=utf-8', ) return resp
def edit(request): try: editParams = viewutil.request_params(request) edittype = editParams['type'] if not request.user.has_perm('tracker.change_' + permmap.get(edittype,edittype)): return HttpResponse('Access denied',status=403,content_type='text/plain;charset=utf-8') Model = modelmap[edittype] obj = Model.objects.get(pk=editParams['id']) changed = [] for k,v in editParams.items(): if k in ('type','id'): continue v = parse_value(k, v) if unicode(getattr(obj, k)) != unicode(v): changed.append(k) setattr(obj,k, v) obj.full_clean() models = obj.save() or [obj] if changed: logutil.change(request,obj,u'Changed field%s %s.' % (len(changed) > 1 and 's' or '', ', '.join(changed))) resp = HttpResponse(serializers.serialize('json', models, ensure_ascii=False),content_type='application/json;charset=utf-8') if 'queries' in request.GET and request.user.has_perm('tracker.view_queries'): return HttpResponse(json.dumps(connection.queries, ensure_ascii=False, indent=1),content_type='application/json;charset=utf-8') return resp except IntegrityError as e: return HttpResponse(json.dumps({'error': u'Integrity error: %s' % e}, ensure_ascii=False), status=400, content_type='application/json;charset=utf-8') except ValidationError as e: d = {'error': u'Validation Error'} if hasattr(e,'message_dict') and e.message_dict: d['fields'] = e.message_dict if hasattr(e,'messages') and e.messages: d['messages'] = e.messages return HttpResponse(json.dumps(d, ensure_ascii=False), status=400, content_type='application/json;charset=utf-8') except AttributeError as e: return HttpResponse(json.dumps({'error': 'Attribute Error, malformed edit parameters', 'exception': unicode(e)}, ensure_ascii=False), status=400, content_type='application/json;charset=utf-8') except KeyError as e: return HttpResponse(json.dumps({'error': 'Key Error, malformed edit parameters', 'exception': unicode(e)}, ensure_ascii=False), status=400, content_type='application/json;charset=utf-8') except FieldError as e: return HttpResponse(json.dumps({'error': 'Field Error, malformed edit parameters', 'exception': unicode(e)}, ensure_ascii=False), status=400, content_type='application/json;charset=utf-8') except ValueError as e: return HttpResponse(json.dumps({'error': u'Value Error: %s' % e}, ensure_ascii=False), status=400, content_type='application/json;charset=utf-8') except ObjectDoesNotExist as e: return HttpResponse(json.dumps({'error': 'Foreign Key could not be found', 'exception': unicode(e)}, ensure_ascii=False), status=400, content_type='application/json;charset=utf-8')
def draw_prize_winners(request): currentEvent = viewutil.get_selected_event(request) params = { 'feed': 'todraw' } if currentEvent != None: params['event'] = currentEvent.id prizes = filters.run_model_query('prize', params, user=request.user, mode='admin') if request.method == 'POST': form = forms.DrawPrizeWinnersForm(prizes=prizes, data=request.POST) if form.is_valid(): for prize in form.cleaned_data['prizes']: status = True while status and not prize.maxed_winners(): status, data = prizeutil.draw_prize(prize, seed=form.cleaned_data['seed']) prize.error = data['error'] if not status else '' logutil.change(request, prize, 'Prize Drawing') return render(request, 'admin/draw_prize_winners_post.html', { 'prizes': form.cleaned_data['prizes'] }) else: form = forms.DrawPrizeWinnersForm(prizes=prizes) return render(request, 'admin/draw_prize_winners.html', { 'form': form })
def bid_set_state_action(modeladmin, request, queryset, value, recursive=False): if not request.user.has_perm('tracker.can_edit_locked_event'): unchanged = queryset.filter(event__locked=True) if unchanged.exists(): messages.warning(request, '%d bid(s) unchanged due to the event being locked.' % unchanged.count()) queryset = queryset.filter(event__locked=False) if not recursive: unchanged = queryset.filter(parent__isnull=False) if unchanged.exists(): messages.warning(request, '%d bid(s) possibly unchanged because you can only use the dropdown on top level bids.' % unchanged.count()) queryset = queryset.filter(parent__isnull=True) total = queryset.count() for b in queryset: b.state = value b.clean() b.save() # can't use queryset.update because that doesn't send the post_save signals logutil.change(request, b, ['state']) if total and not recursive: messages.success(request, '%d bid(s) changed to %s.' % (total,value)) return total