Example #1
0
 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})
Example #2
0
 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
Example #3
0
 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})
Example #4
0
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
Example #5
0
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})
Example #6
0
 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,
         },
     )
Example #7
0
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')
Example #8
0
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 })
Example #9
0
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')
Example #10
0
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
Example #11
0
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')
Example #12
0
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 })
Example #13
0
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')
Example #14
0
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