예제 #1
0
def create_project(badge_uri, author_uri, title, image_uri, work_url, description, reflection, tags):
    
    if Project.objects.filter(author_uri=author_uri, badge_uri=badge_uri, date_deleted__isnull=True).exists():
        raise MultipleProjectError('A user can only submit 1 project for a badge')

    badge = badge_api.get_badge(badge_uri)

    if author_uri in badge_api.get_badge_experts(badge_uri):
        raise Exception(u'Badge {0} already awarded to user'.format(badge_uri))

    if isinstance(tags, list):
        tags = ','.join(tags)

    project_db = Project(
        title=title,
        image_uri=image_uri,
        work_url=work_url,
        description=description,
        reflection=reflection,
        tags=tags,
        badge_uri=badge_uri,
        author_uri=author_uri,
        date_created=datetime.utcnow(),
        date_updated=datetime.utcnow()
    )
    project_db.save()

    project = get_project(id2uri(project_db.id))

    send_project_creation_notification(project)
    experts = badge_api.get_badge_experts(project['badge_uri'])
    send_project_creation_expert_notification(project, badge, experts)
    return project
예제 #2
0
파일: tests.py 프로젝트: mkcode/badges
    def test_award_badge(self):
        badge = badge_api.create_badge(*self.badge_values)
        self.assertNotIn(badge['author_uri'], badge_api.get_badge_experts(badge['uri']))

        badge_api.publish_badge(badge['uri'])
        kwargs = {
            'badge_uri': badge['uri'],
            'user_uri': badge['author_uri'],
            'expert_uri': badge['author_uri'],
            'evidence_url': 'http://some.evi/dence'
        }
        
        # test that the author have the badge
        with self.assertRaisesRegexp(Exception, 'already awarded'):
            badge_api.award_badge(**kwargs)

        # test that non expert cannot award badge
        kwargs['user_uri'] = '/uri/user/iwantbadge'
        kwargs['expert_uri'] = '/uri/user/igivebadge'
        with self.assertRaisesRegexp(Exception, 'Cannot award'):
            badge_api.award_badge(**kwargs)

        # test that expert can award badge
        kwargs['expert_uri'] = badge['author_uri']
        badge_api.award_badge(**kwargs)
        self.assertIn(kwargs['user_uri'], badge_api.get_badge_experts(badge['uri']))

        # test that badge awards triggers notifications
        kwargs['user_uri'] = '/uri/user/ialsowantbadge'
        with patch('notifications.models.send_notification') as send:
            badge_api.award_badge(**kwargs)
            self.assertTrue(send.called)
예제 #3
0
파일: models.py 프로젝트: mkcode/badges
def submit_feedback(project_uri, expert_uri, good, bad, ugly):
    project=Project.objects.get(id=uri2id(project_uri))

    if not expert_uri in badge_api.get_badge_experts(project.badge_uri):
        raise Exception('Only experts can submit feedback on projects.')

    if not ready_for_feedback(project_uri):
        raise Exception('No revision submitted since last feedback.')

    feedback = Feedback(
        project=project,
        expert_uri=expert_uri,
        good=good,
        bad=bad,
        ugly=ugly,
        date_created=datetime.utcnow()
    )
    
    last_revision = None
    if project.revision_set.count() > 0:
        last_revision = project.revision_set.latest('date_created')

    if last_revision:
        feedback.revision = last_revision

    feedback.save()

    send_feedback_notification(get_project(project_uri))
예제 #4
0
파일: views.py 프로젝트: mkcode/badges
def view( request, project_id ):

    project = project_api.get_project(project_api.id2uri(project_id))
    project = fetch_resources(project)
    badge = badge_api.get_badge(project['badge_uri'])
    badge = fetch_badge_resources(badge)
    feedback = project_api.get_project_feedback(project['uri'])
    can_revise = False
    can_give_feedback = False
    if request.session.get('user'):
        user_uri = request.session['user']['uri']
        if user_uri == project['author_uri']:
            can_revise = project_api.can_revise_project(project['uri'])
        can_give_feedback = project_api.ready_for_feedback(project['uri'])
        can_give_feedback &= user_uri in badge_api.get_badge_experts(badge['uri'])

    context = {
        'project': project,
        'badge': badge,
        'feedback': feedback,
        'can_revise': can_revise,
        'can_give_feedback': can_give_feedback
    }
    return render_to_response(
        'project/view.html',
        context,
        context_instance=RequestContext(request)
    )
