Пример #1
0
    def setUp(self):
        self.client = Client()
        self.locale = 'en'
        django_user = User(
            username=self.test_username,
            email=self.test_email,
        )
        self.user = create_profile(django_user)
        self.user.set_password(self.test_password)
        self.user.save()

        self.project = Project(
            name='Reply Project',
            short_description='This project is to test replies',
            long_description='No really, its good',
        )
        self.project.save()

        participation = Participation(project=self.project,
                                      user=self.user,
                                      organizing=True)
        participation.save()

        self.page = Page(author=self.user,
                         project=self.project,
                         title='task title',
                         sub_header='Tagline',
                         content='Content',
                         index=2)
        self.page.save()
Пример #2
0
 def setUp(self):
     self.client = Client()
     self.locale = 'en'
     django_user = User(
         username=self.test_username,
         email=self.test_email,
     )
     self.user = create_profile(django_user)
     self.user.set_password(self.test_password)
     self.user.save()
     self.project = Project(name='My Cool Project',
         short_description='This project is awesome',
         long_description='No really, its good',
     )
     self.project.save()
     participation = Participation(project=self.project,
         user=self.user, organizing=True)
     participation.save()
     for i in xrange(3):
         page = Page(author=self.user,
             project=self.project,
             title='Old Title %s' % i,
             sub_header='Old Tagline %s' % i,
             content='Old Content %s' % i,
             index=2*(i+1))
         page.save()
Пример #3
0
 def setUp(self):
     self.client = Client()
     self.locale = 'en'
     django_user = User(
         username=self.test_username,
         email=self.test_email,
     )
     self.user = create_profile(django_user)
     self.user.set_password(self.test_password)
     self.user.save()
     self.project = Project(name='My Cool Project',
         short_description='This project is awesome',
         long_description='No really, its good',
     )
     self.project.save()
     participation = Participation(project=self.project,
         user=self.user, organizing=True)
     participation.save()
     for i in xrange(3):
         page = Page(author=self.user,
             project=self.project,
             title='Old Title %s' % i,
             sub_header='Old Tagline %s' % i,
             content='Old Content %s' % i,
             index=2*(i+1))
         page.save()
Пример #4
0
def create(request, category=None):
    user = request.user.get_profile()
    if request.method == 'POST':
        form = project_forms.ProjectForm(category, request.POST)
        image_form = None
        if form.is_valid():
            project = form.save()
            if category:
                project.category = category
            image_form = project_forms.ProjectImageForm(request.POST,
                request.FILES, instance=project)
            if image_form.is_valid():
                image_form.save()
            project.set_duration(form.cleaned_data['duration'] or 0)
            #CS - too much logic in view
            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_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)
            if project.category != Project.STUDY_GROUP:
                detailed_description.collaborative = False
            detailed_description.save()
            project.detailed_description_id = detailed_description.id
            sign_up = Signup(author_id=user.id, project_id=project.id)
            sign_up.save()
            project.create()
            messages.success(request,
                _('The %s has been created.') % project.kind.lower())
            return http.HttpResponseRedirect(reverse('projects_create_tasks',
                kwargs={'slug': project.slug,}))
        else:
            msg = _("Problem creating the course")
            messages.error(request, msg)
    else:
        form = project_forms.ProjectForm(category, initial={'test':True})
        image_form = project_forms.ProjectImageForm()
    context = {
        'form': form,
        'image_form': image_form,
        'category': category,
        'is_challenge': (category == Project.CHALLENGE),
    }
    return render_to_response('projects/project_create_overview.html',
        context, context_instance=RequestContext(request))
Пример #5
0
def create(request, category=None):
    user = request.user.get_profile()
    if request.method == 'POST':
        form = project_forms.ProjectForm(category, request.POST)
        image_form = None
        if form.is_valid():
            project = form.save()
            if category:
                project.category = category
            image_form = project_forms.ProjectImageForm(request.POST,
                request.FILES, instance=project)
            if image_form.is_valid():
                image_form.save()
            project.set_duration(form.cleaned_data['duration'] or 0)
            #CS - too much logic in view
            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_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)
            if project.category != Project.STUDY_GROUP:
                detailed_description.collaborative = False
            detailed_description.save()
            project.detailed_description_id = detailed_description.id
            sign_up = Signup(author_id=user.id, project_id=project.id)
            sign_up.save()
            project.create()
            messages.success(request,
                _('The %s has been created.') % project.kind.lower())
            return http.HttpResponseRedirect(reverse('projects_create_tasks',
                kwargs={'slug': project.slug,}))
        else:
            msg = _("Problem creating the course")
            messages.error(request, msg)
    else:
        form = project_forms.ProjectForm(category, initial={'test':True})
        image_form = project_forms.ProjectImageForm()
    context = {
        'form': form,
        'image_form': image_form,
        'category': category,
        'is_challenge': (category == Project.CHALLENGE),
    }
    return render_to_response('projects/project_create_overview.html',
        context, context_instance=RequestContext(request))
Пример #6
0
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, kind=base_project.kind,
                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
            sign_up = Page(title=_('Sign-Up'), slug='sign-up',
                content=base_project.sign_up.content, listed=False,
                editable=False, author_id=user.id, project_id=project.id)
            sign_up.save()
            project.sign_up_id = sign_up.id
            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))
Пример #7
0
def create(request):
    user = request.user.get_profile()
    if request.method == 'POST':
        form = project_forms.ProjectForm(request.POST)
        if form.is_valid():
            project = form.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_content = render_to_string(
                "projects/detailed_description_initial_content.html", {})
            detailed_description = Page(title=_('Full Description'),
                                        slug='full-description',
                                        content=detailed_description_content,
                                        listed=False,
                                        author_id=user.id,
                                        project_id=project.id)
            if project.category != Project.STUDY_GROUP:
                detailed_description.collaborative = False
            detailed_description.save()
            project.detailed_description_id = detailed_description.id
            sign_up = Signup(author_id=user.id, project_id=project.id)
            sign_up.save()
            project.create()
            messages.success(
                request,
                _('The %s has been created.') % project.kind.lower())
            return http.HttpResponseRedirect(
                reverse('projects_show', kwargs={
                    'slug': project.slug,
                }))
        else:
            msg = _("Problem creating the study group, course, ...")
            messages.error(request, msg)
    else:
        form = project_forms.ProjectForm()
    return render_to_response('projects/project_edit_summary.html', {
        'form': form,
        'new_tab': True,
    },
                              context_instance=RequestContext(request))
