def show_page(request, slug, page_slug, pagination_page=1): page = get_object_or_404(Page, project__slug=slug, slug=page_slug) can_edit = page.can_edit(request.user) if page.deleted: messages.error(request, _('This task was deleted.')) if can_edit: return http.HttpResponseRedirect( reverse('page_history', kwargs={ 'slug': page.project.slug, 'page_slug': page.slug })) else: return http.HttpResponseRedirect(page.project.get_absolute_url()) first_level_comments = page.comments.filter( reply_to__isnull=True).order_by('-created_on') paginator = Paginator(first_level_comments, 5) try: current_page = paginator.page(pagination_page) except EmptyPage: raise http.Http404 return render_to_response('content/page.html', { 'page': page, 'project': page.project, 'can_edit': can_edit, 'first_level_comments': first_level_comments, 'paginator': paginator, 'page_num': pagination_page, 'next_page': int(pagination_page) + 1, 'prev_page': int(pagination_page) - 1, 'num_pages': paginator.num_pages, 'pagination_page': current_page, }, context_instance=RequestContext(request))
def edit_participants(request, slug): project = get_object_or_404(Project, slug=slug) if request.method == 'POST': form = project_forms.ProjectAddParticipantForm(project, request.POST) if form.is_valid(): user = form.cleaned_data['user'] participation = Participation(project= project, user=user) participation.save() new_rel = Relationship(source=user, target_project=project) try: new_rel.save() except IntegrityError: pass messages.success(request, _('Participant added.')) return http.HttpResponseRedirect( reverse('projects_edit_participants', kwargs=dict(slug=project.slug))) else: messages.error(request, _('There was an error adding the participant.')) else: form = project_forms.ProjectAddParticipantForm(project) return render_to_response('projects/project_edit_participants.html', { 'project': project, 'form': form, 'participations': project.participants(), }, context_instance=RequestContext(request))
def profile_create(request): try: request.user.get_profile() return http.HttpResponseRedirect(reverse('dashboard')) except UserProfile.DoesNotExist: pass form = forms.CreateProfileForm(request.POST) if form.is_valid(): profile = form.save(commit=False) profile.user = request.user profile.id = profile.user.id profile.user.email = profile.email profile.user.save() profile.confirmation_code = profile.generate_confirmation_code() profile.save() path = reverse('users_confirm_registration', kwargs={ 'username': profile.username, 'token': profile.confirmation_code, }) url = request.build_absolute_uri(path) profile.email_confirmation_code(url) msg = _('Thanks! We have sent an email to %s with ' 'instructions for completing your ' 'registration.') % profile.email messages.info(request, msg) return http.HttpResponseRedirect(reverse('dashboard')) else: messages.error(request, _('There are errors in this form. Please ' 'correct them and resubmit.')) return render_to_response('dashboard/setup_profile.html', { 'form': form, 'domain': Site.objects.get_current().domain, }, context_instance=RequestContext(request))
def delete_restore_comment(request, comment_id): comment = get_object_or_404(PageComment, id=comment_id) if not comment.can_edit(request.user): if comment.deleted: msg = _('You can not restore this comment.') else: msg = _('You can not delete this comment.') messages.error(request, msg) return http.HttpResponseRedirect(comment.get_absolute_url()) if request.method == 'POST': comment.deleted = not comment.deleted comment.save() if comment.deleted: msg = _('Comment deleted!') else: msg = _('Comment restored!') messages.success(request, msg) if comment.deleted: return http.HttpResponseRedirect( comment.page_object.get_absolute_url()) else: return http.HttpResponseRedirect(comment.get_absolute_url()) else: return render_to_response('replies/delete_restore_comment.html', { 'comment': comment, 'page_object': comment.page_object, 'scope_object': comment.scope_object, }, context_instance=RequestContext(request))
def page_index_down(request, slug, counter): # Page goes down in the sidebar index (page.index increases). project = get_object_or_404(Project, slug=slug) try: counter = int(counter) except ValueError: raise http.Http404 organizing = project.is_organizing(request.user) if not organizing and project.category != Project.STUDY_GROUP: messages.error(request, _('You can not change tasks order.')) return http.HttpResponseRedirect(project.get_absolute_url()) content_pages = Page.objects.filter(project__pk=project.pk, listed=True, deleted=False).order_by('index') if counter < 0 or content_pages.count() - 1 <= counter: raise http.Http404 next_page = content_pages[counter + 1] page = content_pages[counter] next_page.index, page.index = page.index, next_page.index # TODO: Fix this so no update messages are added to the wall but # we don't loose the data for the minor_update field of PageVersion. # For now relly on the Activity model to store this information. next_page.minor_update = page.minor_update = True page.save() next_page.save() return http.HttpResponseRedirect(project.get_absolute_url() + '#tasks')
def create_submission(request, slug): badge = get_object_or_404(Badge, slug=slug) if not badge.can_post_submission(request.user): messages.error(request, _('You can not apply for this badge.')) return http.HttpResponseRedirect(badge.get_absolute_url()) user = request.user.get_profile() related_projects = badge.groups.all() submission = None if request.method == 'POST': form = badge_forms.SubmissionForm(request.POST) if form.is_valid(): submission = form.save(commit=False) submission.badge = badge submission.author = user if 'show_preview' not in request.POST: submission.save() messages.success(request, _('Submission created and out for review!')) return http.HttpResponseRedirect(submission.get_absolute_url()) else: messages.error(request, _('Please correct errors below.')) else: form = badge_forms.SubmissionForm(instance=badge) context = { 'form': form, 'badge': badge, 'related_projects': related_projects, } return render_to_response('badges/submission_edit.html', context, context_instance=RequestContext(request))
def submissions_voter_details(request, submission_id): submission = get_object_or_404(Submission, pk=submission_id) try: voter = VoterDetails.objects.get(user=request.user.get_profile()) except: voter = None if request.method == 'POST': form = VoterDetailsForm(request.POST, instance=voter) if form.is_valid(): details = form.save(commit=False) details.user = request.user.get_profile() details.save() form.save_m2m() messages.success(request, _('Your details were saved.')) return HttpResponseRedirect( reverse('challenges_show', kwargs={ 'slug': submission.challenge.get().slug, })) else: messages.error(request, _('Unable to save details')) else: form = VoterDetailsForm(instance=voter) context = { 'form': form, 'submission': submission, } return render_to_response('challenges/voter_details.html', context, context_instance=RequestContext(request))
def comment_page(request, slug, page_slug, comment_id=None): page = get_object_or_404(Page, project__slug=slug, slug=page_slug) if not page.editable: return HttpResponseForbidden(_("You can't edit this page")) user = request.user.get_profile() reply_to = abs_reply_to = None if comment_id: reply_to = page.comments.get(pk=comment_id) abs_reply_to = reply_to while abs_reply_to.reply_to: abs_reply_to = abs_reply_to.reply_to if request.method == 'POST': form = CommentForm(request.POST) if form.is_valid(): comment = form.save(commit=False) comment.page = page comment.author = user comment.reply_to = reply_to comment.abs_reply_to = abs_reply_to comment.save() messages.success(request, _('Comment posted!')) return HttpResponseRedirect(comment.get_absolute_url()) else: messages.error(request, _('There was a problem posting the comment. Comments cannot be empty.')) else: form = CommentForm() return render_to_response('content/comment_page.html', { 'form': form, 'project': page.project, 'page': page, 'reply_to': reply_to, }, context_instance=RequestContext(request))
def create_challenge(request, project_id): project = get_object_or_404(Project, id=project_id) if project.slug != 'mojo': return HttpResponseForbidden() user = request.user.get_profile() if request.method == 'POST': form = ChallengeForm(request.POST) if form.is_valid(): challenge = form.save(commit=False) challenge.created_by = user challenge.project = project challenge.save() messages.success(request, _('Your new challenge has been created.')) return HttpResponseRedirect( reverse('challenges_show', kwargs={ 'slug': challenge.slug, })) else: messages.error(request, _('Unable to create your challenge.')) else: form = ChallengeForm() context = { 'form': form, 'project': project, } return render_to_response('challenges/challenge_edit_summary.html', context, context_instance=RequestContext(request))
def challenge_judges(request, slug): challenge = get_object_or_404(Challenge, slug=slug) if request.method == 'POST': form = JudgeForm(request.POST) if form.is_valid(): judge = form.save(commit=False) judge.challenge = challenge try: judge.save() messages.success(request, _('Judge has been added')) except IntegrityError: messages.error(request, _('User is already a judge')) return HttpResponseRedirect( reverse('challenges_judges', kwargs={ 'slug': challenge.slug, })) else: messages.error(request, _('Unable to add judge.')) else: form = JudgeForm() judges = Judge.objects.filter(challenge=challenge) context = { 'challenge': challenge, 'form': form, 'judges': judges, } return render_to_response('challenges/challenge_judges.html', context, context_instance=RequestContext(request))
def edit_submission_description(request, slug, submission_id): challenge = get_object_or_404(Challenge, slug=slug) submission = get_object_or_404(Submission, pk=submission_id) if request.method == 'POST': form = SubmissionDescriptionForm(request.POST, instance=submission) if form.is_valid(): form.save() messages.success(request, _('Your submission has been edited.')) return HttpResponseRedirect( reverse('submission_show', kwargs={ 'slug': challenge.slug, 'submission_id': submission.pk })) else: messages.error(request, _('Unable to update your submission')) else: form = SubmissionDescriptionForm(instance=submission) ctx = {'challenge': challenge, 'submission': submission, 'form': form} return render_to_response('challenges/submission_edit_description.html', ctx, context_instance=RequestContext(request))
def edit_challenge_image(request, slug): challenge = get_object_or_404(Challenge, slug=slug) if request.method == "POST": form = ChallengeImageForm(request.POST, request.FILES, instance=challenge) if form.is_valid(): messages.success(request, _('Challenge image updated')) form.save() return HttpResponseRedirect( reverse('challenges_edit_image', kwargs={ 'slug': challenge.slug, })) else: messages.error(request, _('There was an error uploading your image')) else: form = ChallengeImageForm(instance=challenge) context = { 'form': form, 'challenge': challenge, } return render_to_response('challenges/challenge_edit_image.html', context, context_instance=RequestContext(request))
def edit_challenge(request, slug): challenge = get_object_or_404(Challenge, slug=slug) user = request.user.get_profile() if user != challenge.created_by: return HttpResponseForbidden(_("You can't edit challenge")) if request.method == 'POST': form = ChallengeForm(request.POST, instance=challenge) if form.is_valid(): form.save() messages.success(request, _('Challenge updated!')) return HttpResponseRedirect(reverse('challenges_show', kwargs={ 'slug': challenge.slug, })) else: messages.error(request, _('Unable to update your challenge.')) else: form = ChallengeForm(instance=challenge) context = { 'form': form, 'project': challenge.project, 'challenge': challenge, } return render_to_response('challenges/challenge_edit_summary.html', context, context_instance=RequestContext(request))
def import_from_old_site(request): user = request.user.get_profile() if request.method == 'POST': form = project_forms.ImportProjectForm(request.POST) if form.is_valid(): course = form.cleaned_data['course'] #CS - too much logic in view project = Project(name=course['name'], kind=course['kind'], short_description=course['short_description'], long_description=course['long_description'], imported_from=course['slug']) project.save() act = Activity(actor=user, verb=verbs['post'], scope_object=project, target_object=project) act.save() participation = Participation(project=project, user=user, organizing=True) participation.save() new_rel, created = Relationship.objects.get_or_create(source=user, target_project=project) new_rel.deleted = False new_rel.save() if course['detailed_description']: detailed_description_content = course['detailed_description'] else: detailed_description_content = render_to_string( "projects/detailed_description_initial_content.html", {'project': project}) detailed_description = Page(title=_('Full Description'), slug='full-description', content=detailed_description_content, listed=False, author_id=user.id, project_id=project.id) detailed_description.save() project.detailed_description_id = detailed_description.id sign_up = Signup(between_participants=course['sign_up'], author_id=user.id, project_id=project.id) sign_up.save() project.save() for title, content in course['tasks']: new_task = Page(title=title, content=content, author=user, project=project) new_task.save() for name, url in course['links']: new_link = Link(name=name, url=url, user=user, project=project) new_link.save() project.create() messages.success(request, _('The %s has been imported.') % project.kind.lower()) return http.HttpResponseRedirect(reverse('projects_show', kwargs={ 'slug': project.slug, })) else: msg = _("Problem importing the study group, course, ...") messages.error(request, msg) else: form = project_forms.ImportProjectForm() return render_to_response('projects/project_import.html', { 'form': form, 'import_tab': True}, context_instance=RequestContext(request))
def edit_challenge(request, slug): challenge = get_object_or_404(Challenge, slug=slug) user = request.user.get_profile() if user != challenge.created_by: return HttpResponseForbidden() if request.method == 'POST': form = ChallengeForm(request.POST, instance=challenge) if form.is_valid(): form.save() messages.success(request, _('Challenge updated!')) return HttpResponseRedirect( reverse('challenges_show', kwargs={ 'slug': challenge.slug, })) else: messages.error(request, _('Unable to update your challenge.')) else: form = ChallengeForm(instance=challenge) context = { 'form': form, 'project': challenge.project, 'challenge': challenge, } return render_to_response('challenges/challenge_edit_summary.html', context, context_instance=RequestContext(request))
def create_project_status(request, project_id): project = get_object_or_404(Project, id=project_id) if project.category == Project.CHALLENGE: url = reverse('projects_discussion_area', kwargs=dict(slug=project.slug)) else: url = project.get_absolute_url() if request.method != 'POST' or 'status' not in request.POST: return HttpResponseRedirect(url) if not project.is_participating(request.user): return HttpResponseRedirect(url) if project.is_organizing(request.user): form = ImportantStatusForm(data=request.POST) else: form = StatusForm(data=request.POST) if form.is_valid(): status = form.save(commit=False) status.author = request.user.get_profile() status.project = project status.save() log.debug("Saved status by user (%d) to study group (%d): %s" % (status.author.id, project.id, status)) else: log.debug("form error: %s" % (str(form.errors))) messages.error(request, _('There was an error posting ' 'your status update')) return HttpResponseRedirect(url)
def assess_peer(request, slug): badge = get_object_or_404(Badge, slug=slug, assessment_type=Badge.PEER, badge_type=Badge.COMMUNITY) user = request.user.get_profile() assessment = None if request.method == 'POST': form = badge_forms.PeerAssessmentForm(badge, user, request.POST) if form.is_valid(): assessment = form.save(commit=False) if 'show_preview' not in request.POST: assessment.assessor = user assessment.assessed = form.cleaned_data['peer'] assessment.badge = badge assessment.save() messages.success(request, _('Thank you for giving a badge to your peer!')) return http.HttpResponseRedirect(badge.get_absolute_url()) else: messages.error(request, _('Please correct errors below.')) else: if 'peer' in request.GET: form = badge_forms.PeerAssessmentForm( badge, user, initial={'peer': request.GET['peer']}) else: form = badge_forms.PeerAssessmentForm( badge, user) form = badge_forms.PeerAssessmentForm(badge, user) context = { 'badge': badge, 'assessment': assessment, 'form': form, } return render_to_response('badges/peer_assessment.html', context, context_instance=RequestContext(request))
def edit_links(request, slug): project = get_object_or_404(Project, slug=slug) metric_permissions = project.get_metrics_permissions(request.user) profile = request.user.get_profile() if request.method == 'POST': form = project_forms.ProjectLinksForm(request.POST) if form.is_valid(): link = form.save(commit=False) link.project = project link.user = profile link.save() messages.success(request, _('Link added.')) return http.HttpResponseRedirect( reverse('projects_edit_links', kwargs=dict(slug=project.slug))) else: messages.error(request, _('There was an error adding your link.')) else: form = project_forms.ProjectLinksForm() links = Link.objects.select_related('subscription').filter(project=project) return render_to_response('projects/project_edit_links.html', { 'project': project, 'form': form, 'links': links, 'links_tab': True, 'can_view_metric_overview': metric_permissions, }, context_instance=RequestContext(request))
def edit_membership(request, slug): school = get_object_or_404(School, slug=slug) if request.method == 'POST': form = school_forms.SchoolAddProjectForm(school, request.POST) if form.is_valid(): project = form.cleaned_data['project'] project.school = school project.save() messages.success( request, _('The %s was added to this school.') % project.kind.lower()) return http.HttpResponseRedirect( reverse('schools_edit_membership', kwargs=dict(slug=school.slug))) else: messages.error(request, _("There was an adding %s to this school.") % slug) else: form = school_forms.SchoolAddProjectForm(school) return render_to_response('schools/school_edit_membership.html', { 'school': school, 'form': form, 'projects': school.projects.all(), 'membership_tab': True, }, context_instance=RequestContext(request))
def edit_participants(request, slug): project = get_object_or_404(Project, slug=slug) metric_permissions = project.get_metrics_permissions(request.user) if request.method == 'POST': form = project_forms.ProjectAddParticipantForm(project, request.POST) if form.is_valid(): user = form.cleaned_data['user'] organizing = form.cleaned_data['organizer'] participation = Participation(project=project, user=user, organizing=organizing) participation.save() new_rel, created = Relationship.objects.get_or_create( source=user, target_project=project) new_rel.deleted = False new_rel.save() messages.success(request, _('Participant added.')) return http.HttpResponseRedirect(reverse( 'projects_edit_participants', kwargs=dict(slug=project.slug))) else: messages.error(request, _('There was an error adding the participant.')) else: form = project_forms.ProjectAddParticipantForm(project) return render_to_response('projects/project_edit_participants.html', { 'project': project, 'form': form, 'participations': project.participants().order_by('joined_on'), 'participants_tab': True, 'can_view_metric_overview': metric_permissions, 'is_challenge': (project.category == project.CHALLENGE), }, context_instance=RequestContext(request))
def profile_edit(request): profile = request.user.get_profile() if request.method == 'POST': form = forms.ProfileEditForm(request.POST, request.FILES, instance=profile) if form.is_valid(): olang = get_language() activate(profile.preflang) messages.success(request, _('Profile updated')) form.save() next = reverse('users_profile_edit') next = force_language_in_url(next, olang, profile.preflang) return http.HttpResponseRedirect(next) else: messages.error(request, _('There were problems updating your ' 'profile. Please correct the problems ' 'and submit again.')) else: form = forms.ProfileEditForm(instance=profile) return render_to_response('users/profile_edit_main.html', { 'profile': profile, 'profile_form': form, 'general_tab': True, }, context_instance=RequestContext(request))
def edit_next_steps(request, slug): project = get_object_or_404(Project, slug=slug) metric_permissions = project.get_metrics_permissions(request.user) if request.method == 'POST': form = project_forms.ProjectAddNextProjectForm(project, request.POST) if form.is_valid(): next_project = form.cleaned_data['next_project'] project.next_projects.add(next_project) messages.success(request, _('Next step added.')) return http.HttpResponseRedirect(reverse( 'projects_edit_next_steps', kwargs=dict(slug=project.slug))) else: messages.error(request, _('There was an error adding that next step.')) else: form = project_forms.ProjectAddNextProjectForm(project) return render_to_response('projects/project_edit_next_steps.html', { 'project': project, 'form': form, 'next_steps': project.next_projects.all(), 'next_steps_tab': True, 'can_view_metric_overview': metric_permissions, 'is_challenge': (project.category == project.CHALLENGE), }, context_instance=RequestContext(request))
def profile_edit_links(request): profile = get_object_or_404(UserProfile, user=request.user) if request.method == 'POST': form = forms.ProfileLinksForm(request.POST) if form.is_valid(): messages.success(request, _('Profile link added.')) link = form.save(commit=False) log.debug("User instance: %s" % (profile.user,)) link.user = profile link.save() return http.HttpResponseRedirect( reverse('users_profile_edit_links'), ) else: messages.error(request, _('There was an error saving ' 'your link.')) else: form = forms.ProfileLinksForm() links = Link.objects.select_related('subscription').filter( user=profile, project__isnull=True) return render_to_response('users/profile_edit_links.html', { 'profile': profile, 'form': form, 'links': links, 'link_tab': True, }, context_instance=RequestContext(request))
def edit_status(request, slug): project = get_object_or_404(Project, slug=slug) metric_permissions = project.get_metrics_permissions(request.user) if request.method == 'POST': form = project_forms.ProjectStatusForm( request.POST, instance=project) if form.is_valid(): project = form.save(commit=False) project.set_duration(form.cleaned_data['duration']) project.save() messages.success(request, _('%s updated!') % project.kind.capitalize()) return http.HttpResponseRedirect(reverse('projects_edit_status', kwargs={ 'slug': project.slug, })) else: msg = _('There was a problem saving the %s\'s status.') messages.error(request, msg % project.kind.lower()) else: form = project_forms.ProjectStatusForm(instance=project, initial={'duration': project.get_duration()}) return render_to_response('projects/project_edit_status.html', { 'form': form, 'project': project, 'status_tab': True, 'can_view_metric_overview': metric_permissions, 'is_challenge': (project.category == project.CHALLENGE), }, context_instance=RequestContext(request))
def edit_participants(request, slug): project = get_object_or_404(Project, slug=slug) metric_permissions = project.get_metrics_permissions(request.user) if request.method == 'POST': form = project_forms.ProjectAddParticipantForm(project, request.POST) if form.is_valid(): user = form.cleaned_data['user'] organizing = form.cleaned_data['organizer'] participation = Participation(project=project, user=user, organizing=organizing) participation.save() new_rel, created = Relationship.objects.get_or_create( source=user, target_project=project) new_rel.deleted = False new_rel.save() messages.success(request, _('Participant added.')) return http.HttpResponseRedirect(reverse( 'projects_edit_participants', kwargs=dict(slug=project.slug))) else: messages.error(request, _('There was an error adding the participant.')) else: form = project_forms.ProjectAddParticipantForm(project) return render_to_response('projects/project_edit_participants.html', { 'project': project, 'form': form, 'participations': project.participants().order_by('joined_on'), 'participants_tab': True, 'can_view_metric_overview': metric_permissions[0], 'is_challenge': (project.category == project.CHALLENGE), }, context_instance=RequestContext(request))
def show_page(request, slug, page_slug, pagination_page=1): page = get_object_or_404(Page, project__slug=slug, slug=page_slug) can_edit = page.can_edit(request.user) if page.deleted: messages.error(request, _('This task was deleted.')) if can_edit: return HttpResponseRedirect(reverse('page_history', kwargs={'slug':page.project.slug, 'page_slug':page.slug})) else: return HttpResponseRedirect(page.project.get_absolute_url()) first_level_comments = page.comments.filter(reply_to__isnull=True).order_by('-created_on') paginator = Paginator(first_level_comments, 5) try: current_page = paginator.page(pagination_page) except EmptyPage: raise http.Http404 return render_to_response('content/page.html', { 'page': page, 'project': page.project, 'can_edit': can_edit, 'first_level_comments': first_level_comments, 'paginator': paginator, 'page_num': pagination_page, 'next_page': int(pagination_page) + 1, 'prev_page': int(pagination_page) - 1, 'num_pages': paginator.num_pages, 'pagination_page': current_page, }, context_instance=RequestContext(request))
def reply(request, message): message = get_object_or_404(Message, id=message) if message.recipient != request.user: return http.HttpResponseForbidden(_("Can't send email")) if request.method == 'POST': form = forms.ComposeForm(data=request.POST, sender=request.user.get_profile()) if form.is_valid(): form.save(sender=request.user) messages.success(request, _('Message successfully sent.')) return http.HttpResponseRedirect(reverse('drumbeatmail_inbox')) else: messages.error( request, _('There was an error sending your message' '. Please try again.')) else: if not message.subject.startswith('Re: '): subject = 'Re: %s' % (message.subject, ) else: subject = message.subject form = forms.ComposeForm( initial={ 'recipient': message.sender.get_profile().username, 'subject': subject, }) return render_to_response('drumbeatmail/reply.html', { 'form': form, 'message': message, }, context_instance=RequestContext(request))
def create_project_status(request, project_id): if request.method != 'POST' or 'status' not in request.POST: return HttpResponseRedirect(reverse('dashboard_index')) project = get_object_or_404(Project, id=project_id) profile = request.user.get_profile() if profile != project.created_by and not profile.user.is_superuser \ and not project.participants().filter(user=profile).exists(): return HttpResponseRedirect(reverse('dashboard_index')) if profile == project.created_by or profile.user.is_superuser: form = ImportantStatusForm(data=request.POST) else: form = StatusForm(data=request.POST) if form.is_valid(): status = form.save(commit=False) status.author = request.user.get_profile() status.project = project status.save() log.debug("Saved status by user (%d) to study group (%d): %s" % ( profile.id, project.id, status)) else: log.debug("form error: %s" % (str(form.errors))) messages.error(request, _('There was an error posting ' 'your status update')) return HttpResponseRedirect( reverse('projects_show', kwargs=dict(slug=project.slug)))
def clone(request): user = request.user.get_profile() if request.method == "POST": form = project_forms.CloneProjectForm(request.POST) if form.is_valid(): base_project = form.cleaned_data["project"] project = Project( name=base_project.name, category=base_project.category, other=base_project.other, other_description=base_project.other_description, short_description=base_project.short_description, long_description=base_project.long_description, clone_of=base_project, ) project.save() act = Activity(actor=user, verb=verbs["post"], scope_object=project, target_object=project) act.save() participation = Participation(project=project, user=user, organizing=True) participation.save() new_rel, created = Relationship.objects.get_or_create(source=user, target_project=project) new_rel.deleted = False new_rel.save() detailed_description = Page( title=_("Full Description"), slug="full-description", content=base_project.detailed_description.content, listed=False, author_id=user.id, project_id=project.id, ) detailed_description.save() project.detailed_description_id = detailed_description.id base_sign_up = base_project.sign_up.get() sign_up = Signup( public=base_sign_up.public, between_participants=base_sign_up.between_participants, author_id=user.id, project_id=project.id, ) sign_up.save() project.save() tasks = Page.objects.filter(project=base_project, listed=True, deleted=False).order_by("index") for task in tasks: new_task = Page(title=task.title, content=task.content, author=user, project=project) new_task.save() links = Link.objects.filter(project=base_project).order_by("index") for link in links: new_link = Link(name=link.name, url=link.url, user=user, project=project) new_link.save() project.create() messages.success(request, _("The %s has been cloned.") % project.kind.lower()) return http.HttpResponseRedirect(reverse("projects_show", kwargs={"slug": project.slug})) else: messages.error(request, _("There was a problem cloning the study group, course, ...")) else: form = project_forms.CloneProjectForm() return render_to_response( "projects/project_clone.html", {"form": form, "clone_tab": True}, context_instance=RequestContext(request) )
def edit_links(request, slug): project = get_object_or_404(Project, slug=slug) metric_permissions = project.get_metrics_permissions(request.user) profile = request.user.get_profile() if request.method == "POST": form = project_forms.ProjectLinksForm(request.POST) if form.is_valid(): link = form.save(commit=False) link.project = project link.user = profile link.save() messages.success(request, _("Link added.")) return http.HttpResponseRedirect(reverse("projects_edit_links", kwargs=dict(slug=project.slug))) else: messages.error(request, _("There was an error adding your link.")) else: form = project_forms.ProjectLinksForm() links = Link.objects.select_related("subscription").filter(project=project) return render_to_response( "projects/project_edit_links.html", { "project": project, "form": form, "links": links, "links_tab": True, "can_view_metric_overview": metric_permissions[0], }, context_instance=RequestContext(request), )
def create_page(request, slug): project = get_object_or_404(Project, slug=slug) if project.is_organizing(request.user): form_cls = OwnersPageForm else: form_cls = PageForm if request.method == 'POST': form = form_cls(request.POST) if form.is_valid(): page = form.save(commit=False) page.project = project page.author = request.user.get_profile() page.save() messages.success(request, _('Task created!')) return HttpResponseRedirect(reverse('page_show', kwargs={ 'slug': slug, 'page_slug': page.slug, })) else: messages.error(request, _('There was a problem creating the task.')) else: form = form_cls() return render_to_response('content/create_page.html', { 'form': form, 'project': project, }, context_instance=RequestContext(request))
def edit_participants(request, slug): project = get_object_or_404(Project, slug=slug) metric_permissions = project.get_metrics_permissions(request.user) if request.method == "POST": form = project_forms.ProjectAddParticipantForm(project, request.POST) if form.is_valid(): user = form.cleaned_data["user"] organizing = form.cleaned_data["organizer"] participation = Participation(project=project, user=user, organizing=organizing) participation.save() new_rel, created = Relationship.objects.get_or_create(source=user, target_project=project) new_rel.deleted = False new_rel.save() messages.success(request, _("Participant added.")) return http.HttpResponseRedirect(reverse("projects_edit_participants", kwargs=dict(slug=project.slug))) else: messages.error(request, _("There was an error adding the participant.")) else: form = project_forms.ProjectAddParticipantForm(project) return render_to_response( "projects/project_edit_participants.html", { "project": project, "form": form, "participations": project.participants().order_by("joined_on"), "participants_tab": True, "can_view_metric_overview": metric_permissions[0], "is_challenge": (project.category == project.CHALLENGE), }, context_instance=RequestContext(request), )
def create_submission(request, slug): badge = get_object_or_404(Badge, slug=slug) can_apply = badge.is_eligible(request.user) rubrics = badge.rubrics.all() if not can_apply: messages.error(request, _('You are lacking one or more of the requirements.')) # TODO: Reason why return http.HttpResponseRedirect(badge.get_absolute_url()) user = request.user.get_profile() submission = None if request.method == 'POST': form = badge_forms.SubmissionForm(request.POST) if form.is_valid(): submission = form.save(commit=False) submission.badge = badge submission.author = user if 'show_preview' not in request.POST: submission.save() messages.success(request, _('Submission created and out for review!')) return http.HttpResponseRedirect(badge.get_absolute_url()) else: messages.error(request, _('Please correct errors below.')) else: form = badge_forms.SubmissionForm(instance=badge) context = { 'form': form, 'badge': badge, 'rubrics': rubrics, } return render_to_response('badges/submission_edit.html', context, context_instance=RequestContext(request))
def edit_next_steps(request, slug): project = get_object_or_404(Project, slug=slug) metric_permissions = project.get_metrics_permissions(request.user) if request.method == "POST": form = project_forms.ProjectAddNextProjectForm(project, request.POST) if form.is_valid(): next_project = form.cleaned_data["next_project"] project.next_projects.add(next_project) messages.success(request, _("Next step added.")) return http.HttpResponseRedirect(reverse("projects_edit_next_steps", kwargs=dict(slug=project.slug))) else: messages.error(request, _("There was an error adding that next step.")) else: form = project_forms.ProjectAddNextProjectForm(project) return render_to_response( "projects/project_edit_next_steps.html", { "project": project, "form": form, "next_steps": project.next_projects.all(), "next_steps_tab": True, "can_view_metric_overview": metric_permissions[0], "is_challenge": (project.category == project.CHALLENGE), }, context_instance=RequestContext(request), )
def show_page(request, slug, page_slug): page = get_object_or_404(Page, project__slug=slug, slug=page_slug) is_challenge = (page.project.category == Project.CHALLENGE) if is_challenge and not page.listed: msg = _("This page is not accesible on a %s.") return http.HttpResponseForbidden(msg % page.project.kind.lower()) can_edit = page.can_edit(request.user) if page.deleted: messages.error(request, _('This task was deleted.')) if can_edit: return http.HttpResponseRedirect(reverse('page_history', kwargs={'slug': page.project.slug, 'page_slug': page.slug})) else: return http.HttpResponseRedirect(page.project.get_absolute_url()) new_comment_url = reverse('page_comment', kwargs=dict( scope_app_label='projects', scope_model='project', scope_pk=page.project.id, page_app_label='content', page_model='page', page_pk=page.id)) first_level_comments = page.first_level_comments() all_listed_pages = page.project.pages.filter(deleted=False, listed=True).order_by('index') context = { 'page': page, 'project': page.project, 'can_edit': can_edit, 'can_comment': page.can_comment(request.user), 'new_comment_url': new_comment_url, 'is_challenge': is_challenge, 'all_listed_pages': all_listed_pages, } context.update(get_pagination_context(request, first_level_comments)) context.update(get_google_tracking_context(page.project)) return render_to_response('content/page.html', context, context_instance=RequestContext(request))
def _move_page(request, slug, page_slug, direction="up"): # Page goes up in the sidebar index (page.index decreases).""" project = get_object_or_404(Project, slug=slug) organizing = project.is_organizing(request.user) if not organizing and project.category != Project.STUDY_GROUP: messages.error(request, _("You can not change tasks order.")) return http.HttpResponseRedirect(project.get_absolute_url()) content_pages = Page.objects.filter(project__pk=project.pk, listed=True, deleted=False).order_by("index") # find page we want to move index = [i for i, x in enumerate(content_pages) if x.slug == page_slug] if ( len(index) != 1 or direction == "up" and index[0] == 0 or direction == "down" and index[0] == len(content_pages) - 1 ): raise http.Http404 if direction == "up": prev_page = content_pages[index[0] - 1] page = content_pages[index[0]] else: prev_page = content_pages[index[0] + 1] page = content_pages[index[0]] prev_page.index, page.index = page.index, prev_page.index # TODO: Fix this so no update messages are added to the wall but # we don't loose the data for the minor_update field of PageVersion. # For now relly on the Activity model to store this information. page.minor_update = prev_page.minor_update = True page.save() prev_page.save() return http.HttpResponseRedirect(project.get_absolute_url() + "#tasks")
def edit_featured(request, slug): school = get_object_or_404(School, slug=slug) if request.method == 'POST': form = school_forms.SchoolAddFeaturedForm(school, request.POST) if form.is_valid(): project = form.cleaned_data['project'] school.featured.add(project) school.save() msg = _('The %s is now featured for this school.') messages.success(request, msg % project.kind.lower()) return http.HttpResponseRedirect( reverse('schools_edit_featured', kwargs=dict(slug=school.slug))) else: msg = _("There was an error marking %s as featured.") messages.error(request, msg % slug) else: form = school_forms.SchoolAddFeaturedForm(school) return render_to_response('schools/school_edit_featured.html', { 'school': school, 'form': form, 'featured': school.featured.all(), 'featured_tab': True, }, context_instance=RequestContext(request))
def password(request): profile = request.user.get_profile() password = "" password_confirm = "" if request.method == "POST": form = forms.PasswordEditForm(request.POST, request.FILES, instance=profile) if form.is_valid(): profile = form.save(commit=False) profile.set_password(form.cleaned_data['password']) messages.success(request, _('Password updated')) profile.user = request.user profile.save() else: messages.error( request, _('There are errors in this form. Please ' 'correct them and resubmit.')) else: form = forms.PasswordEditForm(instance=profile) return render_to_response('preferences/settings_password.html', { 'form': form, }, context_instance=RequestContext(request))
def edit_media(request, slug): project = get_object_or_404(Project, slug=slug) files = project.projectmedia_set.all() if request.method == 'POST': if files.count() > settings.MAX_PROJECT_FILES: messages.error(request, _('You have already used up your allotted ' 'number of file uploads. Please delete ' 'some files and try again.')) return http.HttpResponseRedirect( reverse('projects_edit_media', kwargs=dict(slug=project.slug))) form = project_forms.ProjectMediaForm(request.POST, request.FILES) if form.is_valid(): messages.success(request, _('File uploaded')) media = form.save(commit=False) media.project = project media.mime_type = form.cleaned_data['project_file'].content_type media.save() return http.HttpResponseRedirect( reverse('projects_edit_media', kwargs=dict(slug=project.slug))) else: messages.error(request, _('There was an error uploading ' 'your file.')) else: form = project_forms.ProjectMediaForm() return render_to_response('projects/project_edit_media.html', { 'files': files, 'form': form, 'project': project, }, context_instance=RequestContext(request))
def profile_create(request): try: request.user.get_profile() return http.HttpResponseRedirect(reverse('dashboard')) except UserProfile.DoesNotExist: pass form = forms.CreateProfileForm(request.POST) if form.is_valid(): profile = form.save(commit=False) profile.user = request.user profile.id = profile.user.id profile.user.email = profile.email profile.user.save() profile.confirmation_code = profile.generate_confirmation_code() profile.save() path = reverse('users_confirm_registration', kwargs={ 'username': profile.username, 'token': profile.confirmation_code, }) url = request.build_absolute_uri(path) profile.email_confirmation_code(url) msg = _('Thanks! We have sent an email to %s with ' 'instructions for completing your ' 'registration.') % profile.email messages.info(request, msg) request.session['send_registration_event'] = True return http.HttpResponseRedirect(reverse('dashboard')) else: messages.error(request, _('There are errors in this form. Please ' 'correct them and resubmit.')) return render_to_response('dashboard/setup_profile.html', { 'form': form, 'domain': Site.objects.get_current().domain, }, context_instance=RequestContext(request))
def delete(request): profile = request.user.get_profile() current_projects = profile.get_current_projects() pending_projects = [] for project in current_projects['organizing']: if not project.archived and project.organizers().count() == 1: pending_projects.append(project) msg = _('You are the only organizer of %s active ') msg += _('study groups, courses, ...') if request.method == 'POST': if pending_projects: messages.error(request, msg % len(pending_projects)) return HttpResponseRedirect(reverse('preferences_delete')) profile.deleted = True profile.user.is_active = False profile.save() profile.user.save() # logout the user. for s in Session.objects.all(): if s.get_decoded().get('_auth_user_id') == profile.user.id: s.delete() return HttpResponseRedirect(reverse('users_logout')) return render_to_response('users/settings_delete.html', {'pending_projects': pending_projects, 'delete_tab': True}, context_instance=RequestContext(request))
def edit_comment(request, comment_id): comment = get_object_or_404(PageComment, id=comment_id) if not comment.can_edit(request.user): messages.error(request, _('You can not edit this comment.')) return http.HttpResponseRedirect(comment.get_absolute_url()) if request.method == 'POST': form = CommentForm(request.POST, instance=comment) if form.is_valid(): comment = form.save(commit=False) if 'show_preview' not in request.POST: comment.save() messages.success(request, _('Comment updated!')) return http.HttpResponseRedirect(comment.get_absolute_url()) else: messages.error(request, _('Please correct errors below.')) else: form = CommentForm(instance=comment) return render_to_response('replies/comment_page.html', { 'form': form, 'comment': comment, 'page_object': comment.page_object, 'scope_object': comment.scope_object, 'reply_to': comment.reply_to, 'preview': ('show_preview' in request.POST), }, context_instance=RequestContext(request))
def delete_restore_comment(request, comment_id): comment = get_object_or_404(PageComment, id=comment_id) if not comment.can_edit( request.user) or not request.user.get_profile().can_post(): if comment.deleted: msg = _('You can not restore this comment.') else: msg = _('You can not delete this comment.') messages.error(request, msg) return http.HttpResponseRedirect(comment.get_absolute_url()) if request.method == 'POST': comment.deleted = not comment.deleted comment.save() if comment.deleted: msg = _('Comment deleted!') else: msg = _('Comment restored!') messages.success(request, msg) if comment.deleted: return http.HttpResponseRedirect( comment.page_object.get_absolute_url()) else: return http.HttpResponseRedirect(comment.get_absolute_url()) else: return render_to_response('replies/delete_restore_comment.html', { 'comment': comment, 'page_object': comment.page_object, 'scope_object': comment.scope_object, }, context_instance=RequestContext(request))
def edit_answer_sign_up(request, slug, answer_id): sign_up = get_object_or_404(Signup, project__slug=slug) answer = get_object_or_404(sign_up.answers, id=answer_id) if not answer.can_edit(request.user): return http.HttpResponseForbidden(_("You can't edit this answer")) profile = answer.author if request.method == 'POST': form = SignupAnswerForm(request.POST, instance=answer) profile_form = ProfileEditForm(request.POST, instance=profile) profile_image_form = ProfileImageForm() if form.is_valid() and profile_form.is_valid(): profile = profile_form.save(commit=False) answer = form.save(commit=False) if 'show_preview' not in request.POST: profile.save() answer.save() messages.success(request, _('Answer updated!')) return http.HttpResponseRedirect(answer.get_absolute_url()) else: messages.error(request, _('Please correct errors below.')) else: profile_form = ProfileEditForm(instance=profile) profile_image_form = ProfileImageForm() form = SignupAnswerForm(instance=answer) return render_to_response('signups/answer_sign_up.html', { 'profile_image_form': profile_image_form, 'profile_form': profile_form, 'profile': profile, 'form': form, 'project': sign_up.project, 'sign_up': sign_up, 'answer': answer, 'preview': ('show_preview' in request.POST), }, context_instance=RequestContext(request))
def edit_links(request, slug): project = get_object_or_404(Project, slug=slug) metric_permissions = project.get_metrics_permissions(request.user) profile = request.user.get_profile() if request.method == 'POST': form = project_forms.ProjectLinksForm(request.POST) if form.is_valid(): link = form.save(commit=False) link.project = project link.user = profile link.save() messages.success(request, _('Link added.')) return http.HttpResponseRedirect( reverse('projects_edit_links', kwargs=dict(slug=project.slug))) else: messages.error(request, _('There was an error adding your link.')) else: form = project_forms.ProjectLinksForm() links = Link.objects.select_related('subscription').filter(project=project) return render_to_response('projects/project_edit_links.html', { 'project': project, 'form': form, 'links': links, 'links_tab': True, 'can_view_metric_overview': metric_permissions[0], }, context_instance=RequestContext(request))
def delete_restore_signup_answer(request, slug, answer_id): sign_up = get_object_or_404(Signup, project__slug=slug) answer = get_object_or_404(sign_up.answers, id=answer_id) if not answer.can_edit(request.user): if answer.deleted: msg = _('You can not restore this answer.') else: msg = _('You can not delete this answer.') messages.error(request, msg) return http.HttpResponseRedirect(answer.get_absolute_url()) if request.method == 'POST': answer.deleted = not answer.deleted answer.save() if answer.deleted: msg = _('Answer deleted!') else: msg = _('Answer restored!') messages.success(request, msg) if answer.deleted: return http.HttpResponseRedirect( sign_up.get_absolute_url()) else: return http.HttpResponseRedirect(answer.get_absolute_url()) else: return render_to_response('signups/delete_restore_answer.html', { 'answer': answer, 'sign_up': sign_up, 'project': sign_up.project, }, context_instance=RequestContext(request))
def edit_next_steps(request, slug): project = get_object_or_404(Project, slug=slug) metric_permissions = project.get_metrics_permissions(request.user) if request.method == 'POST': form = project_forms.ProjectAddNextProjectForm(project, request.POST) if form.is_valid(): next_project = form.cleaned_data['next_project'] project.next_projects.add(next_project) messages.success(request, _('Next step added.')) return http.HttpResponseRedirect(reverse( 'projects_edit_next_steps', kwargs=dict(slug=project.slug))) else: messages.error(request, _('There was an error adding that next step.')) else: form = project_forms.ProjectAddNextProjectForm(project) return render_to_response('projects/project_edit_next_steps.html', { 'project': project, 'form': form, 'next_steps': project.next_projects.all(), 'next_steps_tab': True, 'can_view_metric_overview': metric_permissions[0], 'is_challenge': (project.category == project.CHALLENGE), }, context_instance=RequestContext(request))
def course_add_badge( request, course_id ): context = { } context = _populate_course_context(request, course_id, context) context['badges_active'] = True user = request.user form = CourseEmbeddedUrlForm() if request.method == "POST": form = CourseEmbeddedUrlForm(request.POST) if form.is_valid(): content = None user_uri = u"/uri/user/{0}".format(user.username) try: content = add_content_from_response( context['course']['uri'], form.cleaned_data['url'], user_uri) except BadgeNotFoundException: form = CourseEmbeddedUrlForm() messages.error(request, _('Error! We could not retrieve this Badge')) if content: redirect_url = reverse('courses_content_show', kwargs={'course_id': course_id, 'content_id': content['id']}) return http.HttpResponseRedirect(redirect_url) context['form'] = form return render_to_response( 'courses/course_badges.html', context, context_instance=RequestContext(request) )