Example #1
0
    def get_context_data(self, **kwargs):
        context = super(PaperSearchView, self).get_context_data(**kwargs)
        search_description = _('Papers')
        query_string = self.request.META.get('QUERY_STRING', '')
        context['breadcrumbs'] = [(search_description, '')]
        context['search_description'] = (search_description
                                         if query_string else _('All papers'))
        context['head_search_description'] = _('Papers')
        nb_results = self.queryset.count()
        context['nb_results'] = ungettext('%d paper found', '%d papers found',
                                          nb_results) % nb_results
        context['search_stats'] = BareAccessStatistics.from_search_queryset(
            self.queryset)
        context['on_statuses'] = json.dumps(context['form'].on_statuses())
        context['ajax_url'] = self.request.path

        # Notifications
        # TODO: unefficient query.
        notifications = get_notifications(self.request)
        selected_messages = map(
            lambda n: n.serialize_to_json(),
            sorted(notifications, key=lambda msg: msg.level)[:3])
        context['messages'] = selected_messages

        return context
Example #2
0
    def get_context_data(self, **kwargs):
        context = super(PaperSearchView, self).get_context_data(**kwargs)
        search_description = _('Papers')
        query_string = self.request.META.get('QUERY_STRING', '')
        context['breadcrumbs'] = [(search_description, '')]
        context['search_description'] = (
            search_description if query_string else _('All papers'))
        context['head_search_description'] = _('Papers')
        context['nb_results'] = self.queryset.count()
        context['search_stats'] = BareAccessStatistics.from_search_queryset(self.queryset)
        context['on_statuses'] = json.dumps(context['form'].on_statuses())
        context['ajax_url'] = self.request.path

        # Eventually remove sort by parameter
        search_params_without_sort_by = self.request.GET.copy()
        try:
            del search_params_without_sort_by['sort_by']
        except KeyError:
            pass
        # Make a clean URL with useless GET params
        for key in list(search_params_without_sort_by.keys()):
            if not search_params_without_sort_by[key]:
                del search_params_without_sort_by[key]
        context['search_params_without_sort_by'] = (
            search_params_without_sort_by.urlencode()
        )
        # Get current sort_by value
        current_sort_by_value = self.request.GET.get(
            'sort_by',
            None
        )
        try:
            current_sort_by = next(
                v
                for k, v in self.form_class.SORT_CHOICES
                if k == current_sort_by_value
            )
        except StopIteration:
            current_sort_by = self.form_class.SORT_CHOICES[0][1]
        context['current_sort_by'] = current_sort_by

        # Notifications
        # TODO: unefficient query.
        notifications = get_notifications(self.request)
        selected_messages = [n.serialize_to_json() for n in sorted(notifications, key=lambda msg: msg.level)[:3]]
        context['messages'] = selected_messages

        return context
Example #3
0
    def get_context_data(self, **kwargs):
        context = super(PaperSearchView, self).get_context_data(**kwargs)
        search_description = _('Papers')
        query_string = self.request.META.get('QUERY_STRING', '')
        context['breadcrumbs'] = [(search_description, '')]
        context['search_description'] = (search_description
                                         if query_string else _('All papers'))
        context['head_search_description'] = _('Papers')
        context['nb_results'] = self.queryset.count()
        context['search_stats'] = BareAccessStatistics.from_search_queryset(
            self.queryset)
        context['on_statuses'] = json.dumps(context['form'].on_statuses())
        context['ajax_url'] = reverse('ajax-search')

        # Eventually remove sort by parameter
        search_params_without_sort_by = self.request.GET.copy()
        try:
            del search_params_without_sort_by['sort_by']
        except KeyError:
            pass
        # Make a clean URL with useless GET params
        for key in list(search_params_without_sort_by.keys()):
            if not search_params_without_sort_by[key]:
                del search_params_without_sort_by[key]
        context['search_params_without_sort_by'] = (
            search_params_without_sort_by.urlencode())
        # Get current sort_by value
        current_sort_by_value = self.request.GET.get('sort_by', None)
        try:
            current_sort_by = next(v for k, v in self.form_class.SORT_CHOICES
                                   if k == current_sort_by_value)
        except StopIteration:
            current_sort_by = self.form_class.SORT_CHOICES[0][1]
        context['current_sort_by'] = current_sort_by

        # Notifications
        # TODO: unefficient query.
        notifications = get_notifications(self.request)
        selected_messages = [
            n.serialize_to_json()
            for n in sorted(notifications, key=lambda msg: msg.level)[:3]
        ]
        context['messages'] = selected_messages

        return context
