예제 #1
0
def award_points(request, answer_id, queryset=Answer.objects.all()):
    """ do transfer point from question's author to answerer """
    answer = get_object_or_404(queryset, id=answer_id)
    
    if request.user == answer.author:
        raise Http404(_(u'You can not award yourself!'))
    elif answer.question.author != request.user:
        raise Http404(_(u'This is not your question!'))
    elif answer.question.bounty_points:
        points = answer.question.bounty_points
        reason=ugettext(u'Award points to answer: %(answer)s') % {'answer': answer }
        try:
            UnitPack.consume(request.user, quantity=points, reason=reason)
        except ValueError, msg:
            url = construct_main_site_url(reverse('prepaid-index', urlconf=settings.MUACCOUNTS_MAIN_URLCONF))
            if request.is_ajax():
                data = simplejson.dumps({'not_enough_credits': '1',
                                         'available_credits': UnitPack.get_user_credits(request.user),
                                         'required_credits': points,
                                         'awarded': '0'})
                return HttpResponse(data, mimetype="application/json")
            else:
                return HttpResponseRedirect(url)
        else:
            UnitPack.credit(answer.author, quantity=points, reason=reason)
            PointAward(answer=answer, points=points).save()
            
            if request.is_ajax():
                data = simplejson.dumps({'not_enough_credits': '0', 
                                         'awarded': '1'})
                return HttpResponse(data, mimetype="application/json")
            else:
                return redirect(answer)
예제 #2
0
def ask(request, form_class=MuAskForm, template_name='ask.html'):
    if request.method == "POST":
        form = form_class(request.POST)
        if request.muaccount.is_bounty:
            form.fields['bounty_points'].max_value = UnitPack.get_user_credits(request.user)
        if form.is_valid():
            question = form.save(request)
            return redirect(question)
    else:
        form = form_class()
        if request.muaccount.is_bounty:
            form.fields['bounty_points'].max_value = UnitPack.get_user_credits(request.user)

    tags = _get_tags_cache_json(queryset=Tag.objects.filter(deleted=False, 
                                            questions__muaccount=request.muaccount))
    return render_to_response(template_name, {
                              'form': form,
                              'tags': tags,
                              }, context_instance=RequestContext(request))
예제 #3
0
def activity_site_advertise(request, object_id):
	obj = get_object_or_404(Activity, pk=object_id, user=request.user, published=True).derived
	
	if request.method == 'POST' and not obj.date_site_advertised:
		# Publish to site's twitter profile
		# obj.site_advertise()
		site_twitter = get_site_twitter_info(obj)
		cost = site_twitter['cost']
		need = cost - UnitPack.get_user_credits(request.user)
		if need <= 0:
			msg = 'Posted to %s\'s twitter profile' % site_twitter['user']
			global_tweet(obj.message)
			if cost > 0:
				UnitPack.consume(request.user, cost, reason=msg)
			request.user.message_set.create(message=msg)
			obj.date_site_advertised = datetime.datetime.now()
			obj.save()
		else:
			request.user.message_set.create(message='Sorry, you need %s more points' % need)
				
	return HttpResponseRedirect(obj.get_manage_url())
예제 #4
0
def task_create(request):
	form_class = AddTaskForm
	
	if request.method == 'POST':
		form = form_class(request.POST, request.FILES)
		
		if form.is_valid():
			budget = form.cleaned_data['budget']
			if budget > UnitPack.get_user_credits(request.user):
				form.errors['budget'] = ['Your budget cannot be higher than your current points']
			else:
				task = form.save(commit=False)
				task.user = request.user
				task.budget = budget
				task.save()
				task.tags = form.cleaned_data['tags']
				if form.cleaned_data['attachment']:
					task.attach(form.cleaned_data['attachment'])
				if task.budget > 0:
					UnitPack.consume(request.user, budget, reason=BUDGET_REASON % {'task':task.name})
				return redirect('tasks-task_setup', task.id)
	else:
		form = form_class(initial=_get_and_delete_form_data(request))
	return {'form':form}
예제 #5
0
def show_user_credits(user):
	return UnitPack.get_user_credits(user)
예제 #6
0
def task_do(request, object_id):
	task = get_object_or_404(Task, pk=object_id, published=True)
	if task.is_expired():
		return _activity_expired(request, task)
	
	# Create or retrieve achievement
	achievement = None
	remaining = task.get_chances_remaining(request.user)
	try:
		achievement = Achievement.objects.get(user=request.user, task=task, complete=False)
		if achievement.is_expired:
			# Reset achievement time as long as there is room on the waiting list
			if remaining > 0:
				achievement.date_started = datetime.datetime.now()
			else:
				request.user.message_set.create(message='Sorry, your time to complete this task has run out.')
				return redirect('tasks-task_detail', task.id)
	except Achievement.DoesNotExist:
		if remaining > 0:
			a = Achievement()
			a.task = task
			a.user = request.user
			a.save()
			achievement = a
			
	if not achievement:
		request.user.message_set.create(message='Sorry, you can\'t do that.')
	
	if request.method == 'POST':
		try:
			questions = task.questions.all()
			modified = []
			errors = []
			for form_id, question in zip(range(1, questions.count()+1), questions):
				typ = question.type
				data = question.data
				error = None
				if typ == 'poll':
					choices = map(int, request.POST.getlist('choice%s' % form_id))
					for choice in choices:
						data['answers'][choice]['count'] += 1
					
				elif typ == 'text':
					answer = request.POST['answer%s' % form_id].strip()
					if len(answer):
						data['answers'].append(answer)
					else:
						error = 'You must answer the question!'
				else:
					error = 'Invalid Task'
				"""
				elif typ == TaskType.QUIZ:
					choice = int(request.POST['choice'])
					if choice != data['answer']:
						error = 'Sorry, you answered incorrectly.'
					
				elif typ == TaskType.POST:
					request.twitter.set_status(data['message'])
				"""
				
					
				if error:
					errors.append(error)
					question.error = error
				else:
					question.data = data
				modified.append(question)
					
			if errors:
				# FIXME: Delete achievement and form if theres an error??
				# Maybe it should reload the form with info filled in somehow
				#achievement.delete()
				#return redirect('tasks-task_detail', task.id)
				return {'task':task, 'questions':modified}
			else:
				# No errors, yay!
				for m in modified:
					m.save()
				task.budget -= task.points
				task.save()
				
				achievement.complete = True
				achievement.save()
				if task.points > 0:
					UnitPack.credit(request.user, task.points, reason=COMPLETED_REASON % {'task':task.name})
					request.user.message_set.create(message='You earned %s points. How exciting!' % task.points)
				else:
					request.user.message_set.create(message='You didn\'t earn any points. But at least you had fun!')
				
				return redirect('tasks-task_detail', task.id)
			
		except KeyError, e:
			request.user.message_set.create(message='Error: Please complete all required fields')
예제 #7
0
	def delete(self):
		if self.budget > 0:
			UnitPack.credit(self.user, self.budget)
		super(Task, self).delete()