예제 #5
0
파일: views.py 프로젝트: mkcode/badges
def view( request, badge_id ):
    badge = badge_api.get_badge(badge_api.id2uri(badge_id))
    fetch_badge_resources(badge)
    context = {
        'badge': badge
    }
    context['projects'] = map(fetch_resources, project_api.search_projects(badge_uri=badge['uri']))
    context['experts'] = badge_api.get_badge_experts(badge['uri'])

    return render_to_response(
        'badge/view.html',
        context,
        context_instance=RequestContext(request)
    )
예제 #6
0
def submit_feedback(project_uri, expert_uri, good, bad, ugly, award_badge=False):
    """
    Checks if badge can be awarded and creates feedback
    """

    project = Project.objects.get(id=uri2id(project_uri))
    badge = get_badge(project.badge_uri)
    result = submit_feedback_result.NOT_AWARDED

    if not expert_uri in get_badge_experts(project.badge_uri):
        raise Exception('Only experts can submit feedback on projects.')

    if not ready_for_feedback(project_uri):
        raise Exception('Badge has already been awarded to project.')

    feedback = Feedback(
        project=project,
        expert_uri=expert_uri,
        good=good,
        bad=bad,
        ugly=ugly,
        date_created=datetime.utcnow(),
        badge_awarded=False
    )

    if award_badge and can_badge_be_awarded(badge, expert_uri):
        result = submit_feedback_result.AWARDED
        feedback.badge_awarded = True
    elif award_badge: #and badge requires approval by partner
        result = submit_feedback_result.REQUIRES_APPROVAL
        send_badge_needs_partner_feedback_notification(badge, _project2dict(project))

    last_revision = None
    if project.revision_set.count() > 0:
        last_revision = project.revision_set.latest('date_created')

    if last_revision:
        feedback.revision = last_revision

    feedback.save()

    send_feedback_notification(get_project(project_uri))
    #return _feedback2dict(feedback)
    return result
예제 #7
0
파일: views.py 프로젝트: mozzadrella/badges
def view( request, badge_id ):
    badge = badge_api.get_badge(badge_api.id2uri(badge_id))
    fetch_badge_resources(badge)
    context = {
        'badge': badge
    }
    context['projects'] = map(fetch_resources, project_api.search_projects(badge_uri=badge['uri']))

    expert_uris = badge_api.get_badge_experts(badge['uri'])

    if request.session.get('user'):
        context['user_is_expert'] = request.session['user']['uri'] in expert_uris

    context['experts'] = map(p2pu_user_api.get_user, expert_uris)

    return render_to_response(
        'badge/view.html',
        context,
        context_instance=RequestContext(request)
    )
예제 #8
0
파일: views.py 프로젝트: ercchy/badges
def view(request, badge_id):
    badge = badge_api.get_badge(badge_api.id2uri(badge_id))
    fetch_badge_resources(badge)

    projects = project_api.search_projects_awarded_badges(badge_uri=badge['uri'])
    for project in projects:
        fetch_resources(project, feedback_list=project_api.get_project_feedback(project['uri']))

    expert_uris = badge_api.get_badge_experts(badge['uri'])
    user = request.session.get('user')

    if user:
        user['is_expert'] = user['uri'] in expert_uris
        user['is_author'] = _user_is_author(badge, user)
        if user['is_author']:
            user['can_delete_badge'] = badge_api.is_allowed_to_remove(badge['uri'])
        if user['is_expert']:
            user['added_to_backpack'] = badge_api.pushed_to_backpack(badge, user['uri'])

    projects_ready_for_feedback = project_api.get_projects_ready_for_feedback(badge['uri'])
    for project in projects_ready_for_feedback:
        feedback_list = project_api.get_project_feedback(project['uri'])
        fetch_resources(project, feedback_list=feedback_list)

    experts = map(p2pu_user_api.get_user, expert_uris)

    iframe = '//%s%s?rendering=normal' % (settings.ORGANISATION_URL,
                                               reverse('badge_view_embedded', args=[badge_id]))

    return render_to_response(
        'badge/badge_info/view.html', {
            'user': user,
            'badge': badge,
            'projects': projects,
            'projects_ready_for_feedback': projects_ready_for_feedback,
            'experts': experts,
            'iframe': iframe,
            'organisation_url': settings.ORGANISATION_URL,
        },
        context_instance=RequestContext(request)
    )
