def comment_delete(request, comment_pk): comment = get_object_or_404(Comment, pk=comment_pk) comment.is_deleted = True comment.save() messages.success(request, 'Comment was successfully deleted') return HttpResponseRedirect(reverse('front_page'))
def skill_start(request, skill_id): skill = get_object_or_404(Skill, pk=skill_id) request.user.skills_in_progress.add(skill) messages.success(request, 'You are now taking this skill') return HttpResponseRedirect(skill.get_absolute_url())
def topic_new(request): if request.method == 'POST': form = TopicForm(request.POST) if form.is_valid(): # Save topic = form.save(commit=False) topic.author = request.user topic.slug = slugify(topic.name) if topic.slug == '': pass # TODO: Reject a topic resulting in an empty slug. topic.save() # messages.success(request, 'Project was successfully saved') if request.is_ajax(): d = { 'name': topic.name, 'deleteURL': reverse('skills:topic_delete', args=[topic.pk]) } return HttpResponse(json.dumps(d), content_type='application/json', status=201) else: messages.success(request, 'Topic was successfully saved') else: if request.is_ajax(): return HttpResponse(json.dumps(form.errors), content_type='application/json', status=404) return HttpResponseRedirect(reverse('trainer_dashboard'))
def project_flag(request, project_pk): project = get_object_or_404(Project, pk=project_pk) project.is_flagged = True project.save() messages.success(request, 'Project was successfully flagged') return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
def topic_new(request): if request.method == 'POST': form = TopicForm(request.POST) if form.is_valid(): # Save topic = form.save(commit=False) topic.author = request.user topic.slug = slugify(topic.name) if topic.slug == '': pass # TODO: Reject a topic resulting in an empty slug. topic.save() # messages.success(request, 'Project was successfully saved') if request.is_ajax(): d = {'name': topic.name, 'deleteURL': reverse('skills:topic_delete', args=[topic.pk])} return HttpResponse(json.dumps(d), content_type='application/json', status=201) else: messages.success(request, 'Topic was successfully saved') else: if request.is_ajax(): return HttpResponse(json.dumps(form.errors), content_type='application/json', status=404) return HttpResponseRedirect(reverse('trainer_dashboard'))
def topic_delete(request, topic_pk): topic = get_object_or_404(Topic, pk=topic_pk) # if request.method == 'POST': if request.user.has_perm('skills.delete_topic', topic): topic.delete() if request.is_ajax(): d = {'message': 'Topic was deleted'} return HttpResponse(json.dumps(d), content_type='application/json', status=201) else: messages.success(request, 'Topic was successfully deleted') return HttpResponseRedirect(reverse('trainer_dashboard')) else: # User doesn't have permission if request.is_ajax(): return HttpResponse(json.dumps(form.errors), content_type='application/json', status=404) else: messages.error(request, 'You don\'t have permission to delete this topic') return HttpResponseRedirect(reverse('trainer_dashboard'))
def comment_flag(request, comment_pk): comment = get_object_or_404(Comment, pk=comment_pk) comment.is_flagged = True comment.save() messages.success(request, 'Comment was successfully flagged') return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
def like(request): if request.method == 'POST': # If the form has been submitted... like = Like.objects.filter(object_id=request.POST['object_id'], content_type=request.POST['content_type'], author__pk=request.user.pk) print(len(like)) if like.exists(): like.delete() if request.is_ajax(): d = {'success': 'SUCCESS!!!!11'} return HttpResponse(json.dumps(d), content_type='application/json', status=201) else: messages.info(request, 'You no longer like this %s' % like.content_type) return HttpResponseRedirect(request.META.get('HTTP_REFERER')) else: like = Like(author=request.user) form = LikeForm(request.POST, instance=like) if form.is_valid(): like = form.save(commit=False) like.author = request.user like.save() if request.is_ajax(): d = {'success': 'SUCCESS!!!!11'} return HttpResponse(json.dumps(d), content_type='application/json', status=201) else: messages.success(request, 'Like absorbed') return HttpResponseRedirect(request.META.get('HTTP_REFERER')) else: messages.error(request, 'Form invalid %s' % form.errors) return HttpResponse(json.dumps(form.errors), content_type='application/json', status=404) else: messages.error(request, 'Did not like') return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
def skill_delete(request, skill_id): skill = get_object_or_404(Skill, pk=skill_id) if request.user.has_perm('skills.delete_skill', skill): skill.delete() messages.success(request, 'The skill was deleted') return HttpResponseRedirect(reverse('skills:skills_overview')) else: messages.error(request, 'You do not have permission to delete this skill') return HttpResponseRedirect(skill.get_absolute_url())
def project_delete(request, project_pk): project = get_object_or_404(Project, pk=project_pk) if request.user.has_perm('skills.project_delete', project): project.is_deleted = True project.save() messages.success(request, 'Project was successfully deleted') else: messages.success(request, 'You do not have permissions to delete this project') return HttpResponseRedirect(reverse('front_page'))
def trainingbit_view(request, slug=None): trainingbit = get_object_or_404(TrainingBit, slug=slug) if trainingbit.is_draft and not (request.user.is_authenticated() and request.user.is_trainer): raise Http404 form = ProjectForm() missing_required_fields = [] if request.method == 'POST': form = ProjectForm(request.POST, request.FILES) if form.is_valid(): # Save project = form.save(commit=False) project.author = request.user project.trainingbit = trainingbit project.save() messages.success(request, 'Project was successfully saved') # complete trainingbit request.user.complete_trainingbit(trainingbit) request.session['completed_trainingbit_pk'] = trainingbit.pk # complete skills completed_skills = get_completed_skills(request.user, trainingbit) request.user.complete_skills(completed_skills) request.session['completed_skill_pks'] = [s.pk for s in completed_skills] return HttpResponseRedirect(project.get_absolute_url()) else: # "Hack" in order to provide the desired error message for name, field in form.fields.items(): try: field.validate(form[name].value()) except ValidationError as e: if e.code == 'required': if name == 'name': name = 'title' missing_required_fields.append(name) if request.is_ajax(): return HttpResponse(json.dumps(form.errors), content_type='application/json', status=404) return render(request, 'skills/trainingbit_view.html', { 'trainingbit': trainingbit, 'projects': trainingbit.project_set.filter(is_deleted=False).order_by('-created_at').prefetch_related('author'), 'next': reverse('skills:trainingbit_view', kwargs={'slug': trainingbit.slug}), 'back_url': reverse('skills:trainingbit_cover', kwargs={'slug': trainingbit.slug}), 'form': form, 'missing_required_fields': missing_required_fields, })
def page_edit(request, page_pk): flatpage = get_object_or_404(GCLFlatPage, pk=page_pk) if request.method == 'POST': flatpage.content = request.POST['content'] flatpage.save() messages.success(request, 'Successfully updated page "%s"' % flatpage.title) return HttpResponseRedirect(reverse('django.contrib.flatpages.views.flatpage', args=[flatpage.url])) else: return HttpResponseRedirect(reverse('front_page'))
def user_delete(request, user_id): user = User.objects.get(id__exact=user_id) if user == request.user: user.delete() messages.success(request, 'Successfully deleted your user.') else: messages.error(request, 'You do not have permissions to delete this user.') return HttpResponseRedirect(reverse('front_page'))
def user_upgrade_to_trainer(request, user_id): user = User.objects.get(id__exact=user_id) if request.user.is_admin: g = Group.objects.get(name='Trainers') g.user_set.add(user) messages.success(request, 'Successfully upgraded %s to be a trainer.' % user.username) else: messages.error(request, 'You do not have permissions to upgrade this user.') return HttpResponseRedirect(reverse('profile', args=[user_id]))
def trainingbit_recommend(request, trainingbit_id): trainingbit = get_object_or_404(TrainingBit, pk=trainingbit_id) if request.user.has_perm('skills.recommend_trainingbit', trainingbit): if trainingbit.is_recommended: trainingbit.is_recommended = False messages.info(request, 'The training bit is no longer recommended') else: trainingbit.is_recommended = True messages.success(request, 'Successfully recommended training bit') trainingbit.save() return HttpResponseRedirect(trainingbit.get_absolute_url()) else: messages.error(request, 'You do not have permission to recommend this training bit') return HttpResponseRedirect(trainingbit.get_absolute_url())
def page_edit(request, page_pk): flatpage = get_object_or_404(GCLFlatPage, pk=page_pk) if request.method == 'POST': flatpage.content = request.POST['content'] flatpage.save() messages.success(request, 'Successfully updated page "%s"' % flatpage.title) return HttpResponseRedirect( reverse('django.contrib.flatpages.views.flatpage', args=[flatpage.url])) else: return HttpResponseRedirect(reverse('front_page'))
def skill_recommend(request, skill_id): skill = get_object_or_404(Skill, pk=skill_id) if request.user.has_perm('skills.recommend_skill', skill): if skill.is_recommended: skill.is_recommended = False messages.info(request, 'The skill is no longer recommended') else: skill.is_recommended = True messages.success(request, 'Successfully recommended skill') skill.save() return HttpResponseRedirect(skill.get_absolute_url()) else: messages.error(request, 'You do not have permission to recommend this skill') return HttpResponseRedirect(skill.get_absolute_url())
def page_new(request): if request.method == 'POST': flatpage = GCLFlatPage() flatpage.url = '/' + request.POST['title'].replace(' ', '-').lower() + '/' flatpage.title = request.POST['title'] flatpage.content = request.POST['content'] flatpage.save() flatpage.sites.add(*Site.objects.all()) messages.success(request, 'Successfully created page "%s"' % flatpage.title) return HttpResponseRedirect(reverse('django.contrib.flatpages.views.flatpage', args=[flatpage.url])) else: return HttpResponseRedirect(reverse('trainer_dashboard'))
def skill_publicize(request, skill_id): skill = get_object_or_404(Skill, pk=skill_id) if request.user.has_perm('skills.skill_publicize', skill): if skill.is_draft: skill.is_draft = False messages.info(request, 'The skill is now public') else: skill.is_draft = True messages.success(request, 'Reverted skill to draft status') skill.save() else: messages.error(request, 'You do not have permission to make this skill public') return HttpResponseRedirect(skill.get_absolute_url())
def user_upgrade_to_trainer(request, user_id): user = User.objects.get(id__exact=user_id) if request.user.is_admin: g = Group.objects.get(name='Trainers') g.user_set.add(user) messages.success( request, 'Successfully upgraded %s to be a trainer.' % user.username) else: messages.error(request, 'You do not have permissions to upgrade this user.') return HttpResponseRedirect(reverse('profile', args=[user_id]))
def trainingbit_recommend(request, trainingbit_id): trainingbit = get_object_or_404(TrainingBit, pk=trainingbit_id) if request.user.has_perm('skills.recommend_trainingbit', trainingbit): if trainingbit.is_recommended: trainingbit.is_recommended = False messages.info(request, 'The training bit is no longer recommended') else: trainingbit.is_recommended = True messages.success(request, 'Successfully recommended training bit') trainingbit.save() return HttpResponseRedirect(trainingbit.get_absolute_url()) else: messages.error( request, 'You do not have permission to recommend this training bit') return HttpResponseRedirect(trainingbit.get_absolute_url())
def trainingbit_edit_content(request, slug=None): trainingbit = get_object_or_404(TrainingBit, slug=slug) # If a form has been submitted if request.method == 'POST': # Save the training bit trainingbit.json_content = request.POST['trainingbit_content_json'] trainingbit.save() messages.success(request, 'Saved training bit') # If nothing has been POSTed just show the `edit_content` page return render(request, 'skills/trainingbit_edit_content.html', { 'trainingbit': trainingbit, 'back_url': reverse('skills:trainingbit_edit', kwargs={'slug': trainingbit.slug}), })
def page_new(request): if request.method == 'POST': flatpage = GCLFlatPage() flatpage.url = '/' + request.POST['title'].replace(' ', '-').lower() + '/' flatpage.title = request.POST['title'] flatpage.content = request.POST['content'] flatpage.save() flatpage.sites.add(*Site.objects.all()) messages.success(request, 'Successfully created page "%s"' % flatpage.title) return HttpResponseRedirect( reverse('django.contrib.flatpages.views.flatpage', args=[flatpage.url])) else: return HttpResponseRedirect(reverse('trainer_dashboard'))
def comment_post(request): if request.method == 'POST': # If the form has been submitted... form = CommentForm(request.POST) if form.is_valid(): # Save comment = form.save(commit=False) comment.author = request.user project = comment.project if 'parent_pk' in request.POST: comment.parent = Comment.objects.get( pk__exact=request.POST['parent_pk']) # comment.project = project comment.save() if request.is_ajax(): comment_html = render_to_string( 'skills/partials/comment_entry.html', { 'comment': comment, }) # return rendered: # * comment d = { 'comment_html': comment_html, } # The 201 HTTP status code is from my reading of the standard # the # correct response to a POST which successfully created a # new object. # See: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.2 return HttpResponse(json.dumps(d), content_type='application/json', status=201) else: messages.success(request, 'Comment was successfully saved') else: messages.error(request, 'Comment could not be saved: %s' % form.errors) try: return HttpResponseRedirect(project.get_absolute_url()) except UnboundLocalError: return HttpResponseRedirect(request.META.get('HTTP_REFERER')) return HttpResponseRedirect(reverse('front_page'))
def trainingbit_edit_content(request, slug=None): trainingbit = get_object_or_404(TrainingBit, slug=slug) # If a form has been submitted if request.method == 'POST': # Save the training bit trainingbit.json_content = request.POST['trainingbit_content_json'] trainingbit.save() messages.success(request, 'Saved training bit') # If nothing has been POSTed just show the `edit_content` page return render( request, 'skills/trainingbit_edit_content.html', { 'trainingbit': trainingbit, 'back_url': reverse('skills:trainingbit_edit', kwargs={'slug': trainingbit.slug}), })
def like(request): if request.method == 'POST': # If the form has been submitted... like = Like.objects.filter(object_id=request.POST['object_id'], content_type=request.POST['content_type'], author__pk=request.user.pk) if like.exists(): like.delete() if request.is_ajax(): d = {'success': 'SUCCESS!!!!11'} return HttpResponse(json.dumps(d), content_type='application/json', status=201) else: messages.info(request, 'You no longer like this %s' % like.content_type) return HttpResponseRedirect(request.META.get('HTTP_REFERER')) else: like = Like(author=request.user) form = LikeForm(request.POST, instance=like) if form.is_valid(): like = form.save(commit=False) like.author = request.user like.save() if request.is_ajax(): d = {'success': 'SUCCESS!!!!11'} return HttpResponse(json.dumps(d), content_type='application/json', status=201) else: messages.success(request, 'Like absorbed') return HttpResponseRedirect( request.META.get('HTTP_REFERER')) else: messages.error(request, 'Form invalid %s' % form.errors) return HttpResponse(json.dumps(form.errors), content_type='application/json', status=404) else: messages.error(request, 'Did not like') return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
def comment_post(request): if request.method == 'POST': # If the form has been submitted... form = CommentForm(request.POST) if form.is_valid(): # Save comment = form.save(commit=False) comment.author = request.user project = comment.project print(request.POST) if 'parent_pk' in request.POST: comment.parent = Comment.objects.get(pk__exact=request.POST['parent_pk']) # comment.project = project comment.save() if request.is_ajax(): comment_html = render_to_string('skills/partials/comment_entry.html', { 'comment': comment, }) # return rendered: # * comment d = { 'comment_html': comment_html, } # The 201 HTTP status code is from my reading of the standard # the # correct response to a POST which successfully created a # new object. # See: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.2 return HttpResponse(json.dumps(d), content_type='application/json', status=201) else: messages.success(request, 'Comment was successfully saved') else: messages.error(request, 'Comment could not be saved: %s' % form.errors) try: return HttpResponseRedirect(project.get_absolute_url()) except UnboundLocalError: return HttpResponseRedirect(request.META.get('HTTP_REFERER')) return HttpResponseRedirect(reverse('front_page'))
def trainingbit_start(request, trainingbit_id): trainingbit = get_object_or_404(TrainingBit, pk=trainingbit_id) # if trainingbit in request.user.trainingbits_in_progress.all(): # Slow if request.user.trainingbits_in_progress.filter(pk=trainingbit.id).exists(): messages.success(request, 'You are already taking this training bit ;)') # elif trainingbit in request.user.trainingbits_completed.all(): # Slow elif request.user.trainingbits_completed.filter(pk=trainingbit.id).exists(): messages.success(request, 'You have already taken this training bit ;)') else: request.user.trainingbits_in_progress.add(trainingbit) messages.success(request, 'You are now taking this training bit') return HttpResponseRedirect(reverse('skills:trainingbit_view', kwargs={'slug': trainingbit.slug}))
def trainingbit_start(request, trainingbit_id): trainingbit = get_object_or_404(TrainingBit, pk=trainingbit_id) # if trainingbit in request.user.trainingbits_in_progress.all(): # Slow if request.user.trainingbits_in_progress.filter( pk=trainingbit.id).exists(): messages.success(request, 'You are already taking this training bit ;)') # elif trainingbit in request.user.trainingbits_completed.all(): # Slow elif request.user.trainingbits_completed.filter( pk=trainingbit.id).exists(): messages.success(request, 'You have already taken this training bit ;)') else: request.user.trainingbits_in_progress.add(trainingbit) messages.success(request, 'You are now taking this training bit') return HttpResponseRedirect( reverse('skills:trainingbit_view', kwargs={'slug': trainingbit.slug}))
def page_delete(request, page_pk): page = get_object_or_404(GCLFlatPage, pk=page_pk) page.delete() messages.success(request, 'Successfully deleted page "%s"' % page.title) return HttpResponseRedirect(reverse('trainer_dashboard'))
def skill_edit(request, slug=None): skill = None selected_topic_pks = [] form = SkillForm() if slug is not None: skill = get_object_or_404(Skill, slug=slug) selected_topic_pks = [t.pk for t in skill.topic_set.all()] form = SkillForm(instance=skill) # If something has been uploaded if request.method == 'POST': form = SkillForm(request.POST, request.FILES, instance=skill) if form.is_valid(): skill = form.save(commit=False) try: hasattr(skill, 'author') except User.DoesNotExist: skill.author = request.user skill.save() # Add trainingbits (ORDER IS IMPORTANT HERE) selected_trainingbit_pos_pk = request.POST.getlist('trainingbit-pos-pk[]') pos_pk = [v.split(',') for v in selected_trainingbit_pos_pk] pos = [int(p[0].strip()) for p in pos_pk] pks = [int(p[1].strip()) for p in pos_pk] tb_dict = TrainingBit.objects.in_bulk(pks) # - Sort trainingbit primary keys by position sorted_pos_pk_list = sorted(zip(pos,pks)) # - Make an ordered list of trainingbits tbs = [] for pos, pk in sorted_pos_pk_list: tbs.append(tb_dict[pk]) # - Set the training bits to only the ones chosen on the page skill.trainingbits.clear() skill.trainingbits.add(*tbs) # Add topics selected_topic_pks = request.POST.getlist('topic-pks[]') selected_topic_pks = [int(s) for s in selected_topic_pks] print(selected_topic_pks) topics = Topic.objects.filter(pk__in=selected_topic_pks) print(topics) skill.topic_set.clear() skill.topic_set.add(*topics) messages.success(request, 'Successfully saved skill') return HttpResponseRedirect(reverse('skills:skill_edit', args=[skill.slug])) else: messages.error(request, 'Could not save skill %s ' % form.errors) if skill is None: trainingbits_chosen = [] trainingbits_available = TrainingBit.objects.filter(is_draft=False) else: trainingbits_chosen = skill.trainingbits.all() #.extra(order_by=['sort_value']) trainingbits_available = TrainingBit.objects.filter(is_draft=False).exclude(id__in=trainingbits_chosen.values('id')).extra(order_by=['name']) try: training_bit_ids = list(map(lambda t: t.id, skill.trainingbits.all())) except AttributeError: training_bit_ids = [] # suggested_trainingbits = trainingbits.exclude(id__in=request.user.trainingbits_completed.all()) return render(request, 'skills/skill_edit.html', { 'skill': skill, 'trainingbits_chosen': trainingbits_chosen, 'trainingbits_available': trainingbits_available, 'topics': Topic.objects.all(), 'selected_topic_pks': selected_topic_pks, 'form': form, })
def skill_edit(request, slug=None): skill = None selected_topic_pks = [] form = SkillForm() if slug is not None: skill = get_object_or_404(Skill, slug=slug) selected_topic_pks = [t.pk for t in skill.topic_set.all()] form = SkillForm(instance=skill) # If something has been uploaded if request.method == 'POST': form = SkillForm(request.POST, request.FILES, instance=skill) if form.is_valid(): skill = form.save(commit=False) try: hasattr(skill, 'author') except User.DoesNotExist: skill.author = request.user skill.save() # Add trainingbits (ORDER IS IMPORTANT HERE) selected_trainingbit_pos_pk = request.POST.getlist( 'trainingbit-pos-pk[]') pos_pk = [v.split(',') for v in selected_trainingbit_pos_pk] pos = [int(p[0].strip()) for p in pos_pk] pks = [int(p[1].strip()) for p in pos_pk] tb_dict = TrainingBit.objects.in_bulk(pks) # - Sort trainingbit primary keys by position sorted_pos_pk_list = sorted(zip(pos, pks)) # - Make an ordered list of trainingbits tbs = [] for pos, pk in sorted_pos_pk_list: tbs.append(tb_dict[pk]) # - Set the training bits to only the ones chosen on the page skill.trainingbits.clear() skill.trainingbits.add(*tbs) # Add topics selected_topic_pks = request.POST.getlist('topic-pks[]') selected_topic_pks = [int(s) for s in selected_topic_pks] topics = Topic.objects.filter(pk__in=selected_topic_pks) skill.topic_set.clear() skill.topic_set.add(*topics) messages.success(request, 'Successfully saved skill') return HttpResponseRedirect( reverse('skills:skill_edit', args=[skill.slug])) else: messages.error(request, 'Could not save skill %s ' % form.errors) if skill is None: trainingbits_chosen = [] trainingbits_available = TrainingBit.objects.filter(is_draft=False) else: trainingbits_chosen = skill.trainingbits.all( ) #.extra(order_by=['sort_value']) trainingbits_available = TrainingBit.objects.filter( is_draft=False).exclude( id__in=trainingbits_chosen.values('id')).extra( order_by=['name']) try: training_bit_ids = list(map(lambda t: t.id, skill.trainingbits.all())) except AttributeError: training_bit_ids = [] # suggested_trainingbits = trainingbits.exclude(id__in=request.user.trainingbits_completed.all()) return render( request, 'skills/skill_edit.html', { 'skill': skill, 'trainingbits_chosen': trainingbits_chosen, 'trainingbits_available': trainingbits_available, 'topics': Topic.objects.all(), 'selected_topic_pks': selected_topic_pks, 'form': form, })
def trainingbit_view(request, slug=None): trainingbit = get_object_or_404(TrainingBit, slug=slug) if trainingbit.is_draft and not (request.user.is_authenticated() and request.user.is_trainer): raise Http404 form = ProjectForm() missing_required_fields = [] if request.method == 'POST': form = ProjectForm(request.POST, request.FILES) if form.is_valid(): # Save project = form.save(commit=False) project.author = request.user project.trainingbit = trainingbit project.save() messages.success(request, 'Project was successfully saved') # complete trainingbit request.user.complete_trainingbit(trainingbit) request.session['completed_trainingbit_pk'] = trainingbit.pk # complete skills completed_skills = get_completed_skills(request.user, trainingbit) request.user.complete_skills(completed_skills) request.session['completed_skill_pks'] = [ s.pk for s in completed_skills ] return HttpResponseRedirect(project.get_absolute_url()) else: # "Hack" in order to provide the desired error message for name, field in form.fields.items(): try: field.validate(form[name].value()) except ValidationError as e: if e.code == 'required': if name == 'name': name = 'title' missing_required_fields.append(name) if request.is_ajax(): return HttpResponse(json.dumps(form.errors), content_type='application/json', status=404) return render( request, 'skills/trainingbit_view.html', { 'trainingbit': trainingbit, 'projects': trainingbit.project_set.filter(is_deleted=False).order_by( '-created_at').prefetch_related('author'), 'next': reverse('skills:trainingbit_view', kwargs={'slug': trainingbit.slug}), 'back_url': reverse('skills:trainingbit_cover', kwargs={'slug': trainingbit.slug}), 'form': form, 'missing_required_fields': missing_required_fields, })