Пример #8
0
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))
Пример #9
0
    def setUp(self):
        self.client = Client()
        self.locale = 'en'
        django_user = User(
            username=self.test_username,
            email=self.test_email,
        )
        self.user = create_profile(django_user)
        self.user.set_password(self.test_password)
        self.user.save()

        self.project = Project(name='Reply Project',
            short_description='This project is to test replies',
            long_description='No really, its good',
        )
        self.project.save()
        
        participation = Participation(project=self.project,
            user=self.user, organizing=True)
        participation.save()
        
        self.page = Page(author=self.user,
            project=self.project,
            title='task title',
            sub_header='Tagline',
            content='Content',
            index=2)
        self.page.save()

        self.comment = PageComment()
        self.comment.page_object = self.page
        self.comment.scope_object = self.project
        self.comment.author = self.user
        self.comment.content = "blah blah"
        self.comment.save()
Пример #10
0
def create(request):
    user = request.user.get_profile()
    school = None
    if request.method == 'POST':
        form = project_forms.CreateProjectForm(request.POST)
        if form.is_valid():
            project = form.save()
            act = Activity(actor=user,
                verb='http://activitystrea.ms/schema/1.0/post',
                project=project,
                target_project=project)
            act.save()
            participation = Participation(project= project, user=user, organizing=True)
            participation.save()
            new_rel = Relationship(source=user, target_project=project)
            try:
                new_rel.save()
            except IntegrityError:
                pass
            detailed_description_content = render_to_string(
                "projects/detailed_description_initial_content.html",
                {})
            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_content = render_to_string("projects/sign_up_initial_content.html",
                {})
            sign_up = Page(title=_('Sign-Up'), slug='sign-up',
                content=sign_up_content, listed=False, editable=False,
                author_id=user.id, project_id=project.id)
            sign_up.save()
            project.sign_up_id = sign_up.id
            project.save()
            messages.success(request, _('The study group has been created.'))
            return http.HttpResponseRedirect(reverse('projects_show', kwargs={
                'slug': project.slug,
            }))
        else:
            messages.error(request,
                _("There was a problem creating the study group."))
    else:
        if 'school' in request.GET:
            try:
                school = School.objects.get(slug=request.GET['school'])
                form = project_forms.CreateProjectForm(initial={'school': school})
            except School.DoesNotExist:
                return http.HttpResponseRedirect(reverse('projects_create'))
        else:
            form = project_forms.CreateProjectForm()
    return render_to_response('projects/project_edit_summary.html', {
        'form': form, 'new_tab': True, 'school': school,
    }, context_instance=RequestContext(request))
Пример #11
0
def create(request):
    user = request.user.get_profile()
    if request.method == 'POST':
        form = project_forms.ProjectForm(request.POST)
        if form.is_valid():
            project = form.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_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)
            if project.category != Project.STUDY_GROUP:
                detailed_description.collaborative = False
            detailed_description.save()
            project.detailed_description_id = detailed_description.id
            sign_up = Signup(author_id=user.id, project_id=project.id)
            sign_up.save()
            project.create()
            messages.success(request,
                _('The %s has been created.') % project.kind.lower())
            return http.HttpResponseRedirect(reverse('projects_show', kwargs={
                'slug': project.slug,
            }))
        else:
            msg = _("Problem creating the study group, course, ...")
            messages.error(request, msg)
    else:
        form = project_forms.ProjectForm()
    return render_to_response('projects/project_edit_summary.html', {
        'form': form, 'new_tab': True,
    }, context_instance=RequestContext(request))
Пример #12
0
def create(request):
    user = request.user.get_profile()
    if request.method == 'POST':
        form = project_forms.ProjectForm(request.POST)
        if form.is_valid():
            project = form.save(commit=False)
            project.created_by = user
            project.save()
            detail_description_content = render_to_string(
                "projects/detailed_description_initial_content.html", {})
            detailed_description = Page(title=_('Full Description'),
                                        slug='full-description',
                                        content=detail_description_content,
                                        listed=False,
                                        author_id=user.id,
                                        project_id=project.id)
            detailed_description.save()
            project.detailed_description_id = detailed_description.id
            sign_up_content = render_to_string(
                "projects/sign_up_initial_content.html", {})
            sign_up = Page(title=_('Sign-Up'),
                           slug='sign-up',
                           content=sign_up_content,
                           listed=False,
                           editable=False,
                           author_id=user.id,
                           project_id=project.id)
            sign_up.save()
            project.sign_up_id = sign_up.id
            project.save()
            messages.success(request, _('The study group has been created.'))
            return http.HttpResponseRedirect(
                reverse('projects_show', kwargs={
                    'slug': project.slug,
                }))
        else:
            messages.error(request,
                           _("There was a problem creating the study group."))
    else:
        if 'school' in request.GET:
            try:
                school = School.objects.get(slug=request.GET['school'])
                form = project_forms.ProjectForm(initial={'school': school})
            except School.DoesNotExist:
                return http.HttpResponseRedirect(reverse('projects_create'))
        else:
            form = project_forms.ProjectForm()
    return render_to_response('projects/project_edit_summary.html', {
        'form': form,
    },
                              context_instance=RequestContext(request))
Пример #13
0
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))
Пример #14
0
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)
    )
Пример #15
0
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"]
            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", {}
                )
            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)
    )
Пример #16
0
def create(request):
    user = request.user.get_profile()
    school = None
    if request.method == 'POST':
        form = project_forms.CreateProjectForm(request.POST)
        if form.is_valid():
            project = form.save()
            act = Activity(actor=user,
                verb='http://activitystrea.ms/schema/1.0/post',
                project=project,
                target_project=project)
            act.save()
            participation = Participation(project= project, user=user, organizing=True)
            participation.save()
            new_rel = Relationship(source=user, target_project=project)
            try:
                new_rel.save()
            except IntegrityError:
                pass
            detailed_description_content = render_to_string(
                "projects/detailed_description_initial_content.html",
                {})
            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_content = render_to_string("projects/sign_up_initial_content.html",
                {})
            sign_up = Page(title=_('Sign-Up'), slug='sign-up',
                content=sign_up_content, listed=False, editable=False,
                author_id=user.id, project_id=project.id)
            sign_up.save()
            project.sign_up_id = sign_up.id
            project.save()
            messages.success(request, _('The study group has been created.'))
            return http.HttpResponseRedirect(reverse('projects_show', kwargs={
                'slug': project.slug,
            }))
        else:
            messages.error(request,
                _("There was a problem creating the study group."))
    else:
        if 'school' in request.GET:
            try:
                school = School.objects.get(slug=request.GET['school'])
                form = project_forms.CreateProjectForm(initial={'school': school})
            except School.DoesNotExist:
                return http.HttpResponseRedirect(reverse('projects_create'))
        else:
            form = project_forms.CreateProjectForm()
    return render_to_response('projects/project_edit_summary.html', {
        'form': form, 'new_tab': True, 'school': school,
    }, context_instance=RequestContext(request))