Example #4
0
def searchView(request, **kwargs):
    """
    Any view that returns a list of papers can be expressed using this "search" view.
    It allows to select a list of papers based on a list of criteria (but no keyword search for now).
    """
    context = dict()
    # Build the queryset
    queryset = Paper.objects.all()
    args = request.GET.copy()
    args.update(kwargs)

    if 'journal' in args and not is_admin(request.user):
        del args['journal']

    search_description = _('Papers')
    head_search_description = _('Papers')

    context['researcher_id'] = None
    if 'researcher' in args or 'orcid' in args:
        researcher = None
        if 'researcher' in args:
            researcher = get_object_or_404(Researcher,
                                           pk=args.get('researcher'))
        elif 'orcid' in args:
            try:
                researcher = Researcher.objects.get(orcid=args.get('orcid'))
            except Researcher.DoesNotExist:
                try:
                    orcid = validate_orcid(args.get('orcid'))
                    researcher = Researcher.get_or_create_by_orcid(orcid)
                    researcher.init_from_orcid()
                except MetadataSourceException:
                    raise Http404(_('Invalid ORCID profile.'))

        # Redirect if slug doesn't match or researcher is looked up by ORCID.
        if kwargs.get('slug', '') != researcher.slug:
            view_args = {'researcher': researcher.id, 'slug': researcher.slug}
            url = reverse('researcher', kwargs=view_args)
            query_string = request.META.get('QUERY_STRING', '')
            if query_string:
                url += '?' + query_string
            return HttpResponsePermanentRedirect(url)

        queryset = queryset.filter(author__researcher=researcher)
        search_description += _(' authored by ') + unicode(researcher)
        head_search_description = unicode(researcher)
        context['researcher'] = researcher
        context['researcher_id'] = researcher.id
        context['breadcrumbs'] = researcher.breadcrumbs()
    elif 'department' in args:
        dept = get_object_or_404(Department, pk=args.get('department'))
        queryset = queryset.filter(author__researcher__department=dept)
        search_description = unicode(dept)
        head_search_description = unicode(dept)
        context['department'] = dept
        context['breadcrumbs'] = dept.breadcrumbs() + [(_('Papers'), '')]
    elif 'name' in args:
        name = get_object_or_404(Name, pk=args.get('name'))
        queryset = queryset.filter(author__name=name)
        search_description += _(' authored by ') + unicode(name)
        head_search_description = unicode(name)
        context['name'] = name
    if 'journal' in args:
        journal = get_object_or_404(Journal, pk=args.get('journal'))
        queryset = queryset.filter(oairecord__journal=journal)
        search_description += _(' in ') + unicode(journal)
        context['journal'] = journal
        context['breadcrumbs'] = journal.breadcrumbs()
    elif 'publisher' in args:
        publisher = get_object_or_404(Publisher, pk=args.get('publisher'))
        queryset = queryset.filter(oairecord__publisher=publisher)
        search_description += _(' published by ') + unicode(publisher)
        head_search_description = unicode(publisher)
        context['publisher'] = publisher
        context['breadcrumbs'] = publisher.breadcrumbs() + [(_('Papers'), '')]
    if 'state' in args:
        state = args.get('state')
        context['state'] = state
        state_filter = STATUS_QUERYSET_FILTER.get(state)
        if state_filter is not None:
            queryset = state_filter(queryset)
    if 'status' in args:
        queryset = queryset.filter(oa_status=args.get('status'))
        # We don't update the search description here, it will be displayed on the side
        context['status'] = args.get('status')
    if 'pdf' in args:
        val = args.get('pdf')
        if val == 'OK':
            queryset = queryset.filter(pdf_url__isnull=False)
        elif val == 'NOK':
            queryset = queryset.filter(pdf_url__isnull=True)
        context['pdf'] = val
    if 'pubtype' in args:
        val = args.get('pubtype')
        if val in PAPER_TYPE_PREFERENCE:
            queryset = queryset.filter(doctype=val)
        context['pubtype'] = val
    if 'visibility' in args and is_admin(request.user):
        val = args.get('visibility')
        if val in [x[0] for x in VISIBILITY_CHOICES]:
            queryset = queryset.filter(visibility=val)
        context['visibility'] = val
    else:
        queryset = queryset.filter(visibility='VISIBLE')
        context['visibility'] = 'VISIBLE'

    if search_description == _('Papers'):
        context['breadcrumbs'] = [(search_description, '')]
        search_description = _('All papers')

    # Sort
    queryset = queryset.order_by('-pubdate')
    # Make distinct
    queryset = queryset.distinct()
    # Create stats
    stats = BareAccessStatistics.from_queryset(queryset)

    # Build the paginator
    paginator = Paginator(queryset, NB_RESULTS_PER_PAGE)
    page = args.get('page')
    try:
        current_papers = paginator.page(page)
    except PageNotAnInteger:
        current_papers = paginator.page(1)
    except EmptyPage:
        current_papers = paginator.page(paginator.num_pages)

    context['search_stats'] = stats
    context['search_results'] = current_papers
    context['search_description'] = search_description
    context['head_search_description'] = head_search_description
    context['nb_results'] = paginator.count
    context['ajax_url'] = reverse('ajax-search') + '?' + urlencode(args)

    # Notifications
    # TODO: unefficient query.
    notifications = get_notifications(request)
    selected_messages = map(
        lambda n: n.serialize_to_json(),
        sorted(notifications, key=lambda msg: msg.level)[:3])
    context['messages'] = selected_messages

    # Build the GET requests for variants of the parameters
    args_without_page = args.copy()
    if 'page' in args_without_page:
        del args_without_page['page']
    oa_variants = varyQueryArguments('status', args_without_page,
                                     OA_STATUS_CHOICES)
    pdf_variants = varyQueryArguments('pdf', args_without_page,
                                      PDF_STATUS_CHOICES)
    pubtype_variants = varyQueryArguments('pubtype', args_without_page,
                                          PAPER_TYPE_CHOICES)
    visibility_variants = varyQueryArguments('visibility', args_without_page,
                                             VISIBILITY_CHOICES)
    state_variants = varyQueryArguments('state', args_without_page,
                                        COMBINED_STATUS_CHOICES)

    context['oa_status_choices'] = oa_variants
    context['pdf_status_choices'] = pdf_variants
    context['state_choices'] = state_variants
    context['pubtype_status_choices'] = pubtype_variants
    context['visibility_choices'] = visibility_variants

    if request.META.get(
            'CONTENT_TYPE') == 'application/json' and 'researcher' in context:
        researcher = context['researcher']
        context['request'] = request
        response = {}
        response['listPapers'] = loader.render_to_string(
            'papers/ajaxListPapers.html', context)
        response['stats'] = json.loads(stats.pie_data(researcher.object_id))
        response['stats']['numtot'] = stats.num_tot
        response['messages'] = selected_messages
        if researcher.current_task:
            response['status'] = researcher.current_task
            response['display'] = researcher.get_current_task_display()
        return HttpResponse(json.dumps(response),
                            content_type="application/json")
    return render(request, 'papers/search.html', context)
