Example #1
0
    def login(self, request, extra_context=None):
        """
        Displays the login form for the given HttpRequest.
        """
        if request.method == 'GET' and self.has_permission(request):
            # Already logged-in, redirect to admin index
            index_path = reverse('admin:index', current_app=self.name)
            return HttpResponseRedirect(index_path)

        from django.contrib.auth.views import login
        # Since this module gets imported in the application's root package,
        # it cannot import models from other applications at the module level,
        # and django.contrib.admin.forms eventually imports User.
        from django.contrib.admin.forms import AdminAuthenticationForm
        context = dict(
            self.each_context(request),
            title=_('Log in'),
            app_path=request.get_full_path(),
        )
        if (REDIRECT_FIELD_NAME not in request.GET and
                REDIRECT_FIELD_NAME not in request.POST):
            context[REDIRECT_FIELD_NAME] = reverse('admin:index', current_app=self.name)
        context.update(extra_context or {})

        defaults = {
            'extra_context': context,
            'authentication_form': self.login_form or AdminAuthenticationForm,
            'template_name': self.login_template or 'admin/login.html',
        }
        request.current_app = self.name
        return login(request, **defaults)
Example #2
0
File: views.py Project: xasetl/1327
def permissions(request, title):
	document = get_object_or_404(Document, url_title=title)
	content_type = ContentType.objects.get_for_model(document)
	check_permissions(document, request.user, [document.edit_permission_name])
	if not document.show_permissions_editor():
		raise PermissionDenied()
	PermissionForm = get_permission_form(document)
	PermissionFormset = formset_factory(get_permission_form(document), extra=0)

	initial_data = PermissionForm.prepare_initial_data(Group.objects.all(), content_type, document)
	formset = PermissionFormset(request.POST or None, initial=initial_data)
	if request.POST and formset.is_valid():
		for form in formset:
			form.save(document)
		messages.success(request, _("Permissions have been changed successfully."))

		if request.user.has_perm(document.edit_permission_name, document):
			return HttpResponseRedirect(reverse(document.get_permissions_url_name(), args=[document.url_title]))
		if request.user.has_perm(document.view_permission_name, document):
			return HttpResponseRedirect(reverse(document.get_view_url_name(), args=[document.url_title]))
		return HttpResponseRedirect(reverse('index'))

	return render(request, 'documents_permissions.html', {
		'document': document,
		'formset_header': PermissionForm.header(content_type),
		'formset': formset,
		'active_page': 'permissions',
		'permission_overview': document_permission_overview(request.user, document),
	})
Example #3
0
def autodoc(url_root, username, id_string):
    urla = url_root + reverse('sms_submission_api',
                              kwargs={'username': username,
                                      'service': 'twilio'})
    urlb = url_root + reverse('sms_submission_form_api',
                              kwargs={'username': username,
                                      'id_string': id_string,
                                      'service': 'twilio'})
    doc = (u'<p>' +
           _(u"%(service)s Instructions:")
           % {'service': u'<a href="https://twilio.com">'
                         u'Twilio\'s SMS Request</a>'} +
           u'</p><ol><li>' +
           _(u"Sign in to Twilio.com and go your Application.") +
           u'</li><li>' +
           _(u"Follow instructions to add one of the following URLs, "
             u"selecting the HTTP POST method:") +
           u'<br /><span class="sms_autodoc_example">%(urla)s' +
           u'<br />%(urlb)s</span><br />' +
           u'</li></ol><p>' +
           _(u"That's it. Now Send an SMS Formhub submission to your Twilio"
             u" phone number. It will create a submission on Formhub.") +
           u'</p>') % {'urla': urla, 'urlb': urlb}

    return doc
Example #4
0
    def test_user_change_password(self):
        user_change_url = reverse('auth_test_admin:auth_user_change', args=(self.admin.pk,))
        password_change_url = reverse('auth_test_admin:auth_user_password_change', args=(self.admin.pk,))

        response = self.client.get(user_change_url)
        # Test the link inside password field help_text.
        rel_link = re.search(
            r'you can change the password using <a href="([^"]*)">this form</a>',
            force_text(response.content)
        ).groups()[0]
        self.assertEqual(
            os.path.normpath(user_change_url + rel_link),
            os.path.normpath(password_change_url)
        )

        response = self.client.post(
            password_change_url,
            {
                'password1': 'password1',
                'password2': 'password1',
            }
        )
        self.assertRedirects(response, user_change_url)
        row = LogEntry.objects.latest('id')
        self.assertEqual(row.get_change_message(), 'Changed password.')
        self.logout()
        self.login(password='******')
    def test_my_albums(self):
        url = reverse('albums:mine')
        self._test_login_required(url)

        AlbumFactory.create(user=self.user, trash=True)
        album1 = AlbumFactory.create(user=self.user, public=True)
        album2 = AlbumFactory.create(user=self.user, public=False)
        albumgroup1 = AlbumGroupFactory.create(users=[self.user])
        albumgroup2 = AlbumGroupFactory.create(album__user=self.user)

        my_albums_list = self.app.get(url, user=self.user)
        self.assertEqual(my_albums_list.status_code, 200)

        tabs = my_albums_list.context['tabcontent']

        self.assertQuerysetEqual(tabs['public'], [repr(album1), repr(albumgroup2.album)])
        self.assertQuerysetEqual(tabs['private'], [repr(album2)])
        self.assertQuerysetEqual(tabs['shared-with-me'], [repr(albumgroup1.album)])
        self.assertQuerysetEqual(tabs['shared-by-me'], [repr(albumgroup2.album)])

        # assert that the edit urls are visible
        for album in [album1, album2, albumgroup2.album]:
            edit_url = reverse('albums:update', kwargs={'pk': album.pk})
            self.assertContains(my_albums_list, edit_url)

        # other owner, edit url may not be visible
        edit_url = reverse('albums:update', kwargs={'pk': albumgroup1.album.pk})
        self.assertNotContains(my_albums_list, edit_url)
Example #6
0
    def test_topic_move_complete(self):
        topic = Topic(name='xtopic', forum=self.forum, user=self.user)
        topic.save()
        post = Post(topic=topic, user=self.user, body='one')
        post.save()

        topic_merge_url = reverse('pybb:topic_move')

        self.login_as(self.staff)

        name = 'new name for a topic'

        response = self.client.post(topic_merge_url, data={
            'topic_ids': [topic.pk],
            'form-TOTAL_FORMS': 1,
            'form-INITIAL_FORMS': 0,
            'form-0-name': name,
            'form-0-forum': self.forum.pk,
            'form-0-redirection_type': TopicRedirection.TYPE_PERMANENT_REDIRECT,
            'submit': 1
        })

        self.assertRedirects(response, reverse('pybb:index'))

        topic = Topic.objects.get(pk=topic.pk)

        self.assertTrue(topic.redirect)
        self.failUnless(topic.redirection is not None)

        redirection = topic.redirection

        new_topic = redirection.to_topic

        self.assertEqual(new_topic.name, name)
        self.assertEqual(new_topic.post_count, 1)
Example #7
0
    def test_topics_delete_complete(self):
        topic2 = Topic.objects.create(name='Topic 2', forum=self.forum, user=self.superuser)

        post2 = Post(topic=topic2, user=self.superuser, body='post on topic2')
        post2.save()

        topics_delete_url = reverse('pybb:topics_delete')

        self.login_as(self.staff)

        response = self.client.post(topics_delete_url, data={
            'topic_ids': [self.topic.pk, topic2.pk],
            'form-TOTAL_FORMS': 2,
            'form-INITIAL_FORMS': 0,
            'form-0-topic': self.topic.pk,
            'form-0-confirm': True,
            'form-1-topic': topic2.pk,
            'form-1-confirm': True,
            'submit': 1
        })

        topic2 = Topic.objects.get(pk=topic2.pk)

        self.assertTrue(self.topic.delete)
        self.assertTrue(topic2.delete)

        self.assertRedirects(response, reverse('pybb:index'))