Пример #17
0
    def setUp(self):
        self.client = Client()
        self.locale = "en"
        django_user = User(username=self.test_username, email=self.test_email)
        self.user = create_profile(django_user)
        self.user.set_password(self.test_password)
        self.user.save()

        self.project = Project(
            name="Reply Project",
            short_description="This project is to test replies",
            long_description="No really, its good",
        )
        self.project.save()

        participation = Participation(project=self.project, user=self.user, organizing=True)
        participation.save()

        self.page = Page(
            author=self.user, project=self.project, title="task title", sub_header="Tagline", content="Content", index=2
        )
        self.page.save()
Пример #18
0
def create(request):
    user = request.user.get_profile()
    if request.method == 'POST':
        form = project_forms.ProjectForm(request.POST)
        if form.is_valid():
            project = form.save(commit=False)
            project.created_by = user
            project.save()
            detail_description_content = render_to_string(
                "projects/detailed_description_initial_content.html",
                {})
            detailed_description = Page(title=_('Full Description'), slug='full-description',
                content=detail_description_content, listed=False,
                author_id=user.id, project_id=project.id)
            detailed_description.save()
            project.detailed_description_id = detailed_description.id
            sign_up_content = render_to_string("projects/sign_up_initial_content.html",
                {})
            sign_up = Page(title=_('Sign-Up'), slug='sign-up',
                content=sign_up_content, listed=False, editable=False,
                author_id=user.id, project_id=project.id)
            sign_up.save()
            project.sign_up_id = sign_up.id
            project.save()
            messages.success(request, _('The study group has been created.'))
            return http.HttpResponseRedirect(reverse('projects_show', kwargs={
                'slug': project.slug,
            }))
        else:
            messages.error(request,
                _("There was a problem creating the study group."))
    else:
        if 'school' in request.GET:
            try:
                school = School.objects.get(slug=request.GET['school'])
                form = project_forms.ProjectForm(initial={'school': school})
            except School.DoesNotExist:
                return http.HttpResponseRedirect(reverse('projects_create'))
        else:
            form = project_forms.ProjectForm()
    return render_to_response('projects/project_edit_summary.html', {
        'form': form,
    }, context_instance=RequestContext(request))