예제 #9
0
파일: views.py 프로젝트: NoriVicJr/badges
def view(request, badge_id):
    badge = badge_api.get_badge(badge_api.id2uri(badge_id))
    fetch_badge_resources(badge)
    context = {'badge': badge}
    context['projects'] = map(fetch_resources, project_api.search_projects_awarded_badges(badge_uri=badge['uri']))

    expert_uris = badge_api.get_badge_experts(badge['uri'])

    if request.session.get('user'):
        context['user_is_expert'] = request.session['user']['uri'] in expert_uris

    context['experts'] = map(p2pu_user_api.get_user, expert_uris)

    context['iframe'] = 'http://%s%s?rendering=normal' % (settings.ORGANISATION_URL,
                                                          reverse('badge_view_embedded', args=[badge_id]))

    return render_to_response(
        'badge/view.html',
        context,
        context_instance=RequestContext(request)
    )
예제 #10
0
    def test_badge_awarded_from_nonpartner_expert(self):
        #create a partner
        partner = p2pu_user_api.create_partner('Test parnter')

        # create partner badge
        new_badge_values = self.badge_values.copy()
        new_badge_values['partner_name'] = partner['name']

        # create a parnter badge
        badge = badge_api.create_badge(**new_badge_values)
        badge_api.publish_badge(badge['uri'])

        # submit a project for a badge
        project_values = self.project_values.copy()
        project_values['badge_uri'] = badge['uri']
        project = project_api.create_project(**project_values)

        # award badge as a partner
        feedback = project_api.submit_feedback(
            project['uri'],
            badge['author_uri'],
            'Good',
            'Bad',
            'Ugly',
            award_badge=True
            )
        self.assertEquals(feedback, project_api.submit_feedback_result.AWARDED)
        # award badge
        # HACK - needs well revision on how to refactor in order to test cycle properly
        if project_api.submit_feedback_result.AWARDED:
            with patch('badge.models.send_badge_awarded_notification') as mock_notification:
                badge_api.award_badge(badge['uri'], project_values['author_uri'], badge['author_uri'], 'http://project.org/url')

        self.assertIn(project_values['author_uri'], badge_api.get_badge_experts(badge['uri']))
        # submit another project for a badge
        another_project_values = {
            'badge_uri': badge['uri'],
            'author_uri': '/uri/user/anotheruser',
            'title': 'Test Second Title',
            'image_uri': '/uri/image/2',
            'work_url': 'http://project.org/url',
            'description': 'Did the test second time',
            'reflection': 'Will not do it earlier and more next time',
            'tags': ['test', 'tdd', 'bdd'],
        }
        project = project_api.create_project(**another_project_values)

        # award badge as a non partner
        feedback = project_api.submit_feedback(
            project['uri'],
            '/uri/user/testuser',
            'Good',
            'Bad',
            'Ugly',
            award_badge=True
            )
        self.assertEquals(feedback, project_api.submit_feedback_result.REQUIRES_APPROVAL)

        # award badge as partner
        feedback = project_api.submit_feedback(
            project['uri'],
            badge['author_uri'],
            'Good',
            'Bad',
            'Ugly',
            award_badge=True
        )
        self.assertEquals(feedback, project_api.submit_feedback_result.AWARDED)

        # test that feedback can not be given anymore
        with self.assertRaises(Exception):
            project_api.submit_feedback(
                project['uri'],
                badge['author_uri'],
                'Good',
                'Bad',
                'Ugly',
                award_badge=True
            )

        # test that revision can not be given any longer either
        with self.assertRaises(Exception):
            project_api.revise_project(project['uri'], 'Some improvement')