Example #8
0
    def test_claim(self):
        url = reverse("channels.types.facebook.claim")

        self.login(self.admin)

        # check that claim page URL appears on claim list page
        response = self.client.get(reverse("channels.channel_claim"))
        self.assertContains(response, url)

        # can fetch the claim page
        response = self.client.get(url)
        self.assertContains(response, "Connect Facebook")

        token = "x" * 200

        post_data = response.context["form"].initial
        post_data["page_access_token"] = token
        post_data["page_id"] = "123456"
        post_data["page_name"] = "Temba"

        response = self.client.post(url, post_data, follow=True)

        # assert our channel got created
        channel = Channel.objects.get(address="123456")
        self.assertEqual(channel.config[Channel.CONFIG_AUTH_TOKEN], token)
        self.assertEqual(channel.config[Channel.CONFIG_PAGE_NAME], "Temba")
        self.assertEqual(channel.address, "123456")

        # should be on our configuration page displaying our secret
        self.assertContains(response, channel.config[Channel.CONFIG_SECRET])
Example #9
0
    def test_switch_superuser001_editor001(self):
        """
        Test switching from superuser001 to Editor001

        That should work.
        """
        original_user = User.objects.get(username="******")
        target_user = User.objects.get(username="******")

        self.client.login(username="******", password="******")
        response = self.client.get("%s?redirect=%s" % (reverse("grp_switch_user", args=[target_user.id]), reverse("admin:grappelli_category_changelist")), follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(self.client.session.get("original_user", None), {"id": original_user.id, "username": original_user.username})
        self.assertEqual(int(self.client.session['_auth_user_id']), target_user.pk)

        # templatetag (Superuser001, Editor001, Editor002)
        # now we have an additional list element with the original user, Superuser001
        t = switch_user_dropdown(response.context)
        t_cmp = '<li><a href="/grappelli/switch/user/1/?redirect=/admin/grappelli/category/" class="grp-switch-user-is-original">Superuser001</a></li><li><a href="/grappelli/switch/user/3/?redirect=/admin/grappelli/category/" class="grp-switch-user-is-target">Editor001</a></li><li><a href="/grappelli/switch/user/4/?redirect=/admin/grappelli/category/" class="grp-switch-user-is-target">Editor002</a></li>'
        self.assertEqual(t, t_cmp)

        # switch back to superuser
        response = self.client.get("%s?redirect=%s" % (reverse("grp_switch_user", args=[original_user.id]), reverse("admin:grappelli_category_changelist")), follow=True)
        self.assertEqual(response.status_code, 200)
        self.assertEqual(self.client.session.get("original_user", None), None)
        self.assertEqual(int(self.client.session['_auth_user_id']), original_user.pk)
Example #10
0
    def test_login_and_registration_form_signin_not_preserves_params(self, theme, url_name):
        params = [
            ('course_id', 'edX/DemoX/Demo_Course'),
            ('enrollment_action', 'enroll'),
        ]

        # The response should not have a "Sign In" button with the URL
        # that preserves the querystring params
        with with_comprehensive_theme_context(theme):
            response = self.client.get(reverse(url_name), params, HTTP_ACCEPT="text/html")

        expected_url = '/login?{}'.format(self._finish_auth_url_param(params + [('next', '/dashboard')]))
        self.assertNotContains(response, expected_url)

        # Add additional parameters:
        params = [
            ('course_id', 'edX/DemoX/Demo_Course'),
            ('enrollment_action', 'enroll'),
            ('course_mode', CourseMode.DEFAULT_MODE_SLUG),
            ('email_opt_in', 'true'),
            ('next', '/custom/final/destination')
        ]

        # Verify that this parameter is also preserved
        with with_comprehensive_theme_context(theme):
            response = self.client.get(reverse(url_name), params, HTTP_ACCEPT="text/html")

        expected_url = '/login?{}'.format(self._finish_auth_url_param(params))
        self.assertNotContains(response, expected_url)
Example #11
0
    def test_create_rule_post(self, exc):
        snapshot = test_data.snapshot
        self.mock_object(
            api_manila, "share_snapshot_get", mock.Mock(return_value=snapshot))
        url = reverse(
            'horizon:project:share_snapshots:share_snapshot_rule_add',
            args=[snapshot.id])
        self.mock_object(
            api_manila, "share_snapshot_allow",
            mock.Mock(side_effect=exc))
        formData = {
            'access_type': 'user',
            'method': u'CreateForm',
            'access_to': 'someuser',
        }

        res = self.client.post(url, formData)

        self.assertEqual(res.status_code, 302)
        api_manila.share_snapshot_allow.assert_called_once_with(
            mock.ANY, snapshot.id, access_type=formData['access_type'],
            access_to=formData['access_to'])
        self.assertRedirectsNoFollow(
            res,
            reverse(
                'horizon:project:share_snapshots:share_snapshot_manage_rules',
                args=[snapshot.id])
        )
Example #12
0
    def test_index_permission_protected_project(self):
        project = Project.objects.create(
            active=True,
            custom_permissions=True,
            login_required=True,
            name='MY_TEMPLATE_NAME',
        )
        batch = Batch.objects.create(project=project, name='MY_BATCH_NAME')
        Task.objects.create(batch=batch)

        in_user = User.objects.create_user('in_user', password='******')
        User.objects.create_user('out_user', password='******')
        group = Group.objects.create(name='testgroup')
        in_user.groups.add(group)
        assign_perm('can_work_on', group, project)

        in_client = django.test.Client()
        in_client.login(username='******', password='******')
        response = in_client.get(reverse('index'))
        self.assertEqual(response.status_code, 200)
        self.assertFalse(b'No Tasks available' in response.content)
        self.assertTrue(b'MY_TEMPLATE_NAME' in response.content)
        self.assertTrue(b'MY_BATCH_NAME' in response.content)

        out_client = django.test.Client()
        out_client.login(username='******', password='******')
        response = out_client.get(reverse('index'))
        self.assertEqual(response.status_code, 200)
        self.assertTrue(b'No Tasks available' in response.content)
        self.assertFalse(b'MY_TEMPLATE_NAME' in response.content)
        self.assertFalse(b'MY_BATCH_NAME' in response.content)
Example #13
0
    def test_index_unprotected_template(self):
        project_unprotected = Project(
            active=True,
            login_required=False,
            name='MY_TEMPLATE_NAME',
        )
        project_unprotected.save()
        batch = Batch(project=project_unprotected, name='MY_BATCH_NAME')
        batch.save()
        Task(batch=batch).save()

        anon_client = django.test.Client()
        response = anon_client.get(reverse('index'))
        self.assertEqual(response.status_code, 200)
        self.assertFalse(b'No Tasks available' in response.content)
        self.assertTrue(b'MY_TEMPLATE_NAME' in response.content)
        self.assertTrue(b'MY_BATCH_NAME' in response.content)

        known_client = django.test.Client()
        User.objects.create_superuser('admin', '*****@*****.**', 'secret')
        known_client.login(username='******', password='******')
        response = known_client.get(reverse('index'))
        self.assertEqual(response.status_code, 200)
        self.assertFalse(b'No Tasks available' in response.content)
        self.assertTrue(b'MY_TEMPLATE_NAME' in response.content)
        self.assertTrue(b'MY_BATCH_NAME' in response.content)
    def test_resource_name_precendence(self, client, monkeypatch):
        # default
        response = client.get(reverse("comment-list"))
        data = response.json()['data'][0]
        assert (data.get('type') == 'comments'), (
            'resource_name from model incorrect on list')

        # model > default
        models.Comment.__bases__ += (_PatchedModel,)
        response = client.get(reverse("comment-list"))
        data = response.json()['data'][0]
        assert (data.get('type') == 'resource_name_from_JSONAPIMeta'), (
            'resource_name from model incorrect on list')

        # serializer > model
        monkeypatch.setattr(
            serializers.CommentSerializer.Meta,
            'resource_name',
            'resource_name_from_serializer',
            False
        )
        response = client.get(reverse("comment-list"))
        data = response.json()['data'][0]
        assert (data.get('type') == 'resource_name_from_serializer'), (
            'resource_name from serializer incorrect on list')

        # view > serializer > model
        monkeypatch.setattr(views.CommentViewSet, 'resource_name', 'resource_name_from_view', False)
        response = client.get(reverse("comment-list"))
        data = response.json()['data'][0]
        assert (data.get('type') == 'resource_name_from_view'), (
            'resource_name from view incorrect on list')
Example #15
0
    def test_accordion_state(self):
        """
        Verify the accordion remembers which chapter you were last viewing.
        """
        email, password = self.STUDENT_INFO[0]
        self.login(email, password)
        self.enroll(self.course, True)
        self.enroll(self.test_course, True)

        # Now we directly navigate to a section in a chapter other than 'Overview'.
        section_url = reverse(
            'courseware_section',
            kwargs={
                'course_id': text_type(self.course.id),
                'chapter': 'factory_chapter',
                'section': 'factory_section',
            }
        )
        self.assert_request_status_code(200, section_url)

        # And now hitting the courseware tab should redirect to 'factory_chapter'
        url = reverse(
            'courseware',
            kwargs={'course_id': text_type(self.course.id)}
        )
        resp = self.client.get(url)
        self.assertRedirects(resp, section_url)
Example #16
0
 def _test_return_login(self, user_is_activated=True, previous_session_timed_out=False):
     """ Test logging in to an account that is already linked. """
     # Make sure we're not logged in:
     dashboard_response = self.client.get(reverse('dashboard'))
     self.assertEqual(dashboard_response.status_code, 302)
     # The user goes to the login page, and sees a button to login with this provider:
     provider_login_url = self._check_login_page()
     # The user clicks on the provider's login button:
     try_login_response = self.client.get(provider_login_url)
     # The user should be redirected to the provider:
     self.assertEqual(try_login_response.status_code, 302)
     login_response = self.do_provider_login(try_login_response['Location'])
     # If the previous session was manually logged out, there will be one weird redirect
     # required to set the login cookie (it sticks around if the main session times out):
     if not previous_session_timed_out:
         self.assertEqual(login_response.status_code, 302)
         self.assertEqual(login_response['Location'], self.complete_url + "?")
         # And then we should be redirected to the dashboard:
         login_response = self.client.get(login_response['Location'])
         self.assertEqual(login_response.status_code, 302)
     if user_is_activated:
         url_expected = reverse('dashboard')
     else:
         url_expected = reverse('third_party_inactive_redirect') + '?next=' + reverse('dashboard')
     self.assertEqual(login_response['Location'], url_expected)
     # Now we are logged in:
     dashboard_response = self.client.get(reverse('dashboard'))
     self.assertEqual(dashboard_response.status_code, 200)
Example #17
0
 def test_station_redirect_to_latest(self):
     kwargs = {'station_number': self.station.number}
     response = self.client.get(reverse('status:station:summary', kwargs=kwargs))
     self.assertEqual(302, response.status_code)
     kwargs = {'station_number': self.station.number}
     kwargs.update(date_as_kwargs(self.summary.date))
     self.assertEqual(reverse('status:station:summary', kwargs=kwargs), response['Location'])
Example #18
0
    def test_hosting(self):
        """Test for hosting form with enabled hosting."""
        self.get_user()
        self.client.login(username='******', password='******')
        response = self.client.get(reverse('hosting'))
        self.assertContains(response, 'id="id_message"')

        # Sending message
        response = self.client.post(
            reverse('hosting'),
            {
                'name': 'Test',
                'email': '*****@*****.**',
                'project': 'HOST',
                'url': 'http://example.net',
                'repo': 'https://github.com/WeblateOrg/weblate.git',
                'mask': 'po/*.po',
                'message': 'Hi\n\nI want to use it!',
            }
        )
        self.assertRedirects(response, reverse('home'))

        # Verify message
        self.assertEqual(len(mail.outbox), 1)
        self.assertEqual(
            mail.outbox[0].subject,
            '[Weblate] Hosting request for HOST'
        )
        self.assertIn(
            'testuser',
            mail.outbox[0].body,
        )
        self.assertEqual(mail.outbox[0].to, ['*****@*****.**'])
Example #19
0
    def _test_login(self):
        """
        The user goes to the login page, and sees a button to login with the provider.
        """
        self.user = UserFactory.create()
        provider_login_url = self._check_login_page()
        # The user clicks on the provider's button:
        try_login_response = self.client.get(provider_login_url)
        # The user should be redirected to the provider's login page:
        self.assertEqual(try_login_response.status_code, 302)
        complete_response = self.do_provider_login(try_login_response['Location'])
        # We should be redirected to the login screen since this account is not linked to an edX account:
        self.assertEqual(complete_response.status_code, 302)
        self.assertEqual(complete_response['Location'], self.login_page_url)
        login_response = self.client.get(self.login_page_url)
        tpa_context = login_response.context["data"]["third_party_auth"]
        self.assertEqual(tpa_context["errorMessage"], None)
        # Check that the "You've successfully signed into [PROVIDER_NAME]" message is shown.
        self.assertEqual(tpa_context["currentProvider"], self.PROVIDER_NAME)
        # Now the user enters their username and password.
        # The AJAX on the page will log them in:
        ajax_login_response = self.client.post(
            reverse('user_api_login_session'),
            {'email': self.user.email, 'password': '******'}
        )
        self.assertEqual(ajax_login_response.status_code, 200)
        # Then the AJAX will finish the third party auth:
        continue_response = self.client.get(tpa_context["finishAuthUrl"])
        # And we should be redirected to the dashboard:
        self.assertEqual(continue_response.status_code, 302)
        self.assertEqual(continue_response['Location'], reverse('dashboard'))

        # Now check that we can login again:
        self.client.logout()
        self._test_return_login()
Example #20
0
 def test_denied_owner_delete(self):
     """Test that deleting last owner does not work."""
     self.project.add_user(self.user, '@Administration')
     self.client.post(
         reverse('set-groups', kwargs=self.kw_project),
         {
             'user': self.second_user.username,
             'group': self.admin_group.pk,
             'action': 'remove',
         }
     )
     self.assertTrue(
         User.objects.all_admins(self.project).filter(
             username=self.user.username
         ).exists()
     )
     self.client.post(
         reverse('set-groups', kwargs=self.kw_project),
         {
             'user': self.user.username,
             'group': self.admin_group.pk,
             'action': 'remove',
         }
     )
     self.assertTrue(
         User.objects.all_admins(self.project).filter(
             username=self.user.username
         ).exists()
     )
Example #21
0
 def test_contact_rate_window(self):
     """Test for contact form rate limiting."""
     message = 'Too many messages sent, please try again later!'
     response = self.client.post(reverse('contact'), CONTACT_DATA)
     self.assertNotContains(response, message)
     response = self.client.post(reverse('contact'), CONTACT_DATA)
     self.assertNotContains(response, message)
Example #22
0
def submit_bundle(request, doc_id):
  bundle = Bundle(document=Document2.objects.get(id=doc_id))
  ParametersFormSet = formset_factory(ParameterForm, extra=0)

  if request.method == 'POST':
    params_form = ParametersFormSet(request.POST)

    if params_form.is_valid():
      mapping = dict([(param['name'], param['value']) for param in params_form.cleaned_data])
      job_id = _submit_bundle(request, bundle, mapping)

      jsonify = request.POST.get('format') == 'json'
      if jsonify:
        return JsonResponse({'status': 0, 'job_id': job_id, 'type': 'bundle'}, safe=False)
      else:
        request.info(_('Bundle submitted.'))
        return redirect(reverse('oozie:list_oozie_bundle', kwargs={'job_id': job_id}))
    else:
      request.error(_('Invalid submission form: %s' % params_form.errors))
  else:
    parameters = bundle.find_all_parameters()
    initial_params = ParameterForm.get_initial_params(dict([(param['name'], param['value']) for param in parameters]))
    params_form = ParametersFormSet(initial=initial_params)

  popup = render('editor2/submit_job_popup.mako', request, {
                 'params_form': params_form,
                 'name': bundle.name,
                 'action': reverse('oozie:editor_submit_bundle',  kwargs={'doc_id': bundle.id}),
                 'return_json': request.GET.get('format') == 'json',
                 'show_dryrun': False
                }, force_template=True).content
  return JsonResponse(popup, safe=False)
Example #23
0
    def dispatch1(self, request, article, *args, **kwargs):
        """Deleted view needs to access this method without a decorator,
        therefore it is separate."""
        urlpath = kwargs.get('urlpath', None)
        # Where to go after deletion...
        self.next = ""
        self.cannot_delete_root = False
        if urlpath and urlpath.parent:
            self.next = reverse(
                'wiki:get',
                kwargs={
                    'path': urlpath.parent.path})
        elif urlpath:
            # We are a urlpath with no parent. This is the root
            self.cannot_delete_root = True
        else:
            # We have no urlpath. Get it if a urlpath exists
            for art_obj in article.articleforobject_set.filter(is_mptt=True):
                if art_obj.content_object.parent:
                    self.next = reverse(
                        'wiki:get', kwargs={
                            'article_id': art_obj.content_object.parent.article.id})
                else:
                    self.cannot_delete_root = True

        return super().dispatch(request, article, *args, **kwargs)
Example #24
0
    def test_edit_alert(self):
        """Can we edit the alert and see the message about it being edited?"""
        user = User.objects.get(username='******')
        alert = Alert(
            user=user,
            name=self.alert_params['name'],
            query=self.alert_params['query'],
            rate=self.alert_params['rate'],
        )
        alert.save()

        # Pan tries to edit their alert
        self.browser.get(
            '{url}{path}?{q}&edit_alert={pk}'.format(
                url=self.server_url,
                path=reverse('show_results'),
                q=alert.query,
                pk=alert.pk,
            ))

        # But winds up at the sign in form
        self.assertIn(reverse('sign-in'), self.browser.current_url)

        # So Pan signs in.
        self.browser.find_element_by_id('username').send_keys('pandora')
        self.browser.find_element_by_id('password').send_keys('password' + '\n')

        # And gets redirected to the SERP where they see a notice about their
        # alert being edited.
        self.assert_text_in_body("editing your alert")
Example #25
0
 def get_api(self, obj):
     return {
         "avatar": reverse("misago:api:user-avatar", kwargs={"pk": obj.pk}),
         "data_downloads": reverse(
             "misago:api:user-data-downloads", kwargs={"pk": obj.pk}
         ),
         "details": reverse("misago:api:user-details", kwargs={"pk": obj.pk}),
         "change_email": reverse(
             "misago:api:user-change-email", kwargs={"pk": obj.pk}
         ),
         "change_password": reverse(
             "misago:api:user-change-password", kwargs={"pk": obj.pk}
         ),
         "edit_details": reverse(
             "misago:api:user-edit-details", kwargs={"pk": obj.pk}
         ),
         "options": reverse("misago:api:user-forum-options", kwargs={"pk": obj.pk}),
         "request_data_download": reverse(
             "misago:api:user-request-data-download", kwargs={"pk": obj.pk}
         ),
         "username": reverse("misago:api:user-username", kwargs={"pk": obj.pk}),
         "delete": reverse(
             "misago:api:user-delete-own-account", kwargs={"pk": obj.pk}
         ),
     }
Example #26
0
File: user.py Project: jcops/diting
 def get(self, request, *args, **kwargs):
     #获取客户端传来的参数PK
     pk = kwargs.get('pk')
     if settings.AUTH_LDAP:
         try:
             ldap_tool = LDAPTool()
             status = ldap_tool.ldap_get_user(pk, isdict=True)
             if status:
                 msg = "用户:%s 获取成功" % pk
                 data = status
                 form = self.form_class(initial=data)
                 context = {'form': form, 'app': _('Users'), 'action': _('LDAP Update user')}
                 return render(request, self.template_name, context)
             else:
                 msg = "未获取用户:%s" % pk
                 messages.add_message(self.request, messages.WARNING, msg)
                 return redirect(reverse('users:ldap-user-list'))
         except Exception as e:
             msg = "用户:%s 获取失败,原因:%s" % (pk, str(e))
             messages.add_message(self.request, messages.ERROR, msg)
             return redirect(reverse('users:ldap-user-list'))
     else:
         msg = '请系统先支持ldap'
         messages.add_message(self.request, messages.WARNING, msg)
         return redirect(reverse('users:ldap-user-list'))
Example #27
0
    def page_context(self):
        from corehq.apps.reports.standard.sms import (
            ScheduleInstanceReport,
            MessageLogReport,
            MessagingEventsReport,
        )

        scheduled_events_url = reverse(ScheduleInstanceReport.dispatcher.name(), args=[],
            kwargs={'domain': self.domain, 'report_slug': ScheduleInstanceReport.slug})

        context = {
            'scheduled_events_url': scheduled_events_url,
            'message_log_url': reverse(
                MessageLogReport.dispatcher.name(), args=[],
                kwargs={'domain': self.domain, 'report_slug': MessageLogReport.slug}
            ),
            'messaging_history_url': reverse(
                MessagingEventsReport.dispatcher.name(), args=[],
                kwargs={'domain': self.domain, 'report_slug': MessagingEventsReport.slug}
            ),
        }

        context['messaging_history_errors_url'] = self.get_messaging_history_errors_url(
            context['messaging_history_url']
        )

        return context
Example #28
0
    def post(self, *args, **kwargs):
        """
        A ``POST`` to mark as unread discussions.

        POST can have the following keys:

            ``discussions_ids``
                List of discussion id's that should be marked as unread.
        """

        discussion_ids = self.request.POST.getlist("discussion_ids")

        if discussion_ids:
            recipients = Recipient.objects.filter(
                discussion__in=self.valid_ids(discussion_ids), user=self.request.user
            ).exclude(status=Recipient.STATUS.unread)
            for recipient in recipients:
                recipient.mark_as_unread()

        folder_id = self.kwargs.get("folder_id")

        if folder_id:
            return redirect(
                reverse("discussions_list", kwargs={"folder_id": folder_id})
            )

        return redirect(reverse("discussions_list"))
Example #29
0
File: user.py Project: jcops/diting
 def get_context_data(self, **kwargs):
     data = ''
     pk = kwargs.get('pk')
     if settings.AUTH_LDAP:
         try:
             ldap_tool = LDAPTool()
             status = ldap_tool.ldap_get_user(pk, isdict=True)
             if status:
                 msg = "用户:%s 获取成功" % pk
                 data = status
                 # messages.add_message(self.request, messages.SUCCESS, msg)
             else:
                 msg = "未获取用户:%s" % pk
                 messages.add_message(self.request, messages.WARNING, msg)
                 return redirect(reverse('users:ldap-user-list'))
         except Exception as e:
             msg = "用户:%s 获取失败,原因:%s" % (pk, str(e))
             messages.add_message(self.request, messages.ERROR, msg)
             return redirect(reverse('users:ldap-user-list'))
     else:
         msg = '请系统先支持ldap'
         messages.add_message(self.request, messages.WARNING, msg)
         return redirect(reverse('users:ldap-user-list'))
     context = super().get_context_data(**kwargs)
     context['user'] = data
     context.update({
         'app': _('Users'),
         'action': _('LDAP User Detail'),
     })
     return context
Example #30
0
 def test_add_owner(self):
     """Adding and removing owner from the ACL project.
     """
     self.add_user()
     self.client.post(
         reverse('set-groups', kwargs=self.kw_project),
         {
             'user': self.second_user.username,
             'group': self.admin_group.pk,
             'action': 'add',
         }
     )
     self.assertTrue(
         User.objects.all_admins(self.project).filter(
             username=self.second_user.username
         ).exists()
     )
     self.client.post(
         reverse('set-groups', kwargs=self.kw_project),
         {
             'user': self.second_user.username,
             'group': self.admin_group.pk,
             'action': 'remove',
         }
     )
     self.assertFalse(
         User.objects.all_admins(self.project).filter(
             username=self.second_user.username
         ).exists()
     )
     self.remove_user()
Example #31
0
def logout_view(request):
    logout(request)
    return HttpResponseRedirect(reverse("index"))
Example #32
0
def logout_user(request):
    logout(request)
    return redirect(reverse('binder:home'))
Example #33
0
def search(request, project=None, component=None, lang=None):
    """Perform site-wide search on units."""
    is_ratelimited = not check_rate_limit('search', request)
    search_form = SiteSearchForm(request.GET)
    context = {
        'search_form': search_form,
    }
    search_kwargs = {}
    if component:
        obj = get_component(request, project, component)
        context['component'] = obj
        context['project'] = obj.project
        context['back_url'] = obj.get_absolute_url()
        search_kwargs = {'component': obj}
    elif project:
        obj = get_project(request, project)
        context['project'] = obj
        context['back_url'] = obj.get_absolute_url()
        search_kwargs = {'project': obj}
    else:
        obj = None
        context['back_url'] = None
    if lang:
        s_language = get_object_or_404(Language, code=lang)
        context['language'] = s_language
        search_kwargs = {'language': s_language}
        if obj:
            if component:
                context['back_url'] = obj.translation_set.get(
                    language=s_language
                ).get_absolute_url()
            else:
                context['back_url'] = reverse(
                    'project-language',
                    kwargs={
                        'project': project,
                        'lang': lang,
                    }
                )
        else:
            context['back_url'] = s_language.get_absolute_url()

    if not is_ratelimited and request.GET and search_form.is_valid():
        # Filter results by ACL
        if component:
            units = Unit.objects.filter(translation__component=obj)
        elif project:
            units = Unit.objects.filter(translation__component__project=obj)
        else:
            allowed_projects = request.user.allowed_projects
            units = Unit.objects.filter(
                translation__component__project__in=allowed_projects
            )
        units = units.search(
            search_form.cleaned_data,
            **search_kwargs
        )
        if lang:
            units = units.filter(
                translation__language=context['language']
            )

        units = get_paginator(request, units.order())

        context['show_results'] = True
        context['page_obj'] = units
        context['title'] = _('Search for %s') % (
            search_form.cleaned_data['q']
        )
        context['query_string'] = search_form.urlencode()
        context['search_query'] = search_form.cleaned_data['q']
    elif is_ratelimited:
        messages.error(
            request, _('Too many search queries, please try again later.')
        )
    elif request.GET:
        messages.error(request, _('Invalid search query!'))
        show_form_errors(request, search_form)

    return render(
        request,
        'search.html',
        context
    )
Example #34
0
def delete_topic(request, topic_id):
	topic = get_object_or_404(Topic, id=topic_id)
	check_topic_user(request, topic)

	topic.delete()
	return HttpResponseRedirect(reverse('learning_logs:topics'))
Example #35
0
    def test_boundaries(self):
        self.login(self.admin)

        # clear our country on our org
        self.org.country = None
        self.org.save()

        # try stripping path on our country, will fail
        with self.assertRaises(Exception):
            AdminBoundary.strip_last_path("Rwanda")

        # normal strip
        self.assertEqual(AdminBoundary.strip_last_path("Rwanda > Kigali City"),
                         "Rwanda")

        # get the aliases for our user org
        response = self.client.get(reverse("locations.adminboundary_alias"))

        # should be a redirect to our org home
        self.assertRedirect(response, reverse("orgs.org_home"))

        # now set it to rwanda
        self.org.country = self.country
        self.org.save()

        # our country is set to rwanda, we should get it as the main object
        response = self.client.get(reverse("locations.adminboundary_alias"))
        self.assertEqual(self.country, response.context["object"])

        # ok, now get the geometry for rwanda
        response = self.client.get(
            reverse("locations.adminboundary_geometry",
                    args=[self.country.osm_id]))

        # should be json
        response_json = response.json()

        # should have features in it
        self.assertIn("features", response_json)

        # should have our two top level states
        self.assertEqual(2, len(response_json["features"]))

        # now get it for one of the sub areas
        response = self.client.get(
            reverse("locations.adminboundary_geometry",
                    args=[self.district1.osm_id]))
        response_json = response.json()

        # should have features in it
        self.assertIn("features", response_json)

        # should have our single district in it
        self.assertEqual(1, len(response_json["features"]))

        # now grab our aliases
        response = self.client.get(
            reverse("locations.adminboundary_boundaries",
                    args=[self.country.osm_id]))
        response_json = response.json()

        # should just be kigali, without any aliases
        self.assertEqual(2, len(response_json))
        self.assertEqual("Eastern Province", response_json[0]["name"])
        self.assertEqual("Kigali City", response_json[1]["name"])
        self.assertEqual("", response_json[1]["aliases"])

        # update our alias for kigali
        response = self.client.post(
            reverse("locations.adminboundary_boundaries",
                    args=[self.country.osm_id]),
            json.dumps([dict(osm_id=self.state1.osm_id, aliases="kigs\nkig")]),
            content_type="application/json",
        )

        self.assertEqual(200, response.status_code)

        # fetch our aliases again
        response = self.client.get(
            reverse("locations.adminboundary_boundaries",
                    args=[self.country.osm_id]))
        response_json = response.json()

        # now have kigs as an alias
        self.assertEqual("Kigali City", response_json[1]["name"])
        self.assertEqual("kig\nkigs", response_json[1]["aliases"])

        # test nested admin level aliases update
        geo_data = [
            dict(
                osm_id=self.state2.osm_id,
                aliases="Eastern P",
                children=[
                    dict(
                        osm_id=self.district1.osm_id,
                        aliases="Gatsibo",
                        children=[
                            dict(osm_id=self.ward1.osm_id,
                                 aliases="Kageyo Gat")
                        ],
                    )
                ],
            )
        ]
        response = self.client.post(
            reverse("locations.adminboundary_boundaries",
                    args=[self.country.osm_id]),
            json.dumps(geo_data),
            content_type="application/json",
        )

        self.assertEqual(200, response.status_code)

        # exact match
        boundary = self.org.find_boundary_by_name("kigali city",
                                                  AdminBoundary.LEVEL_STATE,
                                                  self.country)
        self.assertEqual(len(boundary), 1)
        self.assertEqual(boundary[0], self.state1)

        # try to find the location by alias
        boundary = self.org.find_boundary_by_name("kigs",
                                                  AdminBoundary.LEVEL_STATE,
                                                  self.country)
        self.assertEqual(len(boundary), 1)
        self.assertEqual(boundary[0], self.state1)

        # also try with no parent
        boundary = self.org.find_boundary_by_name("kigs",
                                                  AdminBoundary.LEVEL_STATE,
                                                  None)
        self.assertEqual(len(boundary), 1)
        self.assertEqual(boundary[0], self.state1)

        # test no match
        boundary = self.org.find_boundary_by_name("foobar",
                                                  AdminBoundary.LEVEL_STATE,
                                                  None)
        self.assertFalse(boundary)

        # fetch aliases again
        response = self.client.get(
            reverse("locations.adminboundary_boundaries",
                    args=[self.country.osm_id]))
        response_json = response.json()
        self.assertEqual(response_json[0].get("name"), self.state2.name)
        self.assertEqual(response_json[0].get("aliases"), "Eastern P")
        self.assertIn("Kageyo Gat", response_json[0].get("match"))

        # trigger wrong request data using bad json
        response = self.client.post(
            reverse("locations.adminboundary_boundaries",
                    args=[self.country.osm_id]),
            """{"data":"foo \r\n bar"}""",
            content_type="application/json",
        )

        response_json = response.json()
        self.assertEqual(400, response.status_code)
        self.assertEqual(response_json.get("status"), "error")

        # Get geometry of admin boundary without sub-levels, should return one feature
        response = self.client.get(
            reverse("locations.adminboundary_geometry",
                    args=[self.ward3.osm_id]))
        self.assertEqual(200, response.status_code)
        response_json = response.json()
        self.assertEqual(len(response_json.get("features")), 1)
Example #36
0
def student_dashboard(request):  # lint-amnesty, pylint: disable=too-many-statements
    """
    Provides the LMS dashboard view

    TODO: This is lms specific and does not belong in common code.
    Note:
        To load the all courses set course_limit=None as parameter in GET. If its not None then default course
        limit will be used  that is set in configuration
    Arguments:
        request: The request object.

    Returns:
        The dashboard response.

    """
    user = request.user
    if not UserProfile.objects.filter(user=user).exists():
        return redirect(reverse('account_settings'))

    platform_name = configuration_helpers.get_value("platform_name", settings.PLATFORM_NAME)

    enable_verified_certificates = configuration_helpers.get_value(
        'ENABLE_VERIFIED_CERTIFICATES',
        settings.FEATURES.get('ENABLE_VERIFIED_CERTIFICATES')
    )
    display_course_modes_on_dashboard = configuration_helpers.get_value(
        'DISPLAY_COURSE_MODES_ON_DASHBOARD',
        settings.FEATURES.get('DISPLAY_COURSE_MODES_ON_DASHBOARD', True)
    )
    activation_email_support_link = configuration_helpers.get_value(
        'ACTIVATION_EMAIL_SUPPORT_LINK', settings.ACTIVATION_EMAIL_SUPPORT_LINK
    ) or settings.SUPPORT_SITE_LINK
    hide_dashboard_courses_until_activated = configuration_helpers.get_value(
        'HIDE_DASHBOARD_COURSES_UNTIL_ACTIVATED',
        settings.FEATURES.get('HIDE_DASHBOARD_COURSES_UNTIL_ACTIVATED', False)
    )
    empty_dashboard_message = configuration_helpers.get_value(
        'EMPTY_DASHBOARD_MESSAGE', None
    )

    disable_course_limit = request and 'course_limit' in request.GET
    course_limit = get_dashboard_course_limit() if not disable_course_limit else None

    # Get the org whitelist or the org blacklist for the current site
    site_org_whitelist, site_org_blacklist = get_org_black_and_whitelist_for_site()
    course_enrollments = list(get_course_enrollments(user, site_org_whitelist, site_org_blacklist, course_limit))

    # Get the entitlements for the user and a mapping to all available sessions for that entitlement
    # If an entitlement has no available sessions, pass through a mock course overview object
    (course_entitlements,
     course_entitlement_available_sessions,
     unfulfilled_entitlement_pseudo_sessions) = get_filtered_course_entitlements(
        user,
        site_org_whitelist,
        site_org_blacklist
    )

    # Record how many courses there are so that we can get a better
    # understanding of usage patterns on prod.
    monitoring_utils.accumulate('num_courses', len(course_enrollments))

    # Sort the enrollment pairs by the enrollment date
    course_enrollments.sort(key=lambda x: x.created, reverse=True)

    # Retrieve the course modes for each course
    enrolled_course_ids = [enrollment.course_id for enrollment in course_enrollments]
    __, unexpired_course_modes = CourseMode.all_and_unexpired_modes_for_courses(enrolled_course_ids)
    course_modes_by_course = {
        course_id: {
            mode.slug: mode
            for mode in modes
        }
        for course_id, modes in unexpired_course_modes.items()
    }

    # Check to see if the student has recently enrolled in a course.
    # If so, display a notification message confirming the enrollment.
    enrollment_message = _create_recent_enrollment_message(
        course_enrollments, course_modes_by_course
    )
    course_optouts = Optout.objects.filter(user=user).values_list('course_id', flat=True)

    # Display activation message
    activate_account_message = ''
    if not user.is_active:
        activate_account_message = Text(_(
            "Check your {email_start}{email}{email_end} inbox for an account activation link from {platform_name}. "
            "If you need help, contact {link_start}{platform_name} Support{link_end}."
        )).format(
            platform_name=platform_name,
            email_start=HTML("<strong>"),
            email_end=HTML("</strong>"),
            email=user.email,
            link_start=HTML("<a target='_blank' href='{activation_email_support_link}'>").format(
                activation_email_support_link=activation_email_support_link,
            ),
            link_end=HTML("</a>"),
        )

    enterprise_message = get_dashboard_consent_notification(request, user, course_enrollments)

    recovery_email_message = recovery_email_activation_message = None
    if is_secondary_email_feature_enabled():
        try:
            pending_email = PendingSecondaryEmailChange.objects.get(user=user)  # lint-amnesty, pylint: disable=unused-variable
        except PendingSecondaryEmailChange.DoesNotExist:
            try:
                account_recovery_obj = AccountRecovery.objects.get(user=user)  # lint-amnesty, pylint: disable=unused-variable
            except AccountRecovery.DoesNotExist:
                recovery_email_message = Text(
                    _(
                        "Add a recovery email to retain access when single-sign on is not available. "
                        "Go to {link_start}your Account Settings{link_end}.")
                ).format(
                    link_start=HTML("<a href='{account_setting_page}'>").format(
                        account_setting_page=reverse('account_settings'),
                    ),
                    link_end=HTML("</a>")
                )
        else:
            recovery_email_activation_message = Text(
                _(
                    "Recovery email is not activated yet. "
                    "Kindly visit your email and follow the instructions to activate it."
                )
            )

    # Disable lookup of Enterprise consent_required_course due to ENT-727
    # Will re-enable after fixing WL-1315
    consent_required_courses = set()

    # Account activation message
    account_activation_messages = [
        message for message in messages.get_messages(request) if 'account-activation' in message.tags
    ]

    # Global staff can see what courses encountered an error on their dashboard
    staff_access = False
    errored_courses = {}
    if has_access(user, 'staff', 'global'):
        # Show any courses that encountered an error on load
        staff_access = True
        errored_courses = modulestore().get_errored_courses()

    show_courseware_links_for = {
        enrollment.course_id: has_access(request.user, 'load', enrollment.course_overview)
        for enrollment in course_enrollments
    }

    # Find programs associated with course runs being displayed. This information
    # is passed in the template context to allow rendering of program-related
    # information on the dashboard.
    meter = ProgramProgressMeter(request.site, user, enrollments=course_enrollments)
    ecommerce_service = EcommerceService()
    inverted_programs = meter.invert_programs()

    urls, programs_data = {}, {}
    bundles_on_dashboard_flag = LegacyWaffleFlag(experiments_namespace, 'bundles_on_dashboard', __name__)  # lint-amnesty, pylint: disable=toggle-missing-annotation

    # TODO: Delete this code and the relevant HTML code after testing LEARNER-3072 is complete
    if bundles_on_dashboard_flag.is_enabled() and inverted_programs and list(inverted_programs.items()):
        if len(course_enrollments) < 4:
            for program in inverted_programs.values():
                try:
                    program_uuid = program[0]['uuid']
                    program_data = get_programs(uuid=program_uuid)
                    program_data = ProgramDataExtender(program_data, request.user).extend()
                    skus = program_data.get('skus')
                    checkout_page_url = ecommerce_service.get_checkout_page_url(*skus)
                    program_data['completeProgramURL'] = checkout_page_url + '&bundle=' + program_data.get('uuid')
                    programs_data[program_uuid] = program_data
                except:  # pylint: disable=bare-except
                    pass

    # Construct a dictionary of course mode information
    # used to render the course list.  We re-use the course modes dict
    # we loaded earlier to avoid hitting the database.
    course_mode_info = {
        enrollment.course_id: complete_course_mode_info(
            enrollment.course_id, enrollment,
            modes=course_modes_by_course[enrollment.course_id]
        )
        for enrollment in course_enrollments
    }

    # Determine the per-course verification status
    # This is a dictionary in which the keys are course locators
    # and the values are one of:
    #
    # VERIFY_STATUS_NEED_TO_VERIFY
    # VERIFY_STATUS_SUBMITTED
    # VERIFY_STATUS_APPROVED
    # VERIFY_STATUS_MISSED_DEADLINE
    #
    # Each of which correspond to a particular message to display
    # next to the course on the dashboard.
    #
    # If a course is not included in this dictionary,
    # there is no verification messaging to display.
    verify_status_by_course = check_verify_status_by_course(user, course_enrollments)
    cert_statuses = {
        enrollment.course_id: cert_info(request.user, enrollment)
        for enrollment in course_enrollments
    }

    # only show email settings for Mongo course and when bulk email is turned on
    show_email_settings_for = frozenset(
        enrollment.course_id for enrollment in course_enrollments if (
            is_bulk_email_feature_enabled(enrollment.course_id)
        )
    )

    # Verification Attempts
    # Used to generate the "you must reverify for course x" banner
    verification_status = IDVerificationService.user_status(user)
    verification_errors = get_verification_error_reasons_for_display(verification_status['error'])

    # Gets data for midcourse reverifications, if any are necessary or have failed
    statuses = ["approved", "denied", "pending", "must_reverify"]
    reverifications = reverification_info(statuses)

    enrolled_courses_either_paid = frozenset(
        enrollment.course_id for enrollment in course_enrollments
        if enrollment.is_paid_course()
    )

    # Checks if a course enrollment redeemed using a voucher is refundable
    enrolled_courses_voucher_refundable = frozenset(
        enrollment.course_id for enrollment in course_enrollments
        if enrollment.is_order_voucher_refundable()
    )

    # If there are *any* denied reverifications that have not been toggled off,
    # we'll display the banner
    denied_banner = any(item.display for item in reverifications["denied"])

    # get list of courses having pre-requisites yet to be completed
    courses_having_prerequisites = frozenset(
        enrollment.course_id for enrollment in course_enrollments
        if enrollment.course_overview.pre_requisite_courses
    )
    courses_requirements_not_met = get_pre_requisite_courses_not_completed(user, courses_having_prerequisites)

    if 'notlive' in request.GET:
        redirect_message = _("The course you are looking for does not start until {date}.").format(
            date=request.GET['notlive']
        )
    elif 'course_closed' in request.GET:
        redirect_message = _("The course you are looking for is closed for enrollment as of {date}.").format(
            date=request.GET['course_closed']
        )
    elif 'access_response_error' in request.GET:
        # This can be populated in a generalized way with fields from access response errors
        redirect_message = request.GET['access_response_error']
    else:
        redirect_message = ''

    all_integrity_enabled = True
    if not course_enrollments:
        all_integrity_enabled = is_integrity_signature_enabled(None)
    for enrollment in course_enrollments:
        if not is_integrity_signature_enabled(enrollment.course_id):
            all_integrity_enabled = False
            break

    valid_verification_statuses = ['approved', 'must_reverify', 'pending', 'expired']
    display_sidebar_on_dashboard = not all_integrity_enabled and \
        verification_status['status'] in valid_verification_statuses and \
        verification_status['should_display']

    # Filter out any course enrollment course cards that are associated with fulfilled entitlements
    for entitlement in [e for e in course_entitlements if e.enrollment_course_run is not None]:
        course_enrollments = [
            enr for enr in course_enrollments if entitlement.enrollment_course_run.course_id != enr.course_id
        ]

    show_account_activation_popup = request.COOKIES.get(settings.SHOW_ACTIVATE_CTA_POPUP_COOKIE_NAME, None)

    context = {
        'urls': urls,
        'programs_data': programs_data,
        'enterprise_message': enterprise_message,
        'consent_required_courses': consent_required_courses,
        'enrollment_message': enrollment_message,
        'redirect_message': Text(redirect_message),
        'account_activation_messages': account_activation_messages,
        'activate_account_message': activate_account_message,
        'course_enrollments': course_enrollments,
        'course_entitlements': course_entitlements,
        'course_entitlement_available_sessions': course_entitlement_available_sessions,
        'unfulfilled_entitlement_pseudo_sessions': unfulfilled_entitlement_pseudo_sessions,
        'course_optouts': course_optouts,
        'staff_access': staff_access,
        'errored_courses': errored_courses,
        'show_courseware_links_for': show_courseware_links_for,
        'all_course_modes': course_mode_info,
        'cert_statuses': cert_statuses,
        'credit_statuses': _credit_statuses(user, course_enrollments),
        'show_email_settings_for': show_email_settings_for,
        'reverifications': reverifications,
        'verification_display': verification_status['should_display'],
        'verification_status': verification_status['status'],
        'verification_expiry': verification_status['verification_expiry'],
        'verification_status_by_course': verify_status_by_course,
        'verification_errors': verification_errors,
        'denied_banner': denied_banner,
        'billing_email': settings.PAYMENT_SUPPORT_EMAIL,
        'show_account_activation_popup': show_account_activation_popup,
        'user': user,
        'logout_url': reverse('logout'),
        'platform_name': platform_name,
        'enrolled_courses_either_paid': enrolled_courses_either_paid,
        'enrolled_courses_voucher_refundable': enrolled_courses_voucher_refundable,
        'provider_states': [],
        'courses_requirements_not_met': courses_requirements_not_met,
        'nav_hidden': True,
        'inverted_programs': inverted_programs,
        'show_program_listing': ProgramsApiConfig.is_enabled(),
        'show_dashboard_tabs': True,
        'disable_courseware_js': True,
        'display_course_modes_on_dashboard': enable_verified_certificates and display_course_modes_on_dashboard,
        'display_sidebar_on_dashboard': display_sidebar_on_dashboard,
        'display_sidebar_account_activation_message': not(user.is_active or hide_dashboard_courses_until_activated),
        'display_dashboard_courses': (user.is_active or not hide_dashboard_courses_until_activated),
        'empty_dashboard_message': empty_dashboard_message,
        'recovery_email_message': recovery_email_message,
        'recovery_email_activation_message': recovery_email_activation_message,
        'show_load_all_courses_link': show_load_all_courses_link(user, course_limit, course_enrollments),
        # TODO START: clean up as part of REVEM-199 (START)
        'course_info': get_dashboard_course_info(user, course_enrollments),
        # TODO START: clean up as part of REVEM-199 (END)
    }

    # Include enterprise learner portal metadata and messaging
    enterprise_learner_portal_context = get_enterprise_learner_portal_context(request)
    context.update(enterprise_learner_portal_context)

    context_from_plugins = get_plugins_view_context(
        ProjectType.LMS,
        COURSE_DASHBOARD_PLUGIN_VIEW_NAME,
        context
    )
    context.update(context_from_plugins)

    notice_url = check_for_unacknowledged_notices(context)
    if notice_url:
        return redirect(notice_url)

    course = None
    context.update(
        get_experiment_user_metadata_context(
            course,
            user,
        )
    )
    if ecommerce_service.is_enabled(request.user):
        context.update({
            'use_ecommerce_payment_flow': True,
            'ecommerce_payment_page': ecommerce_service.payment_page_url(),
        })

    # Gather urls for course card resume buttons.
    resume_button_urls = ['' for entitlement in course_entitlements]
    for url in get_resume_urls_for_enrollments(user, course_enrollments).values():
        resume_button_urls.append(url)
    # There must be enough urls for dashboard.html. Template creates course
    # cards for "enrollments + entitlements".
    context.update({
        'resume_button_urls': resume_button_urls
    })

    response = render_to_response('dashboard.html', context)
    if show_account_activation_popup:
        response.delete_cookie(
            settings.SHOW_ACTIVATE_CTA_POPUP_COOKIE_NAME,
            domain=settings.SESSION_COOKIE_DOMAIN,
            path='/',
        )

    return response
Example #37
0
 def _build_import_url(self, model):
     ct = ContentType.objects.get_for_model(model)
     return reverse('creme_core__mass_import', args=(ct.id,))
Example #38
0
def change_att(request, att_id):
    a = get_object_or_404(Attendance, id=att_id)
    a.status = not a.status
    a.save()
    return HttpResponseRedirect(reverse('t_attendance_detail', args=(a.student.USN, a.course_id)))
Example #39
0
 def copy_report(self):
     return '<a href="{0}"><img style="width: 26px; margin: -6px" src="{1}report_builder/img/copy.svg"/></a>'.format(
         reverse('report_builder_create_copy', args=[self.id]),
         getattr(settings, 'STATIC_URL', '/static/'),
     )
Example #40
0
def cancel_class(request, ass_c_id):
    assc = get_object_or_404(AttendanceClass, id=ass_c_id)
    assc.status = 2
    assc.save()
    return HttpResponseRedirect(reverse('t_class_date', args=(assc.assign_id,)))
 def test_past_question(self):
     past_question = create_question(question_text='Past Question', days=-5)
     url = reverse('polls:detail', args=(past_question.id, ))
     response = self.client.get(url)
     self.assertContains(response, past_question.question_text)
Example #42
0
    def test_list_view(self):
        """ranks list view returns 200"""
        response = self.client.get(reverse('misago:admin:users:ranks:index'))

        self.assertEqual(response.status_code, 200)
        self.assertContains(response, 'Team')
 def test_two_past_questions(self):
     create_question(question_text="Past question 1.", days=-30)
     create_question(question_text="Past question 2.", days=-5)
     response = self.client.get(reverse('polls:index'))
     self.assertQuerysetEqual(response.context['latest_question_list'],
                              ['<Question: Past question 2.>', '<Question: Past question 1.>'])
Example #44
0
def logout_view(request):
    logout(request)
    return HttpResponseRedirect(reverse('accounts:login'))
 def test_future_question(self):
     create_question(question_text="Future question.", days=30)
     response = self.client.get(reverse('polls:index'))
     self.assertContains(response, "No polls are available.")
     self.assertQuerysetEqual(response.context['latest_question_list'], [])
 def test_future_question(self):
     future_question = create_question(question_text='Future question.', days=5)
     url = reverse('polls:detail', args=(future_question.id, ))
     response = self.client.get(url)
     self.assertEqual(response.status_code, 404)
Example #47
0
def index(request):
    # if no user is signed in then return login page
    if not request.user.is_authenticated:
        return HttpResponseRedirect(reverse("login"))
    return render(request, "users/user.html")
 def test_future_question_and_past_question(self):
     create_question(question_text="Past question.", days=-30)
     create_question(question_text="Future question", days=30)
     response = self.client.get(reverse('polls:index'))
     self.assertQuerysetEqual(response.context['latest_question_list'], ['<Question: Past question.>'])
Example #49
0
 def setUp(self):
     self.url = reverse('plate-create')
 def test_no_questions(self):
     response = self.client.get(reverse('polls:index'))
     self.assertEqual(response.status_code, 200)
     self.assertContains(response, "No polls are available.")
     self.assertQuerysetEqual(response.context['latest_question_list'], [])
Example #51
0
 def setUp(self):
     self.url = reverse('plate-create')
     self.nora = self.create_user(username='******', is_staff=True)
     self.setup_logged_in_client()
Example #52
0
 def setUp(self):
     self.nora = self.create_user(username='******', is_staff=True)
     self.setup_logged_in_client()
     self.plate = Plate.objects.create(owner=self.nora, name="test")
     self.url = reverse('plate-update', kwargs={'pk': self.plate.id})
Example #53
0
 def get_absolute_url(self):
     return reverse("inventory_row", kwargs={"row_slug": self.slug})
Example #54
0
 def test_successful_deletion(self):
     self.assertEqual(Plate.objects.all().count(), 1)
     response = self.client.get(self.url, follow=True)
     self.assertRedirects(response, "%s" % (reverse('plate-list')))
     self.assertEqual(Plate.objects.all().count(), 0)
Example #55
0
 def get_absolute_url(self):
     return reverse("inventory_jar", kwargs={"jar_slug": self.slug})
Example #56
0
 def url(self):
     return reverse('creatures:creature', kwargs={'section_slug': self.section.slug, 'creature_slug': self.slug})
Example #57
0
 def get_absolute_url(self):
     return reverse("inventory_bin", kwargs={"bin_slug": self.slug})
Example #58
0
 def get_absolute_url(self):
     return reverse("inventory_warehouse",
                    kwargs={"warehouse_slug": self.slug})
Example #59
0
 def get_absolute_url(self):
     return reverse("inventory_shelf", kwargs={"shelf_slug": self.slug})
Example #60
0
 def get_absolute_url(self):
     return reverse("inventory_crate", kwargs={"crate_slug": self.slug})