Пример #19
0
class NotificationsTests(TestCase):

    test_username = '******'
    test_email = '*****@*****.**'
    test_password = '******'

    def setUp(self):
        self.client = Client()
        self.locale = 'en'
        django_user = User(
            username=self.test_username,
            email=self.test_email,
        )
        self.user = create_profile(django_user)
        self.user.set_password(self.test_password)
        self.user.save()

        self.project = Project(name='Reply Project',
            short_description='This project is to test replies',
            long_description='No really, its good',
        )
        self.project.save()
        
        participation = Participation(project=self.project,
            user=self.user, organizing=True)
        participation.save()
        
        self.page = Page(author=self.user,
            project=self.project,
            title='task title',
            sub_header='Tagline',
            content='Content',
            index=2)
        self.page.save()

        self.comment = PageComment()
        self.comment.page_object = self.page
        self.comment.scope_object = self.project
        self.comment.author = self.user
        self.comment.content = "blah blah"
        self.comment.save()

    def test_send_notification(self):
        """ Test non replyable notification """

        #TODO use templates and context that doesn't rely on another app!
        subject_template = 'replies/emails/post_comment_subject.txt'
        body_template = 'replies/emails/post_comment.txt'
        context = {
            'comment': self.comment,
            'domain': 'example.org',
        }
        message_count = len(mail.outbox)
        send_notifications(self.user, subject_template, body_template, context)
        self.assertEqual(ResponseToken.objects.count(), 0)

        #TODO check that 1 email was sent
        #self.assertEqual(len(mail.outbox), message_count + 1)

    def test_notification_with_response(self):
        """ Test notification with possible response """
        subject_template = 'replies/emails/post_comment_subject.txt'
        body_template = 'replies/emails/post_comment.txt'
        context = {
            'comment': self.comment,
            'domain': 'example.org',
        }
        send_notifications(self.user, subject_template, body_template, context, "/call/me/back")
        self.assertEqual(ResponseToken.objects.count(), 1)

    def test_respond_by_email_hook(self):
        """ Test that email hook works and returns status code 200 """
        data = {
            u'from': [u'Dirk Uys <*****@*****.**>'],
            u'attachments': [u'0'],
            u'to': [u'*****@*****.**'],
            u'text': [u'Maybe this time\n'],
            u'envelope': [u'{"to":["*****@*****.**"],"from":"*****@*****.**"}'],
            u'headers': [
                u'Received: by 127.0.0.1 with SMTP id 7HNiGL0knF Thu, 21 Jun 2012 10:41:34 -0500 (CDT)\nReceived: from mail-ey0-f182.google.com (mail-ey0-f182.google.com [209.85.215.182]) by mx2.sendgrid.net (Postfix) with ESMTPS id 165E0179EA68 for <*****@*****.**>; Thu, 21 Jun 2012 10:41:33 -0500 (CDT)\nReceived: by eabm6 with SMTP id m6so287981eab.41 for <*****@*****.**>; Thu, 21 Jun 2012 08:41:31 -0700 (PDT)\nX-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type :x-gm-message-state; bh=U5LQcX1VeMMflboN7DWaD8mhHxEUMyxJKSioavl+PaY=; b=mod67Tg9pJkedv/ired6n89xAik5vPltmw+78esRAyAivlBnX845MVF1quPz3ApUCR 3D0a4knRfG1DXL7I5WHPUelHmT7vSurAtHPrW4ndJgyCoPjsd32rL9rIfrFpJGAWWd9+ DAO7gRMx0CtPNXL3UoOKtZTEMT1tF+Zt6UMPY+kZwP64lO4/k6dc6XYfGMYTEU2HUill CIftL/P7KjbcopBXpKF5YAJGHOazmw1QcRlTFaIW6ymW1uSZ5ieNUgZVQXIXw4/760O5 TJCZsh2qACfZ2PWWOfBV6bu0kjsab5TrsbBUdlu5uRoLeJxXqYzTroJ8+cbGPhrqZSGT 5XnA==\nMIME-Version: 1.0\nReceived: by 10.152.109.198 with SMTP id hu6mr26806411lab.21.1340293291509; Thu, 21 Jun 2012 08:41:31 -0700 (PDT)\nReceived: by 10.112.11.97 with HTTP; Thu, 21 Jun 2012 08:41:31 -0700 (PDT)\nDate: Thu, 21 Jun 2012 17:41:31 +0200\nMessage-ID: <CAAcFfF+a-WTypUHo2aPi_jjemNM8RRD3habXoFpopCOcFs=M0g@mail.gmail.com>\nSubject: test3\nFrom: Dirk Uys <*****@*****.**>\nTo: [email protected]\nContent-Type: multipart/alternative; boundary=bcaec54b49d689096204c2fd5911\nX-Gm-Message-State: ALoCoQnzUWK4n+vh7QKSKjeJhgRrSUiCswAUpJmKNuhvGunMWMyixYjwSRwhiFRrOv0DHlpBmkke\n'],
            u'html': [u'Maybe this time<br>\n'],
            u'charsets': [u'{"to":"UTF-8","html":"ISO-8859-1","subject":"UTF-8","from":"UTF-8","text":"ISO-8859-1"}'],
            u'dkim': [u'none'],
            u'SPF': [u'none'],
            u'subject': [u'test3']
        }
        response = self.client.post('/{0}/notifications/response/'.format(self.locale), data)
        self.assertEqual(response.status_code, 200)

    def test_auto_reply(self):
        """ Test that email hook works and rejects auto responder replies """
        data = {
            u'from': [u'Dirk Uys <*****@*****.**>'],
            u'attachments': [u'0'],
            u'to': [u'*****@*****.**'],
            u'text': [u'Maybe this time\n'],
            u'envelope': [u'{"to":["*****@*****.**"],"from":"*****@*****.**"}'],
            u'headers': [
                u'Received: by 127.0.0.1 with SMTP id 7HNiGL0knF Thu, 21 Jun 2012 10:41:34 -0500 (CDT)\nReceived: from mail-ey0-f182.google.com (mail-ey0-f182.google.com [209.85.215.182]) by mx2.sendgrid.net (Postfix) with ESMTPS id 165E0179EA68 for <*****@*****.**>; Thu, 21 Jun 2012 10:41:33 -0500 (CDT)\nReceived: by eabm6 with SMTP id m6so287981eab.41 for <*****@*****.**>; Thu, 21 Jun 2012 08:41:31 -0700 (PDT)\nX-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type :x-gm-message-state; bh=U5LQcX1VeMMflboN7DWaD8mhHxEUMyxJKSioavl+PaY=; b=mod67Tg9pJkedv/ired6n89xAik5vPltmw+78esRAyAivlBnX845MVF1quPz3ApUCR 3D0a4knRfG1DXL7I5WHPUelHmT7vSurAtHPrW4ndJgyCoPjsd32rL9rIfrFpJGAWWd9+ DAO7gRMx0CtPNXL3UoOKtZTEMT1tF+Zt6UMPY+kZwP64lO4/k6dc6XYfGMYTEU2HUill CIftL/P7KjbcopBXpKF5YAJGHOazmw1QcRlTFaIW6ymW1uSZ5ieNUgZVQXIXw4/760O5 TJCZsh2qACfZ2PWWOfBV6bu0kjsab5TrsbBUdlu5uRoLeJxXqYzTroJ8+cbGPhrqZSGT 5XnA==\nMIME-Version: 1.0\nReceived: by 10.152.109.198 with SMTP id hu6mr26806411lab.21.1340293291509; Thu, 21 Jun 2012 08:41:31 -0700 (PDT)\nReceived: by 10.112.11.97 with HTTP; Thu, 21 Jun 2012 08:41:31 -0700 (PDT)\nDate: Thu, 21 Jun 2012 17:41:31 +0200\nMessage-ID: <CAAcFfF+a-WTypUHo2aPi_jjemNM8RRD3habXoFpopCOcFs=M0g@mail.gmail.com>\nSubject: test3\nFrom: Dirk Uys <*****@*****.**>\nTo: [email protected]\nContent-Type: multipart/alternative; boundary=bcaec54b49d689096204c2fd5911\nX-Autorespond: dont\nX-Gm-Message-State: ALoCoQnzUWK4n+vh7QKSKjeJhgRrSUiCswAUpJmKNuhvGunMWMyixYjwSRwhiFRrOv0DHlpBmkke\n'],
            u'html': [u'Maybe this time<br>\n'],
            u'charsets': [u'{"to":"UTF-8","html":"ISO-8859-1","subject":"UTF-8","from":"UTF-8","text":"ISO-8859-1"}'],
            u'dkim': [u'none'],
            u'SPF': [u'none'],
            u'subject': [u'test3']
        }
        response = self.client.post('/{0}/notifications/response/'.format(self.locale), data)
        self.assertEqual(response.status_code, 200)
        #X-Autoreply: yes
        #Auto-Submitted: auto-replied


    def test_reply_by_email(self):

        subject_template = 'replies/emails/post_comment_subject.txt'
        body_template = 'replies/emails/post_comment.txt'
        context = {
            'comment': self.comment,
            'domain': 'example.org',
        }
        callback_url = "/{0}/comments/{1}/email_reply/".format(self.locale, self.comment.id)
        send_notifications(
            self.user, subject_template, body_template, context, callback_url
        )
        self.assertEqual(ResponseToken.objects.count(), 1)

        token = ResponseToken.objects.all()[0]
        
        data = {
            u'from': [u'Testing <*****@*****.**>'],
            u'to': [u'reply+{0}@reply.p2pu.org'.format(token.response_token)],
            u'text': [u'Maybe this time\n'],
        }

        #post_notification_response(token, '*****@*****.**', 'my response') 

        response = self.client.post('/{0}/notifications/response/'.format(self.locale), data)
        self.assertEqual(response.status_code, 200)

        # i wish, the test db isn't running a server that can take the callback
        #comments = PageComment.objects.all()
        #self.assertEquals(comments.count(), 2)

    def test_notification_create(self):
        """ Test sending a notification using the API """

        notification_data = {
            'api-key': settings.INTERNAL_API_KEY,
            'user': self.user.username,
            'subject': 'notification',
            'text': 'Some notification text.\nAnd some more',
            'callback_url': 'http://mentor.p2pu.org/message/43234',
            'from': self.user.username,
        }

        json_data = json.dumps(notification_data)
        response = self.client.post(
            '/{0}/notifications/notification/'.format(self.locale), 
            json_data,
            "text/json"
        )
        self.assertEqual(response.status_code, 200)