Example #5
0
def searchView(request, **kwargs):
    """
    Any view that returns a list of papers can be expressed using this "search" view.
    It allows to select a list of papers based on a list of criteria (but no keyword search for now).
    """
    context = dict()
    # Build the queryset
    queryset = Paper.objects.all()
    args = request.GET.copy()
    args.update(kwargs)

    if 'journal' in args and not is_admin(request.user):
        del args['journal']
    
    search_description = _('Papers')
    head_search_description = _('Papers')

    context['researcher_id'] = None
    if 'researcher' in args or 'orcid' in args:
        researcher = None
        if 'researcher' in args:
            researcher = get_object_or_404(Researcher, pk=args.get('researcher'))
        elif 'orcid' in args:
            try:
                researcher = Researcher.objects.get(orcid=args.get('orcid'))
            except Researcher.DoesNotExist:
                try:
                    orcid = validate_orcid(args.get('orcid'))
                    researcher = Researcher.get_or_create_by_orcid(orcid)
                    researcher.init_from_orcid()
                except MetadataSourceException:
                    raise Http404(_('Invalid ORCID profile.'))

        # Redirect if slug doesn't match or researcher is looked up by ORCID.
        if kwargs.get('slug', '') != researcher.slug:
            view_args = {'researcher': researcher.id, 'slug': researcher.slug}
            url = reverse('researcher', kwargs=view_args)
            query_string = request.META.get('QUERY_STRING', '')
            if query_string:
                url += '?' + query_string
            return HttpResponsePermanentRedirect(url)

        queryset = queryset.filter(author__researcher=researcher)
        search_description += _(' authored by ')+unicode(researcher)
        head_search_description = unicode(researcher)
        context['researcher'] = researcher
        context['researcher_id'] = researcher.id
        context['breadcrumbs'] = researcher.breadcrumbs()
    elif 'department' in args:
        dept = get_object_or_404(Department, pk=args.get('department'))
        queryset = queryset.filter(author__researcher__department=dept)
        search_description = unicode(dept)
        head_search_description = unicode(dept)
        context['department'] = dept
        context['breadcrumbs'] = dept.breadcrumbs()+[(_('Papers'), '')]
    elif 'name' in args:
        name = get_object_or_404(Name, pk=args.get('name'))
        queryset = queryset.filter(author__name=name)
        search_description += _(' authored by ')+unicode(name)
        head_search_description = unicode(name)
        context['name'] = name
    if 'journal' in args:
        journal = get_object_or_404(Journal, pk=args.get('journal'))
        queryset = queryset.filter(oairecord__journal=journal)
        search_description += _(' in ')+unicode(journal)
        context['journal'] = journal
        context['breadcrumbs'] = journal.breadcrumbs()
    elif 'publisher' in args:
        publisher = get_object_or_404(Publisher, pk=args.get('publisher'))
        queryset = queryset.filter(oairecord__publisher=publisher)
        search_description += _(' published by ')+unicode(publisher)
        head_search_description = unicode(publisher)
        context['publisher'] = publisher
        context['breadcrumbs'] = publisher.breadcrumbs()+[(_('Papers'),'')]
    if 'state' in args:
        state = args.get('state')
        context['state'] = state
        state_filter = STATUS_QUERYSET_FILTER.get(state)
        if state_filter is not None:
            queryset = state_filter(queryset)
    if 'status' in args:
        queryset = queryset.filter(oa_status=args.get('status'))
        # We don't update the search description here, it will be displayed on the side
        context['status'] = args.get('status')
    if 'pdf' in args:
        val = args.get('pdf')
        if val == 'OK':
            queryset = queryset.filter(pdf_url__isnull=False)
        elif val == 'NOK':
            queryset = queryset.filter(pdf_url__isnull=True)
        context['pdf'] = val
    if 'pubtype' in args:
        val = args.get('pubtype')
        if val in PAPER_TYPE_PREFERENCE:
            queryset = queryset.filter(doctype=val)
        context['pubtype'] = val
    if 'visibility' in args and is_admin(request.user):
        val = args.get('visibility')
        if val in [x[0] for x in VISIBILITY_CHOICES]:
            queryset = queryset.filter(visibility=val)
        context['visibility'] = val
    else:
        queryset = queryset.filter(visibility='VISIBLE')
        context['visibility'] = 'VISIBLE'

    if search_description == _('Papers'):
        context['breadcrumbs'] = [(search_description,'')]
        search_description = _('All papers')

    # Sort
    queryset = queryset.order_by('-pubdate')
    # Make distinct
    queryset = queryset.distinct()
    # Create stats
    stats = BareAccessStatistics.from_queryset(queryset)

    # Build the paginator
    paginator = Paginator(queryset, NB_RESULTS_PER_PAGE)
    page = args.get('page')
    try:
        current_papers = paginator.page(page)
    except PageNotAnInteger:
        current_papers = paginator.page(1)
    except EmptyPage:
        current_papers = paginator.page(paginator.num_pages)

    context['search_stats'] = stats
    context['search_results'] = current_papers
    context['search_description'] = search_description
    context['head_search_description'] = head_search_description
    context['nb_results'] = paginator.count
    context['ajax_url'] = reverse('ajax-search')+'?'+urlencode(args) 

    # Notifications
    # TODO: unefficient query.
    notifications = get_notifications(request)
    selected_messages = map(lambda n: n.serialize_to_json(),
            sorted(notifications, key=lambda msg: msg.level)[:3])
    context['messages'] = selected_messages

    # Build the GET requests for variants of the parameters
    args_without_page = args.copy()
    if 'page' in args_without_page:
        del args_without_page['page']
    oa_variants = varyQueryArguments('status', args_without_page, OA_STATUS_CHOICES)
    pdf_variants = varyQueryArguments('pdf', args_without_page, PDF_STATUS_CHOICES)
    pubtype_variants = varyQueryArguments('pubtype', args_without_page, PAPER_TYPE_CHOICES)
    visibility_variants = varyQueryArguments('visibility', args_without_page, VISIBILITY_CHOICES)
    state_variants = varyQueryArguments('state', args_without_page, COMBINED_STATUS_CHOICES)

    context['oa_status_choices'] = oa_variants
    context['pdf_status_choices'] = pdf_variants
    context['state_choices'] = state_variants
    context['pubtype_status_choices'] = pubtype_variants
    context['visibility_choices'] = visibility_variants

    if request.META.get('CONTENT_TYPE') == 'application/json' and 'researcher' in context:
        researcher = context['researcher']
        context['request'] = request
        response = {}
        response['listPapers'] = loader.render_to_string('papers/ajaxListPapers.html', context)
        response['stats'] = json.loads(stats.pie_data(researcher.object_id))
        response['stats']['numtot'] = stats.num_tot
        response['messages'] = selected_messages
        if researcher.current_task:
            response['status'] = researcher.current_task
            response['display'] = researcher.get_current_task_display()
        return HttpResponse(json.dumps(response), content_type="application/json")
    return render(request, 'papers/search.html', context)