Пример #20
0
def import_from_old_site(request):
    user = request.user.get_profile()
    if 'school' in request.GET:
        try:
            school = School.objects.get(slug=request.GET['school'])
        except School.DoesNotExist:
            return http.HttpResponseRedirect(reverse('projects_clone'))
    else:
        school = None
    if request.method == 'POST':
        form = project_forms.ImportProjectForm(school, request.POST)
        if form.is_valid():
            course = form.cleaned_data['course']
            project = Project(name=course['name'],
                short_description= course['short_description'],
                long_description=course['long_description'],
                school=course['school'], imported_from=course['slug'])
            project.save()
            act = Activity(actor=user,
                verb='http://activitystrea.ms/schema/1.0/post',
                project=project,
                target_project=project)
            act.save()
            participation = Participation(project=project, user=user, organizing=True)
            participation.save()
            new_rel = Relationship(source=user, target_project=project)
            try:
                new_rel.save()
            except IntegrityError:
                pass
            if course['detailed_description']:
                detailed_description_content = course['detailed_description']
            else:
                detailed_description_content = render_to_string(
                    "projects/detailed_description_initial_content.html",
                    {})
            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_content = render_to_string("projects/sign_up_initial_content.html",
                {})
            sign_up = Page(title=_('Sign-Up'), slug='sign-up',
                content=sign_up_content, listed=False, editable=False,
                author_id=user.id, project_id=project.id)
            sign_up.save()
            project.sign_up_id = sign_up.id
            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()
            messages.success(request, _('The study group has been imported.'))
            return http.HttpResponseRedirect(reverse('projects_show', kwargs={
                'slug': project.slug,
            }))
        else:
            messages.error(request,
                _("There was a problem importing the study group."))
    else:
        form = project_forms.ImportProjectForm(school)
    return render_to_response('projects/project_import.html', {
        'form': form, 'import_tab': True, 'school': school,
    }, context_instance=RequestContext(request))
Пример #21
0
def import_from_old_site(request):
    user = request.user.get_profile()
    if 'school' in request.GET:
        try:
            school = School.objects.get(slug=request.GET['school'])
        except School.DoesNotExist:
            return http.HttpResponseRedirect(reverse('projects_clone'))
    else:
        school = None
    if request.method == 'POST':
        form = project_forms.ImportProjectForm(school, request.POST)
        if form.is_valid():
            course = form.cleaned_data['course']
            project = Project(name=course['name'],
                short_description= course['short_description'],
                long_description=course['long_description'],
                school=course['school'], imported_from=course['slug'])
            project.save()
            act = Activity(actor=user,
                verb='http://activitystrea.ms/schema/1.0/post',
                project=project,
                target_project=project)
            act.save()
            participation = Participation(project=project, user=user, organizing=True)
            participation.save()
            new_rel = Relationship(source=user, target_project=project)
            try:
                new_rel.save()
            except IntegrityError:
                pass
            if course['detailed_description']:
                detailed_description_content = course['detailed_description']
            else:
                detailed_description_content = render_to_string(
                    "projects/detailed_description_initial_content.html",
                    {})
            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_content = render_to_string("projects/sign_up_initial_content.html",
                {})
            sign_up = Page(title=_('Sign-Up'), slug='sign-up',
                content=sign_up_content, listed=False, editable=False,
                author_id=user.id, project_id=project.id)
            sign_up.save()
            project.sign_up_id = sign_up.id
            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()
            messages.success(request, _('The study group has been imported.'))
            return http.HttpResponseRedirect(reverse('projects_show', kwargs={
                'slug': project.slug,
            }))
        else:
            messages.error(request,
                _("There was a problem importing the study group."))
    else:
        form = project_forms.ImportProjectForm(school)
    return render_to_response('projects/project_import.html', {
        'form': form, 'import_tab': True, 'school': school,
    }, context_instance=RequestContext(request))
Пример #22
0
def clone(request):
    user = request.user.get_profile()
    if 'school' in request.GET:
        try:
            school = School.objects.get(slug=request.GET['school'])
        except School.DoesNotExist:
            return http.HttpResponseRedirect(reverse('projects_clone'))
    else:
        school = None
    if request.method == 'POST':
        form = project_forms.CloneProjectForm(school, request.POST)
        if form.is_valid():
            base_project = form.cleaned_data['project']
            project = Project(name=base_project.name,
                short_description=base_project.short_description,
                long_description=base_project.long_description,
                school=base_project.school, clone_of=base_project)
            project.save()
            act = Activity(actor=user,
                verb='http://activitystrea.ms/schema/1.0/post',
                project=project,
                target_project=project)
            act.save()
            participation = Participation(project=project, user=user, organizing=True)
            participation.save()
            new_rel = Relationship(source=user, target_project=project)
            try:
                new_rel.save()
            except IntegrityError:
                pass
            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
            sign_up = Page(title=_('Sign-Up'), slug='sign-up',
                content=base_project.sign_up.content, listed=False, editable=False,
                author_id=user.id, project_id=project.id)
            sign_up.save()
            project.sign_up_id = sign_up.id
            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()
            messages.success(request, _('The study group has been cloned.'))
            return http.HttpResponseRedirect(reverse('projects_show', kwargs={
                'slug': project.slug,
            }))
        else:
            messages.error(request,
                _("There was a problem cloning the study group."))
    else:
        form = project_forms.CloneProjectForm(school)
    return render_to_response('projects/project_clone.html', {
        'form': form, 'clone_tab': True, 'school': school,
    }, context_instance=RequestContext(request))
Пример #23
0
class RepliesViewsTests(TestCase):

    test_username = '******'
    test_email = '*****@*****.**'
    test_password = '******'

    def setUp(self):
        self.client = Client()
        self.locale = 'en'
        django_user = User(
            username=self.test_username,
            email=self.test_email,
        )
        self.user = create_profile(django_user)
        self.user.set_password(self.test_password)
        self.user.save()

        self.project = Project(
            name='Reply Project',
            short_description='This project is to test replies',
            long_description='No really, its good',
        )
        self.project.save()

        participation = Participation(project=self.project,
                                      user=self.user,
                                      organizing=True)
        participation.save()

        self.page = Page(author=self.user,
                         project=self.project,
                         title='task title',
                         sub_header='Tagline',
                         content='Content',
                         index=2)
        self.page.save()

    def test_comment(self):
        comment_count = PageComment.objects.count()
        data = {
            'content': 'This is a comment',
        }
        self.client.login(username=self.test_username,
                          password=self.test_password)
        comment_url = '/{0}/comments/create/page/content/{1}/project/projects/{2}/'.format(
            self.locale, self.page.id, self.project.id)
        response = self.client.post(comment_url, data)

        #redirect_url = '/{0}/comments/{1}/'.format(self.locale, comment_count+1)
        #self.assertRedirects(response, redirect_url, target_status_code=302)

        comments = PageComment.objects.all()
        self.assertEquals(comments.count(), comment_count + 1)

    def test_repy(self):
        comment = PageComment()
        comment.page_object = self.page
        comment.scope_object = self.project
        comment.author = self.user
        comment.content = "blah blah"
        comment.save()

        self.client.login(username=self.test_username,
                          password=self.test_password)

        # post reply
        data = {'content': 'This is a reply'}
        reply_url = '/{0}/comments/{1}/reply/'.format(self.locale, comment.id)
        response = self.client.post(reply_url, data)

        comments = PageComment.objects.all()
        self.assertEquals(comments.count(), 2)

    def test_reply_to_status(self):
        """ Test a reply sent to a status update on a course page """
        status = Status(status="status update")
        status.author = self.user
        status.project = self.project
        status.save()

        callback_url = "/en/comments/create/activity/activity/{0}/project/projects/{1}/callback/".format(
            status.activity.get().id, self.project.id)

        data = {
            u'api-key': settings.INTERNAL_API_KEY,
            u'from': self.test_username,
            u'text': u'Maybe this time\n',
        }

        comment_count = PageComment.objects.filter(sent_by_email=True).count()
        response = self.client.post(callback_url, data)
        self.assertEqual(response.status_code, 200)
        comments = PageComment.objects.filter(sent_by_email=True)
        self.assertEqual(comment_count + 1, comments.count())

    def test_reply_by_email(self):
        # post a comment
        comment = PageComment()
        comment.page_object = self.page
        comment.scope_object = self.project
        comment.author = self.user
        comment.content = "blah blah"
        comment.save()

        data = {
            u'api-key': settings.INTERNAL_API_KEY,
            u'from': self.test_username,
            u'text': u'Maybe this time\n',
        }

        comment_count = PageComment.objects.filter(sent_by_email=True).count()
        response = self.client.post(
            '/{0}/comments/{1}/email_reply/'.format(self.locale, comment.id),
            data)
        self.assertEqual(response.status_code, 200)

        comments = PageComment.objects.filter(sent_by_email=True)
        self.assertEquals(comments.count(), comment_count + 1)

    def test_comment_reply_api_key(self):
        comment = PageComment()
        comment.page_object = self.page
        comment.scope_object = self.project
        comment.author = self.user
        comment.content = "blah blah"
        comment.save()

        data = {
            u'api-key': 'notthecorrectkey',
            u'from': self.test_username,
            u'text': u'Some stealthy reply that won\'t make it in!\n',
        }

        response = self.client.post(
            '/{0}/comments/{1}/email_reply/'.format(self.locale, comment.id),
            data)
        self.assertEqual(response.status_code, 403)
Пример #24
0
def clone(request):
    user = request.user.get_profile()
    if 'school' in request.GET:
        try:
            school = School.objects.get(slug=request.GET['school'])
        except School.DoesNotExist:
            return http.HttpResponseRedirect(reverse('projects_clone'))
    else:
        school = None
    if request.method == 'POST':
        form = project_forms.CloneProjectForm(school, request.POST)
        if form.is_valid():
            base_project = form.cleaned_data['project']
            project = Project(name=base_project.name,
                short_description=base_project.short_description,
                long_description=base_project.long_description,
                school=base_project.school, clone_of=base_project)
            project.save()
            act = Activity(actor=user,
                verb='http://activitystrea.ms/schema/1.0/post',
                project=project,
                target_project=project)
            act.save()
            participation = Participation(project=project, user=user, organizing=True)
            participation.save()
            new_rel = Relationship(source=user, target_project=project)
            try:
                new_rel.save()
            except IntegrityError:
                pass
            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
            sign_up = Page(title=_('Sign-Up'), slug='sign-up',
                content=base_project.sign_up.content, listed=False, editable=False,
                author_id=user.id, project_id=project.id)
            sign_up.save()
            project.sign_up_id = sign_up.id
            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()
            messages.success(request, _('The study group has been cloned.'))
            return http.HttpResponseRedirect(reverse('projects_show', kwargs={
                'slug': project.slug,
            }))
        else:
            messages.error(request,
                _("There was a problem cloning the study group."))
    else:
        form = project_forms.CloneProjectForm(school)
    return render_to_response('projects/project_clone.html', {
        'form': form, 'clone_tab': True, 'school': school,
    }, context_instance=RequestContext(request))
Пример #25
0
class NotificationsTests(TestCase):

    test_username = '******'
    test_email = '*****@*****.**'
    test_password = '******'

    def setUp(self):
        self.client = Client()
        self.locale = 'en'
        django_user = User(
            username=self.test_username,
            email=self.test_email,
        )
        self.user = create_profile(django_user)
        self.user.set_password(self.test_password)
        self.user.save()

        self.project = Project(
            name='Reply Project',
            short_description='This project is to test replies',
            long_description='No really, its good',
        )
        self.project.save()

        participation = Participation(project=self.project,
                                      user=self.user,
                                      organizing=True)
        participation.save()

        self.page = Page(author=self.user,
                         project=self.project,
                         title='task title',
                         sub_header='Tagline',
                         content='Content',
                         index=2)
        self.page.save()

        self.comment = PageComment()
        self.comment.page_object = self.page
        self.comment.scope_object = self.project
        self.comment.author = self.user
        self.comment.content = "blah blah"
        self.comment.save()

    def test_send_notification(self):
        """ Test non replyable notification """

        #TODO use templates and context that doesn't rely on another app!
        subject_template = 'replies/emails/post_comment_subject.txt'
        body_template = 'replies/emails/post_comment.txt'
        context = {
            'comment': self.comment,
            'domain': 'example.org',
        }
        message_count = len(mail.outbox)
        send_notifications(self.user, subject_template, body_template, context)
        self.assertEqual(ResponseToken.objects.count(), 0)

        #TODO check that 1 email was sent
        #self.assertEqual(len(mail.outbox), message_count + 1)

    def test_notification_with_response(self):
        """ Test notification with possible response """
        subject_template = 'replies/emails/post_comment_subject.txt'
        body_template = 'replies/emails/post_comment.txt'
        context = {
            'comment': self.comment,
            'domain': 'example.org',
        }
        send_notifications(self.user, subject_template, body_template, context,
                           "/call/me/back")
        self.assertEqual(ResponseToken.objects.count(), 1)

    def test_respond_by_email_hook(self):
        """ Test that email hook works and returns status code 200 """
        data = {
            u'from': [u'Dirk Uys <*****@*****.**>'],
            u'attachments': [u'0'],
            u'to': [u'*****@*****.**'],
            u'text': [u'Maybe this time\n'],
            u'envelope': [
                u'{"to":["*****@*****.**"],"from":"*****@*****.**"}'
            ],
            u'headers': [
                u'Received: by 127.0.0.1 with SMTP id 7HNiGL0knF Thu, 21 Jun 2012 10:41:34 -0500 (CDT)\nReceived: from mail-ey0-f182.google.com (mail-ey0-f182.google.com [209.85.215.182]) by mx2.sendgrid.net (Postfix) with ESMTPS id 165E0179EA68 for <*****@*****.**>; Thu, 21 Jun 2012 10:41:33 -0500 (CDT)\nReceived: by eabm6 with SMTP id m6so287981eab.41 for <*****@*****.**>; Thu, 21 Jun 2012 08:41:31 -0700 (PDT)\nX-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type :x-gm-message-state; bh=U5LQcX1VeMMflboN7DWaD8mhHxEUMyxJKSioavl+PaY=; b=mod67Tg9pJkedv/ired6n89xAik5vPltmw+78esRAyAivlBnX845MVF1quPz3ApUCR 3D0a4knRfG1DXL7I5WHPUelHmT7vSurAtHPrW4ndJgyCoPjsd32rL9rIfrFpJGAWWd9+ DAO7gRMx0CtPNXL3UoOKtZTEMT1tF+Zt6UMPY+kZwP64lO4/k6dc6XYfGMYTEU2HUill CIftL/P7KjbcopBXpKF5YAJGHOazmw1QcRlTFaIW6ymW1uSZ5ieNUgZVQXIXw4/760O5 TJCZsh2qACfZ2PWWOfBV6bu0kjsab5TrsbBUdlu5uRoLeJxXqYzTroJ8+cbGPhrqZSGT 5XnA==\nMIME-Version: 1.0\nReceived: by 10.152.109.198 with SMTP id hu6mr26806411lab.21.1340293291509; Thu, 21 Jun 2012 08:41:31 -0700 (PDT)\nReceived: by 10.112.11.97 with HTTP; Thu, 21 Jun 2012 08:41:31 -0700 (PDT)\nDate: Thu, 21 Jun 2012 17:41:31 +0200\nMessage-ID: <CAAcFfF+a-WTypUHo2aPi_jjemNM8RRD3habXoFpopCOcFs=M0g@mail.gmail.com>\nSubject: test3\nFrom: Dirk Uys <*****@*****.**>\nTo: [email protected]\nContent-Type: multipart/alternative; boundary=bcaec54b49d689096204c2fd5911\nX-Gm-Message-State: ALoCoQnzUWK4n+vh7QKSKjeJhgRrSUiCswAUpJmKNuhvGunMWMyixYjwSRwhiFRrOv0DHlpBmkke\n'
            ],
            u'html': [u'Maybe this time<br>\n'],
            u'charsets': [
                u'{"to":"UTF-8","html":"ISO-8859-1","subject":"UTF-8","from":"UTF-8","text":"ISO-8859-1"}'
            ],
            u'dkim': [u'none'],
            u'SPF': [u'none'],
            u'subject': [u'test3']
        }
        response = self.client.post(
            '/{0}/notifications/response/'.format(self.locale), data)
        self.assertEqual(response.status_code, 200)

    def test_auto_reply(self):
        """ Test that email hook works and rejects auto responder replies """
        data = {
            u'from': [u'Dirk Uys <*****@*****.**>'],
            u'attachments': [u'0'],
            u'to': [u'*****@*****.**'],
            u'text': [u'Maybe this time\n'],
            u'envelope': [
                u'{"to":["*****@*****.**"],"from":"*****@*****.**"}'
            ],
            u'headers': [
                u'Received: by 127.0.0.1 with SMTP id 7HNiGL0knF Thu, 21 Jun 2012 10:41:34 -0500 (CDT)\nReceived: from mail-ey0-f182.google.com (mail-ey0-f182.google.com [209.85.215.182]) by mx2.sendgrid.net (Postfix) with ESMTPS id 165E0179EA68 for <*****@*****.**>; Thu, 21 Jun 2012 10:41:33 -0500 (CDT)\nReceived: by eabm6 with SMTP id m6so287981eab.41 for <*****@*****.**>; Thu, 21 Jun 2012 08:41:31 -0700 (PDT)\nX-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type :x-gm-message-state; bh=U5LQcX1VeMMflboN7DWaD8mhHxEUMyxJKSioavl+PaY=; b=mod67Tg9pJkedv/ired6n89xAik5vPltmw+78esRAyAivlBnX845MVF1quPz3ApUCR 3D0a4knRfG1DXL7I5WHPUelHmT7vSurAtHPrW4ndJgyCoPjsd32rL9rIfrFpJGAWWd9+ DAO7gRMx0CtPNXL3UoOKtZTEMT1tF+Zt6UMPY+kZwP64lO4/k6dc6XYfGMYTEU2HUill CIftL/P7KjbcopBXpKF5YAJGHOazmw1QcRlTFaIW6ymW1uSZ5ieNUgZVQXIXw4/760O5 TJCZsh2qACfZ2PWWOfBV6bu0kjsab5TrsbBUdlu5uRoLeJxXqYzTroJ8+cbGPhrqZSGT 5XnA==\nMIME-Version: 1.0\nReceived: by 10.152.109.198 with SMTP id hu6mr26806411lab.21.1340293291509; Thu, 21 Jun 2012 08:41:31 -0700 (PDT)\nReceived: by 10.112.11.97 with HTTP; Thu, 21 Jun 2012 08:41:31 -0700 (PDT)\nDate: Thu, 21 Jun 2012 17:41:31 +0200\nMessage-ID: <CAAcFfF+a-WTypUHo2aPi_jjemNM8RRD3habXoFpopCOcFs=M0g@mail.gmail.com>\nSubject: test3\nFrom: Dirk Uys <*****@*****.**>\nTo: [email protected]\nContent-Type: multipart/alternative; boundary=bcaec54b49d689096204c2fd5911\nX-Autorespond: dont\nX-Gm-Message-State: ALoCoQnzUWK4n+vh7QKSKjeJhgRrSUiCswAUpJmKNuhvGunMWMyixYjwSRwhiFRrOv0DHlpBmkke\n'
            ],
            u'html': [u'Maybe this time<br>\n'],
            u'charsets': [
                u'{"to":"UTF-8","html":"ISO-8859-1","subject":"UTF-8","from":"UTF-8","text":"ISO-8859-1"}'
            ],
            u'dkim': [u'none'],
            u'SPF': [u'none'],
            u'subject': [u'test3']
        }
        response = self.client.post(
            '/{0}/notifications/response/'.format(self.locale), data)
        self.assertEqual(response.status_code, 200)
        #X-Autoreply: yes
        #Auto-Submitted: auto-replied

    def test_reply_by_email(self):

        subject_template = 'replies/emails/post_comment_subject.txt'
        body_template = 'replies/emails/post_comment.txt'
        context = {
            'comment': self.comment,
            'domain': 'example.org',
        }
        callback_url = "/{0}/comments/{1}/email_reply/".format(
            self.locale, self.comment.id)
        send_notifications(self.user, subject_template, body_template, context,
                           callback_url)
        self.assertEqual(ResponseToken.objects.count(), 1)

        token = ResponseToken.objects.all()[0]

        data = {
            u'from': [u'Testing <*****@*****.**>'],
            u'to': [u'reply+{0}@reply.p2pu.org'.format(token.response_token)],
            u'text': [u'Maybe this time\n'],
        }

        #post_notification_response(token, '*****@*****.**', 'my response')

        response = self.client.post(
            '/{0}/notifications/response/'.format(self.locale), data)
        self.assertEqual(response.status_code, 200)

        # i wish, the test db isn't running a server that can take the callback
        #comments = PageComment.objects.all()
        #self.assertEquals(comments.count(), 2)

    def test_notification_create(self):
        """ Test sending a notification using the API """

        notification_data = {
            'api-key': settings.INTERNAL_API_KEY,
            'user': self.user.username,
            'subject': 'notification',
            'text': 'Some notification text.\nAnd some more',
            'callback_url': 'http://mentor.p2pu.org/message/43234',
            'from': self.user.username,
        }

        json_data = json.dumps(notification_data)
        response = self.client.post(
            '/{0}/notifications/notification/'.format(self.locale), json_data,
            "text/json")
        self.assertEqual(response.status_code, 200)
Пример #26
0
class RepliesViewsTests(TestCase):

    test_username = '******'
    test_email = '*****@*****.**'
    test_password = '******'

    def setUp(self):
        self.client = Client()
        self.locale = 'en'
        django_user = User(
            username=self.test_username,
            email=self.test_email,
        )
        self.user = create_profile(django_user)
        self.user.set_password(self.test_password)
        self.user.save()

        self.project = Project(name='Reply Project',
            short_description='This project is to test replies',
            long_description='No really, its good',
        )
        self.project.save()
        
        participation = Participation(project=self.project,
            user=self.user, organizing=True)
        participation.save()
        
        self.page = Page(author=self.user,
            project=self.project,
            title='task title',
            sub_header='Tagline',
            content='Content',
            index=2)
        self.page.save()

    def test_comment(self):
        comment_count = PageComment.objects.count()
        data = {
            'content': 'This is a comment',
        }
        self.client.login(username=self.test_username,
            password=self.test_password)
        comment_url = '/{0}/comments/create/page/content/{1}/project/projects/{2}/'.format(self.locale, self.page.id, self.project.id)
        response = self.client.post(comment_url, data)
        
        #redirect_url = '/{0}/comments/{1}/'.format(self.locale, comment_count+1)
        #self.assertRedirects(response, redirect_url, target_status_code=302)
            
        comments = PageComment.objects.all()
        self.assertEquals(comments.count(), comment_count+1)

    def test_repy(self):
        comment = PageComment()
        comment.page_object = self.page
        comment.scope_object = self.project
        comment.author = self.user
        comment.content = "blah blah"
        comment.save()

        self.client.login(username=self.test_username, password=self.test_password)

        # post reply
        data = { 'content': 'This is a reply' }
        reply_url = '/{0}/comments/{1}/reply/'.format(self.locale, comment.id)
        response = self.client.post(reply_url, data)
            
        comments = PageComment.objects.all()
        self.assertEquals(comments.count(), 2)

    def test_reply_to_status(self):
        """ Test a reply sent to a status update on a course page """
        status = Status(status="status update")
        status.author = self.user
        status.project = self.project
        status.save()

        callback_url = "/en/comments/create/activity/activity/{0}/project/projects/{1}/callback/".format(status.activity.get().id, self.project.id)

        data = {
            u'api-key': settings.INTERNAL_API_KEY,
            u'from': self.test_username,
            u'text': u'Maybe this time\n',
        }

        comment_count = PageComment.objects.filter(sent_by_email=True).count()
        response = self.client.post(callback_url, data)
        self.assertEqual(response.status_code, 200)
        comments = PageComment.objects.filter(sent_by_email=True)
        self.assertEqual(comment_count+1, comments.count())


    def test_reply_by_email(self):
        # post a comment
        comment = PageComment()
        comment.page_object = self.page
        comment.scope_object = self.project
        comment.author = self.user
        comment.content = "blah blah"
        comment.save()
        
        data = {
            u'api-key': settings.INTERNAL_API_KEY,
            u'from': self.test_username,
            u'text': u'Maybe this time\n',
        }

        comment_count = PageComment.objects.filter(sent_by_email=True).count()
        response = self.client.post('/{0}/comments/{1}/email_reply/'.format(self.locale, comment.id), data)
        self.assertEqual(response.status_code, 200)

        comments = PageComment.objects.filter(sent_by_email=True)
        self.assertEquals(comments.count(), comment_count+1)

    def test_comment_reply_api_key(self):
        comment = PageComment()
        comment.page_object = self.page
        comment.scope_object = self.project
        comment.author = self.user
        comment.content = "blah blah"
        comment.save()
        
        data = {
            u'api-key': 'notthecorrectkey',
            u'from': self.test_username,
            u'text': u'Some stealthy reply that won\'t make it in!\n',
        }

        response = self.client.post('/{0}/comments/{1}/email_reply/'.format(self.locale, comment.id), data)
        self.assertEqual(response.status_code, 403)
Пример #27
0
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']
            #CS - too much logic in view
            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_create_tasks', 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))
Пример #28
0
	def save(self):
		sid = transaction.savepoint()
		page = Page()
		page.slug = self.slug[0:100]
		page.title = self.title[0:100]
		page.body = self.body
		page.alias_url = "http://www.birdlife.fi/" + self.source_path
		mtime = datetime.fromtimestamp(os.path.getmtime(self.source_abspath))
		page.created = mtime
		page.last_edited = mtime
		page.lang = "fi"
		if self.template:
			page.template = self.template
		if self.level > 0:
			level_parent = self.level - 1
			#print "Searching parent: level=%s slug=%s" % (level_parent, self.slug_parent)
			try:
				parent = Page.objects.get(level=level_parent, slug=self.slug_parent)
			except Page.DoesNotExist:
				#print "Creating parent for %s: %s" % (self.path, self.slug_parent)
				parent = Page()
				parent.slug = self.slug_parent
				parent.title = parent.slug.capitalize()
				parent.body = "<h1>%s</h1><p>(Autogenerated page)</p>" % parent.title
				if level_parent > 0:
					pp_level = self.level - 2
					pp_slug = self.path.split("/")[-3]
					#print "Searching parent of parent: level=%s slug=%s" % (pp_level, pp_slug)
					pparent = Page.objects.get(level=pp_level, slug=pp_slug)
					parent.parent = pparent
				parent.save()
			page.parent = parent
		try:
			page.save()
			transaction.savepoint_commit(sid)

			uniq_attachments = set(self.attachments)
			for path in uniq_attachments:
				attachment = Attachment.create_from_file(path, None, False)
				attachment.page = page
				attachment.save()
				self.debug("Imported attachment: %s" % attachment.id)

		except DatabaseError as e:
		#	w = open("/tmp/body", "w")
		#	w.write(self.body.encode("utf8"))
		#	w.close()
		#	raise SystemExit()
			transaction.savepoint_rollback(sid)
			raise ImportError("%s" % e)
			#print "Oops!!!!!!!"
			#page.body = BeautifulSoup(self.html, convertEntities=BeautifulStoneSoup.HTML_ENTITIES).prettify()
			#page.save()
			#raise SystemExit()
		
		if self.debug_path == self.path:
			raise SystemExit()
		self.page = page