예제 #1
0
def newsearch(request):
    newsearch_fields = []
    preselected_fields = []
    search_config = Config.get_or_create("search")
    for _id, item in search_config.values.iteritems():
        for field in item['fields']:
            if field.get('advanced', False):
                nsf_entry = (field['field'], field['name'], item['type'],
                             field.get('type', 'string'))
                newsearch_fields.append(nsf_entry)
                if field.get('advdef', False):
                    preselected_fields.append((nsf_entry, '', 'AND'))

    newsearch_fields.append(("_ft", "Fulltext (greenstone)", "_ft", "_ft"))

    settings = Config.get_or_create("search_settings")
    default_type = settings.values.get('default_type', '').lower()

    newsearch_fields_dict = dict([(x[0], x) for x in newsearch_fields])

    context = {
        "user": request.user,
        "in_search": True,
        "fields_select_options": newsearch_fields,
        "selected_type": default_type
    }

    if request.method == "POST":
        context['postdata'] = request.POST
        context['selected_type'] = request.POST.get('item_type',
                                                    default_type).lower()
        context['fields_select'] = request.POST.getlist('fields_select')
        context['fields_select'].sort(
            key=lambda x: request.POST.get("order_%s" % x, VERY_BIG_NUMBER))

        def get_post_value(field):
            if newsearch_fields_dict.get(field, [None])[-1] == 'date':
                return [
                    request.POST.get(field + x, '') for x in ("_from", "_to")
                ]
            else:
                return request.POST.get(field, '')

        context['selected_fields'] = \
            [(newsearch_fields_dict.get(field, [None] * 4),
              get_post_value(field),
              request.POST.get("operator_%s" % field, 'AND'))
            for field in context['fields_select']
            if field in newsearch_fields_dict]
        context['raw_query'] = make_advanced_query(request, newsearch_fields)

    if not context.get('selected_fields', []):
        context['selected_fields'] = preselected_fields
        context['fields_select'] = [x[0][0] for x in preselected_fields]

    context['item_types'] = ['revista', 'libro']

    return render_to_response('search/newsearch.html', context)
예제 #2
0
파일: views.py 프로젝트: GaloC/gplib
def newsearch(request):
    newsearch_fields = []
    preselected_fields = []
    search_config = Config.get_or_create("search")
    for _id, item in search_config.values.iteritems():
        for field in item['fields']:
            if field.get('advanced', False):
                nsf_entry = (field['field'], field['name'], item['type'],
                    field.get('type', 'string'))
                newsearch_fields.append(nsf_entry)
                if field.get('advdef', False):
                    preselected_fields.append((nsf_entry, '', 'AND'))

    newsearch_fields.append(("_ft", "Fulltext (greenstone)",
        "_ft", "_ft"))

    settings = Config.get_or_create("search_settings")
    default_type = settings.values.get('default_type', '').lower()

    newsearch_fields_dict = dict([(x[0], x) for x in newsearch_fields])

    context = {"user": request.user, "in_search": True,
        "fields_select_options": newsearch_fields,
        "selected_type": default_type}

    if request.method == "POST":
        context['postdata'] = request.POST
        context['selected_type'] = request.POST.get('item_type',
            default_type).lower()
        context['fields_select'] = request.POST.getlist('fields_select')
        context['fields_select'].sort(key=lambda x: request.POST.get(
            "order_%s" % x, VERY_BIG_NUMBER))

        def get_post_value(field):
            if newsearch_fields_dict.get(field, [None])[-1] == 'date':
                return [request.POST.get(field + x, '')
                    for x in ("_from", "_to")]
            else:
                return request.POST.get(field, '')

        context['selected_fields'] = \
            [(newsearch_fields_dict.get(field, [None] * 4),
              get_post_value(field),
              request.POST.get("operator_%s" % field, 'AND'))
            for field in context['fields_select']
            if field in newsearch_fields_dict]
        context['raw_query'] = make_advanced_query(request, newsearch_fields)

    if not context.get('selected_fields', []):
        context['selected_fields'] = preselected_fields
        context['fields_select'] = [x[0][0] for x in preselected_fields]

    context['item_types'] = ['revista', 'libro']

    return render_to_response('search/newsearch.html', context)
예제 #3
0
파일: views.py 프로젝트: GaloC/gplib
def get_fields(request):
    """
    Returns a json with selected fields in config
    """
    search_config = Config.get_or_create("search")

    items = {}

    for _id, item in search_config.values.iteritems():
        items[_id] = item['fields']
        for field in item['fields']:
            field['field'] = "#index#_" + field['field']

            if not field['filter']:
                del(field['filter'])
            if not field['show']:
                del(field['show'])
            if 'more' in field and not field['more']:
                del(field['more'])
            if 'advanced' in field and not field['advanced']:
                del(field['advanced'])
            if 'advdef' in field and not field['advdef']:
                del(field['advdef'])
            if 'exist' in field and not field['exist']:
                del(field['exist'])

    return HttpResponse(simplejson.dumps(items),
                    mimetype='application/javascript')
예제 #4
0
def query(request):
    host = request.user.tematres_host
    if not host:
        tematres_conf = Config.get_or_create("tematres")
        host = tematres_conf["values"].get("hosts", [None])[0]

    result = []
    if host:
        service = pythree.Service(host)
        if service.info().status == "available":
            query = request.GET.get("term")
            similar = service.similar(query)
            terms = service.search(query)
            result.append({'category': 'similar', 'label': similar})
            i = 0
            for term in terms:
                termdict = {'category': 'terms', 'label': term.string}
                i += 1
                if i < 5:
                    try:
                        termdict['desc'] = term.notes[0].text
                    except IndexError:
                        pass
                result.append(termdict)

    return HttpResponse(simplejson.dumps(result),\
                mimetype='application/javascript')
예제 #5
0
def get_fields(request):
    """
    Returns a json with selected fields in config
    """
    search_config = Config.get_or_create("search")

    items = {}

    for _id, item in search_config.values.iteritems():
        items[_id] = item['fields']
        for field in item['fields']:
            field['field'] = "#index#_" + field['field']

            if not field['filter']:
                del (field['filter'])
            if not field['show']:
                del (field['show'])
            if 'more' in field and not field['more']:
                del (field['more'])
            if 'advanced' in field and not field['advanced']:
                del (field['advanced'])
            if 'advdef' in field and not field['advdef']:
                del (field['advdef'])
            if 'exist' in field and not field['exist']:
                del (field['exist'])

    return HttpResponse(simplejson.dumps(items),
                        mimetype='application/javascript')
예제 #6
0
파일: views.py 프로젝트: GaloC/gplib
def query(request):
    host = request.user.tematres_host
    if not host:
        tematres_conf = Config.get_or_create("tematres")
        host = tematres_conf["values"].get("hosts", [None])[0]

    result = []
    if host:
        service = pythree.Service(host)
        if service.info().status == "available":
            query = request.GET.get("term")
            similar = service.similar(query)
            terms = service.search(query)
            result.append({'category': 'similar', 'label': similar})
            i = 0
            for term in terms:
                termdict = {'category': 'terms',
                    'label': term.string}
                i += 1
                if i < 5:
                    try:
                        termdict['desc'] = term.notes[0].text
                    except IndexError:
                        pass
                result.append(termdict)

    return HttpResponse(simplejson.dumps(result),\
                mimetype='application/javascript')
예제 #7
0
파일: views.py 프로젝트: lujancita/gplib
def greenstone_edit(request):
    from gplib.apps.couchflow.models import Config
    import os.path

    if request.method == "POST":
        conf = Config.get_or_create("greenstone")

        for key in ['host', 'upload_path', 'template']:
            old_val = conf.values.get(key, '')
            conf.values[key] = request.POST.get(key, old_val)

        context = {}
        if not os.path.isdir(conf.values["upload_path"]):
            context['error'] = "Invalid upload path"
        elif not os.access(conf.values["upload_path"], os.W_OK):
            context['error'] = "Can't write to upload path"
        elif conf.values["template"].startswith("/"):
            context['error'] = "Template can't start with /"
        elif not conf.values["template"].endswith(".pdf"):
            context['error'] = "Template must include .pdf extension"

        if 'error' not in context:
            conf.save()

        return greenstone(request, context)
예제 #8
0
파일: webconf.py 프로젝트: GaloC/gplib
def edit_or_create_user(request, user_id=None, form=None, user=None):

    if (((user_id and user_id != request.user.username) or not user_id)
        and not request.user.is_superuser):
        context = {'error': 'No autorizado'}
        return render_to_response('error.html',
            context, context_instance=RequestContext(request))

    if user is None:
        if user_id:
            user = User.view("couchauth/username", key=user_id).one()
            if not user:
                return HttpResponseRedirect('/webconf/couchauth/show_users/')
        else:
            user = User()

    user.password = ''
    if form is None:
        form = UserForm(instance=user)

    if not request.user.is_superuser:
        del form.fields['is_staff']
        del form.fields['is_active']
        del form.fields['is_superuser']

    # Moved out of the main form layout on the template
    del form.fields['photo']

    tematres_conf = Config.get_or_create("tematres")
    hosts = tematres_conf["values"].get("hosts", [])
    form.fields['tematres_host'].widget.choices = map(None, hosts, hosts)

    form_url = "/webconf/couchauth/save_user/%s" % (user_id or '')

    if user_id:
        delete_url = "/webconf/couchauth/delete_user/%s" % (user._id)
        form_title = "Editando usuario: " + user.username
    else:
        delete_url = None
        form_title = "Creando usuario"

    groups = Group.view("couchauth/all_groups")

    if user._attachments and 'photo' in user._attachments:
        photo = "/couchflow/get_attach/couchauth/%s/photo" % (user._id)
    else:
        photo = None

    context = {
        'form': form,
        'userdoc': user,
        'form_title': form_title,
        'form_url': form_url,
        'delete_url': delete_url,
        'groups': groups,
        'photo': photo,
    }
    return render_to_response('webconf/couchauth/form_user.html',
        context, context_instance=RequestContext(request))
예제 #9
0
def admin(request):
    user = request.user
    context = {"user": user}

    wf_items = list(WFItem.view("couchflow/items", include_docs=True))
    save_config(request, wf_items)

    settings = Config.get_or_create("search_settings")
    default_type = settings.values.get('default_type', '')

    if request.method == "POST":
        post_default_type = request.POST.get('default_type', '')
        if post_default_type != default_type:
            settings.values['default_type'] = post_default_type.lower()
            settings.save()
            default_type = post_default_type

    items = []
    for item in wf_items:
        fields = {}
        for _id, ifields in item.fields_properties.iteritems():
            # Just marc fields
            if int(ifields['id']) > 1000:
                continue

            field_name = ifields['id']

            if ifields['list'][0].subfields:
                default_field = {
                    'id': ifields['id'],
                    'name': ifields['field_name'],
                    'subfields': {}
                }

                subfields = fields.setdefault(field_name,
                                              default_field)["subfields"]

                for subfield in ifields['list'][0].subfields.values():
                    sfield_name = '%s_%s' % (ifields['id'],
                                             subfield.field_name)
                    sfield = subfields.setdefault(sfield_name, {})
                    sfield['name'] = subfield.field_name

                fields[field_name]['subfields'] = sorted(subfields.items())
            else:
                fields.setdefault(field_name, {})['id'] = field_name
                fields[field_name]['name'] = ifields.field_name

        items.append((item.name, item._id, sorted(fields.items())))

    context['items'] = items
    context['default_type'] = default_type.lower()

    return render_to_response('search/admin.html', context)
예제 #10
0
파일: views.py 프로젝트: lujancita/gplib
def greenstone(request, context=None):
    from gplib.apps.couchflow.models import Config

    conf = Config.get_or_create("greenstone")

    if not context:
        context = {}

    context['conf'] = conf.values

    return render_to_response('webconf/greenstone.html', context,
        context_instance=RequestContext(request))
예제 #11
0
파일: views.py 프로젝트: GaloC/gplib
def admin(request):
    user = request.user
    context = {"user": user}

    wf_items = list(WFItem.view("couchflow/items", include_docs=True))
    save_config(request, wf_items)

    settings = Config.get_or_create("search_settings")
    default_type = settings.values.get('default_type', '')

    if request.method == "POST":
        post_default_type = request.POST.get('default_type', '')
        if post_default_type != default_type:
            settings.values['default_type'] = post_default_type.lower()
            settings.save()
            default_type = post_default_type

    items = []
    for item in wf_items:
        fields = {}
        for _id, ifields in item.fields_properties.iteritems():
            # Just marc fields
            if int(ifields['id']) > 1000:
                continue

            field_name = ifields['id']

            if ifields['list'][0].subfields:
                default_field = {'id': ifields['id'], 'name':
                            ifields['field_name'],
                            'subfields': {}}

                subfields = fields.setdefault(field_name,
                                default_field)["subfields"]

                for subfield in ifields['list'][0].subfields.values():
                    sfield_name = '%s_%s' % (ifields['id'],
                                        subfield.field_name)
                    sfield = subfields.setdefault(sfield_name, {})
                    sfield['name'] = subfield.field_name

                fields[field_name]['subfields'] = sorted(subfields.items())
            else:
                fields.setdefault(field_name ,{})['id'] = field_name
                fields[field_name]['name'] = ifields.field_name

        items.append((item.name, item._id, sorted(fields.items())))

    context['items'] = items
    context['default_type'] = default_type.lower()

    return render_to_response('search/admin.html', context)
예제 #12
0
파일: views.py 프로젝트: lujancita/gplib
def greenstone_test(request):
    from gplib.apps.couchflow.models import Config
    from gplib.apps.search.utils import greenstone_query

    if request.method == "POST":
        conf = Config.get_or_create("greenstone")
        collection = request.POST.get("collection", "")
        query = request.POST.get("query", "")
        context = {}
        context['results'] = greenstone_query(collection, "", query)
        context['postdata'] = request.POST

        return greenstone(request, context)
예제 #13
0
파일: utils.py 프로젝트: lujancita/gplib
def greenstone_query(collection, lang, string):
    """Wrapper for the function above that depends on the config db"""
    conf = Config.get_or_create("greenstone")
    server_base_url = conf.values.get('host', '')
    if not server_base_url:
        return []
    else:
        try:
            return _greenstone_query(server_base_url, collection, lang, string)
        except WebFault, e:
            print "SOAP WebFault", e
            return []
        except URLError, e:
            print "urlib error", e
            return []
예제 #14
0
파일: utils.py 프로젝트: GaloC/gplib
def greenstone_query(collection, lang, string):
    """Wrapper for the function above that depends on the config db"""
    conf = Config.get_or_create("greenstone")
    server_base_url = conf.values.get('host', '')
    if not server_base_url:
        return []
    else:
        try:
            return _greenstone_query(server_base_url, collection, lang, string)
        except WebFault, e:
            print "SOAP WebFault", e
            return []
        except URLError, e:
            print "urlib error", e
            return []
예제 #15
0
def save_config(request, wf_items):
    """
    Parse request.POST, get field/subfields
    items and save config
    """
    search_config = Config.get_or_create("search")
    if request.method == "POST":
        for wf_item in wf_items:
            item_id = wf_item._id
            item_type = wf_item.item_type

            item_conf = {'type': item_type, 'fields': []}
            fields_conf = item_conf['fields']

            for field in request.POST.getlist(item_id + "_field"):
                index, field_id = field.split('_', 1)

                field_conf = {}

                f_show = request.POST.get("%s_%s_show" % (item_id, index))
                f_filter = request.POST.get("%s_%s_filter" % (item_id, index))
                f_more = request.POST.get("%s_%s_more" % (item_id, index))
                f_adv = request.POST.get("%s_%s_advanced" % (item_id, index))
                f_advdef = request.POST.get("%s_%s_advdef" % (item_id, index))
                f_exist = request.POST.get("%s_%s_exist" % (item_id, index))
                f_name = request.POST.get("%s_%s_name" % (item_id, index))

                if '_' in field_id:
                    main_id, sub_id = field_id.split('_', 1)
                    type = wf_item.fields_properties[main_id].list[0]\
                        .subfields[sub_id].type
                else:
                    type = wf_item.fields_properties[field_id].type

                field_conf['show'] = f_show == "on"
                field_conf['filter'] = f_filter == "on"
                field_conf['more'] = f_more == "on"
                field_conf['advanced'] = f_adv == "on"
                field_conf['advdef'] = f_advdef == "on"
                field_conf['exist'] = f_exist == "on"
                field_conf['name'] = f_name
                field_conf['field'] = field_id
                field_conf['type'] = type

                fields_conf.append(field_conf)

            search_config.values[item_id] = item_conf
        search_config.save()
예제 #16
0
파일: views.py 프로젝트: GaloC/gplib
def save_config(request, wf_items):
    """
    Parse request.POST, get field/subfields
    items and save config
    """
    search_config = Config.get_or_create("search")
    if request.method == "POST":
        for wf_item in wf_items:
            item_id = wf_item._id
            item_type = wf_item.item_type

            item_conf = {'type': item_type, 'fields': []}
            fields_conf = item_conf['fields']

            for field in request.POST.getlist(item_id + "_field"):
                index, field_id = field.split('_', 1)

                field_conf = {}

                f_show = request.POST.get("%s_%s_show" % (item_id, index))
                f_filter = request.POST.get("%s_%s_filter" % (item_id, index))
                f_more = request.POST.get("%s_%s_more" % (item_id, index))
                f_adv = request.POST.get("%s_%s_advanced" % (item_id, index))
                f_advdef = request.POST.get("%s_%s_advdef" % (item_id, index))
                f_exist = request.POST.get("%s_%s_exist" % (item_id, index))
                f_name = request.POST.get("%s_%s_name" % (item_id, index))

                if '_' in field_id:
                    main_id, sub_id = field_id.split('_', 1)
                    type = wf_item.fields_properties[main_id].list[0]\
                        .subfields[sub_id].type
                else:
                    type = wf_item.fields_properties[field_id].type

                field_conf['show'] = f_show == "on"
                field_conf['filter'] = f_filter == "on"
                field_conf['more'] = f_more == "on"
                field_conf['advanced'] = f_adv == "on"
                field_conf['advdef'] = f_advdef == "on"
                field_conf['exist'] = f_exist == "on"
                field_conf['name'] = f_name
                field_conf['field'] = field_id
                field_conf['type'] = type

                fields_conf.append(field_conf)

            search_config.values[item_id] = item_conf
        search_config.save()
예제 #17
0
    def handle(self, *args, **options):
        version = Config.get_or_create("version")
        db_version = version.values.get('db', 0)

        if db_version == 0:
            self.update_0()
            self.create_edit_workflows()
            version.values['db'] = 1
            version.save()
            print "Run it again to update to next db version"
        elif db_version == 1:
            self.update_1()
            version.values['db'] = 2
            version.save()
        elif db_version == 2:
            print 'DB already up to date, db version', db_version
        else:
            print 'Invalid Database Version', db_version
예제 #18
0
파일: views.py 프로젝트: GaloC/gplib
def admin(request):
    user = request.user

    tematres_conf = Config.get_or_create("tematres")
    hosts = tematres_conf["values"].get("hosts", [])
    query = query_server = None

    context = {"user": user, "hosts": hosts, "info": None, "terms": []}

    if request.method == "POST":
        if 'host' in request.POST:
            hosts = list(filter(None, request.POST.getlist("host")))
            tematres_conf["values"]["hosts"] = hosts
            tematres_conf.save()
            context["hosts"] = hosts
        elif 'query' in request.POST:
            query = request.POST.get("query")
            query_server = request.POST.get("query_server")

    if hosts:
        infos = []
        for host in hosts:
            service = pythree.Service(host)
            infos.append((host, service.info()))
        context["infos"] = infos

    if query and query_server:
        service = pythree.Service(query_server)
        if service.info().status == "available":
            similar = service.similar(query)
            terms = service.search(query)
            context["query"] = query
            context["query_server"] = query_server
            context["terms"] = terms
            context["similar"] = similar
        else:
            context["query_error"] = True


    return render_to_response("tematres/admin.html", context)
예제 #19
0
def admin(request):
    user = request.user

    tematres_conf = Config.get_or_create("tematres")
    hosts = tematres_conf["values"].get("hosts", [])
    query = query_server = None

    context = {"user": user, "hosts": hosts, "info": None, "terms": []}

    if request.method == "POST":
        if 'host' in request.POST:
            hosts = list(filter(None, request.POST.getlist("host")))
            tematres_conf["values"]["hosts"] = hosts
            tematres_conf.save()
            context["hosts"] = hosts
        elif 'query' in request.POST:
            query = request.POST.get("query")
            query_server = request.POST.get("query_server")

    if hosts:
        infos = []
        for host in hosts:
            service = pythree.Service(host)
            infos.append((host, service.info()))
        context["infos"] = infos

    if query and query_server:
        service = pythree.Service(query_server)
        if service.info().status == "available":
            similar = service.similar(query)
            terms = service.search(query)
            context["query"] = query
            context["query_server"] = query_server
            context["terms"] = terms
            context["similar"] = similar
        else:
            context["query_error"] = True

    return render_to_response("tematres/admin.html", context)
예제 #20
0
def data(request):
    """
    Returns data for datatables
    """
    user = request.user

    secho = int(request.POST.get('sEcho', 0)) + 1
    return_dict = {
        "aaData": [],
        "iTotalRecords": 0,
        "iTotalDisplayRecords": 0,
        "sEcho": secho
    }
    query = None
    sort = None
    sort_reverse = False
    qfilter = ''
    basic_greenstone = True
    search_config = Config.get_or_create("search")

    if 'raw_query' in request.POST:
        query, sort_raw, query_greenstone = \
            request.POST['raw_query'].split("||", 2)
        if sort_raw:
            sort = sort_raw[1:]
            sort_reverse = (sort_raw[0] == '\\')

        # make_advanced_query() doesn't handle greenstone filtering.
        # Instead, it leaves a placeholder that is replaced here.
        # This is to leave all the querying to the second request
        # (this one), and only lucene query building to the first.

        query = query.replace(
            GREENSTONE_NEWSEARCH_PLACEHOLDER, "(%s)" % (' OR '.join([
                "urn:%s" % x['nodeID']
                for x in greenstone_query("", "", query_greenstone)
            ])))
        basic_greenstone = False

    elif 'filter' in request.POST:
        qfilter = sanitize_lucene(request.POST['filter'])
        qfilter = request.POST['filter']
        reference = request.POST.get('reference', 0)
        filter_item_type = request.POST.get('item_type', None)

        query = make_query(search_config, qfilter, reference, filter_item_type)
    elif 'filtered' in request.POST:
        qfilter = sanitize_lucene(request.POST['filtered'])
        reference = request.POST.get('reference', 0)
        filter_item_type = request.POST.get('item_type', None)

        query = make_query(search_config, qfilter, reference, filter_item_type)

    if not query:
        print "search failed: query = %s" % query
        return HttpResponse(simplejson.dumps(return_dict),\
                    mimetype='application/javascript')

    show_config = {}

    # Result Display Configuration
    for item in search_config.values.values():
        item_type = item['type']

        fields = OrderedDict()
        for field in item['fields']:
            if field['show']:
                more = field.get('more', False)
                existence = field.get('exist', False)
                fields[field['field']] = (field['name'], more, existence)

        show_config[item_type] = fields

    try:
        docs = search('search/by_field',
                      q=query,
                      include_fields="022_a,020_a,urn,_id,existence",
                      limit=133742)
        docs = list(docs)
    except RequestFailed:
        print "search failed: request failed"
        return HttpResponse(simplejson.dumps(return_dict),\
                    mimetype='application/javascript')

    db = get_db('couchflow')

    # group uniq docs by urn
    uniq_docs = {}

    if basic_greenstone:
        greenstone_urns = [
            x['nodeID'] for x in greenstone_query("", "", qfilter)
        ]
        greenstone_docs = db.view("couchflow/by_urn", keys=greenstone_urns)

        for doc in greenstone_docs:
            urn = doc['key']
            uniq_docs.setdefault(urn, {
                'count': 0,
                'id': None,
                "existences": []
            })
            uniq_docs[urn]['id'] = doc['id']
            #uniq_docs[urn]['count'] += 1
            uniq_docs[urn]['greenstone'] = True

    for doc in docs:
        try:
            urn = doc['fields']['urn']
        except KeyError:
            urn = None

        if urn is None or urn == 'undefined':
            print "Item should have urn", doc['id']
            continue

        # TODO: check if should be a list
        if type(urn) is list:
            urn = urn[0]

        uniq_docs.setdefault(urn, {'count': 0, 'id': None, "existences": []})
        if doc['fields']['existence'] != "false":
            uniq_docs[urn]['existences'].append(doc['id'])
            uniq_docs[urn]['count'] += 1
        else:
            uniq_docs[urn]['id'] = doc['id']

    columns = []

    start = int(request.POST['iDisplayStart'])
    length = int(request.POST['iDisplayLength'])

    #sort_col = int(request.POST['iSortCol_0'])
    #sort_dir = request.POST['sSortDir_0']

    count = len([u for u in uniq_docs.values() if u["id"]])

    sorted_uniq_docs = uniq_docs.values()
    if basic_greenstone:
        sorted_uniq_docs.sort(key=lambda x: 'greenstone' not in x)

    keys = [doc['id'] for doc in sorted_uniq_docs[start:start + length]]
    keys_exist = [doc['existences']\
            for doc in sorted_uniq_docs[start:start+length]]
    keys_exist = [item for sublist in keys_exist for item in sublist]

    def _get_field(field, doc):
        subfield = ""
        if '_' in field:
            field, subfield = field.split('_')

        #field_value = doc.fields_properties.get(field, None)
        try:
            field_value = doc["fields_properties"][field]
        except KeyError:
            field_value = ""

        if field_value and len(field_value['list']):
            field_value = field_value['list'][0]
            if subfield:
                field_value = field_value['subfields'].get(subfield, "")

            if field_value and 'exec_value' in field_value and field_value[
                    'exec_value']:
                exec_val = field_value['exec_value'][0]
                if not isinstance(exec_val, basestring):
                    if exec_val == None:
                        exec_val = ""
                    exec_val = str(exec_val)
                return exec_val
        return ""

    # get existences
    existences = {}
    for doc in db.view('_all_docs', keys=keys_exist, include_docs=True):
        existences[doc["doc"]["_id"]] = doc["doc"]

    for doc in db.view('_all_docs', keys=keys, include_docs=True):
        #doc = WFItem.wrap(doc['doc'])
        if not "doc" in doc:
            continue
        doc = doc["doc"]

        show_item_config = show_config.get(doc['item_type'], None)
        if not show_item_config:
            print 'Search config missing for', doc['item_type']
            continue

        try:
            img_name = doc['fields_properties']['5000']['list'][0][
                'exec_value'][0]
        except Exception, error:
            print 'Image not found', error
            img_name = 'none.png'

        img_path = "/couchflow/get_attach/couchflow/%s/%s" % (doc['_id'],
                                                              img_name)
        row = [doc['_id'], '<img style="width:80px" src="%s"/>' % img_path]

        data = ''
        for field, (name, more, existence) in show_item_config.iteritems():
            if existence: continue
            field_value = _get_field(field, doc)
            if not field_value:
                continue
            row_value = '%s: %s' % (name, field_value)

            row_value = row_value.replace('/', '').replace(',', '')
            more_class = ' class="search_more"' if more else ''
            data += '<div%s>%s</div>' % (more_class, row_value)

        doc_urn = get_urn(doc)
        if not doc_urn:
            print "Invalid Item, need a urn", doc["_id"]
            continue

        if not doc['reference']:
            data += 'Disponibles: %s<br>' % uniq_docs[doc_urn]['count']

        if uniq_docs[doc_urn]["existences"]:
            data += "<br><h3 class='search_more'>Ejemplares</h3>"
        # Add Existences
        for e in uniq_docs[doc_urn]["existences"]:
            if existences.get(e, False):
                data += "<div id='%s' class='existence search_more'>" % e
                for field, (name, more, exist_conf) in\
                        show_item_config.iteritems():
                    if exist_conf:
                        field_value = _get_field(field, existences[e])
                        if not field_value:
                            field_value = ""

                        row_value = '%s: %s' % (name, field_value)
                        row_value = row_value.replace('/', '').replace(',', '')
                        more_class = ' class="search_more"' if more else ''
                        data += '<div%s>%s</div>' % (more_class, row_value)
                data += "</div>"

        row.append(data)
        row.append('')

        sort_value = None
        if sort:
            sort_value = _get_field(sort, doc)

        columns.append((sort_value, row))
예제 #21
0
파일: views.py 프로젝트: GaloC/gplib
def data(request):
    """
    Returns data for datatables
    """
    user = request.user

    secho = int(request.POST.get('sEcho', 0)) + 1
    return_dict = {"aaData": [], "iTotalRecords":0,
            "iTotalDisplayRecords":0, "sEcho": secho}
    query = None
    sort = None
    sort_reverse = False
    qfilter = ''
    basic_greenstone = True
    search_config = Config.get_or_create("search")

    if 'raw_query' in request.POST:
        query, sort_raw, query_greenstone = \
            request.POST['raw_query'].split("||", 2)
        if sort_raw:
            sort = sort_raw[1:]
            sort_reverse = (sort_raw[0] == '\\')

        # make_advanced_query() doesn't handle greenstone filtering.
        # Instead, it leaves a placeholder that is replaced here.
        # This is to leave all the querying to the second request
        # (this one), and only lucene query building to the first.

        query = query.replace(GREENSTONE_NEWSEARCH_PLACEHOLDER,
            "(%s)" % (' OR '.join(["urn:%s" % x['nodeID'] for x in
            greenstone_query("", "", query_greenstone)])))
        basic_greenstone = False

    elif 'filter' in request.POST:
        qfilter = sanitize_lucene(request.POST['filter'])
        qfilter = request.POST['filter']
        reference = request.POST.get('reference', 0)
        filter_item_type = request.POST.get('item_type', None)

        query = make_query(search_config, qfilter, reference, filter_item_type)
    elif 'filtered' in request.POST:
        qfilter = sanitize_lucene(request.POST['filtered'])
        reference = request.POST.get('reference', 0)
        filter_item_type = request.POST.get('item_type', None)

        query = make_query(search_config, qfilter, reference, filter_item_type)

    if not query:
        print "search failed: query = %s" % query
        return HttpResponse(simplejson.dumps(return_dict),\
                    mimetype='application/javascript')

    show_config = {}

    # Result Display Configuration
    for item in search_config.values.values():
        item_type = item['type']

        fields = OrderedDict()
        for field in item['fields']:
            if field['show']:
                more = field.get('more', False)
                existence = field.get('exist', False)
                fields[field['field']] = (field['name'], more, existence)

        show_config[item_type] = fields

    try:
        docs = search('search/by_field', q=query,
                include_fields="022_a,020_a,urn,_id,existence",
                                  limit=133742)
        docs = list(docs)
    except RequestFailed:
        print "search failed: request failed"
        return HttpResponse(simplejson.dumps(return_dict),\
                    mimetype='application/javascript')

    db = get_db('couchflow')

    # group uniq docs by urn
    uniq_docs = {}

    if basic_greenstone:
        greenstone_urns = [x['nodeID'] for x in greenstone_query("", "", qfilter)]
        greenstone_docs = db.view("couchflow/by_urn", keys=greenstone_urns)

        for doc in greenstone_docs:
            urn = doc['key']
            uniq_docs.setdefault(urn, {'count':0, 'id': None, "existences": []})
            uniq_docs[urn]['id'] = doc['id']
            #uniq_docs[urn]['count'] += 1
            uniq_docs[urn]['greenstone'] = True

    for doc in docs:
        try:
            urn = doc['fields']['urn']
        except KeyError:
            urn = None

        if urn is None or urn == 'undefined':
            print "Item should have urn", doc['id']
            continue

        # TODO: check if should be a list
        if type(urn) is list:
            urn = urn[0]

        uniq_docs.setdefault(urn, {'count':0, 'id': None, "existences": []})
        if doc['fields']['existence'] != "false":
            uniq_docs[urn]['existences'].append(doc['id'])
            uniq_docs[urn]['count'] += 1
        else:
            uniq_docs[urn]['id'] = doc['id']

    columns = []

    start = int(request.POST['iDisplayStart'])
    length = int(request.POST['iDisplayLength'])

    #sort_col = int(request.POST['iSortCol_0'])
    #sort_dir = request.POST['sSortDir_0']

    count = len([u for u in uniq_docs.values() if u["id"]])

    sorted_uniq_docs = uniq_docs.values()
    if basic_greenstone:
        sorted_uniq_docs.sort(key=lambda x: 'greenstone' not in x)

    keys = [doc['id'] for doc in sorted_uniq_docs[start:start+length]]
    keys_exist = [doc['existences']\
            for doc in sorted_uniq_docs[start:start+length]]
    keys_exist = [item for sublist in keys_exist for item in sublist]

    def _get_field(field, doc):
        subfield = ""
        if '_' in field:
            field, subfield = field.split('_')

        #field_value = doc.fields_properties.get(field, None)
        try:
            field_value = doc["fields_properties"][field]
        except KeyError:
            field_value = ""

        if field_value and len(field_value['list']):
            field_value = field_value['list'][0]
            if subfield:
                field_value = field_value['subfields'].get(subfield, "")

            if field_value and 'exec_value' in field_value and field_value['exec_value']:
                exec_val = field_value['exec_value'][0]
                if not isinstance(exec_val, basestring):
                    if exec_val == None:
                        exec_val = ""
                    exec_val = str(exec_val)
                return exec_val
        return ""

    # get existences
    existences = {}
    for doc in db.view('_all_docs', keys=keys_exist, include_docs=True):
        existences[doc["doc"]["_id"]] = doc["doc"]

    for doc in db.view('_all_docs', keys=keys, include_docs=True):
        #doc = WFItem.wrap(doc['doc'])
        if not "doc" in doc:
            continue
        doc = doc["doc"]

        show_item_config = show_config.get(doc['item_type'], None)
        if not show_item_config:
            print 'Search config missing for', doc['item_type']
            continue

        try:
            img_name = doc['fields_properties']['5000']['list'][0]['exec_value'][0]
        except Exception, error:
            print 'Image not found', error
            img_name = 'none.png'

        img_path = "/couchflow/get_attach/couchflow/%s/%s" % (doc['_id'], img_name)
        row = [doc['_id'], '<img style="width:80px" src="%s"/>' % img_path]

        data = ''
        for field, (name, more, existence) in show_item_config.iteritems():
            if existence: continue
            field_value = _get_field(field, doc)
            if not field_value:
                continue
            row_value = '%s: %s' % (name, field_value)

            row_value = row_value.replace('/', '').replace(',', '')
            more_class = ' class="search_more"' if more else ''
            data += '<div%s>%s</div>' % (more_class, row_value)

        doc_urn = get_urn(doc)
        if not doc_urn:
            print "Invalid Item, need a urn", doc["_id"]
            continue

        if not doc['reference']:
            data += 'Disponibles: %s<br>' % uniq_docs[doc_urn]['count']

        if uniq_docs[doc_urn]["existences"]:
            data += "<br><h3 class='search_more'>Ejemplares</h3>"
        # Add Existences
        for e in uniq_docs[doc_urn]["existences"]:
            if existences.get(e, False):
                data += "<div id='%s' class='existence search_more'>" % e
                for field, (name, more, exist_conf) in\
                        show_item_config.iteritems():
                    if exist_conf:
                        field_value = _get_field(field, existences[e])
                        if not field_value:
                            field_value = ""

                        row_value = '%s: %s' % (name, field_value)
                        row_value = row_value.replace('/', '').replace(',', '')
                        more_class = ' class="search_more"' if more else ''
                        data += '<div%s>%s</div>' % (more_class, row_value)
                data += "</div>"

        row.append(data)
        row.append('')

        sort_value = None
        if sort:
            sort_value = _get_field(sort, doc)

        columns.append((sort_value, row))
예제 #22
0
파일: views.py 프로젝트: GaloC/gplib
def reference_complete(request):
    """
    Returns data for reference complete
    """

    query = request.GET.get("term")
    qfilter = sanitize_lucene(query)
    search_config = Config.get_or_create("search")
    # autoridades
    query = make_query(search_config, qfilter, True, "05a721a33096563ec44d8da885fa1a30")

    show_config = {}

    result = []

    # Result Display Configuration
    for item in search_config.values.values():
        item_type = item['type']

        fields = OrderedDict()
        for field in item['fields']:
            if field['show']:
                more = field.get('more', False)
                fields[field['field']] = (field['name'], more)

        show_config[item_type] = fields

    try:
        docs = search('search/by_field', q=query,
                include_fields="022_a,020_a,urn,_id",
                                  limit=133742)
        docs = list(docs)
    except RequestFailed:
        print "Fail!"
        print "QQ", query

    # group uniq docs by urn
    uniq_docs = {}

    for doc in docs:
        try:
            urn = doc['fields']['urn']
        except KeyError:
            print "Item should have urn"
            continue

        # TODO: check if should be a list
        if type(urn) is list:
            urn = urn[0]

        uniq_docs.setdefault(urn, {'count':0, 'id': None})
        uniq_docs[urn]['id'] = doc['id']
        uniq_docs[urn]['count'] += 1

    db = get_db('couchflow')
    keys = [doc['id'] for doc in uniq_docs.values()]

    def _get_field(field, doc):
        subfield = ""
        if '_' in field:
            field, subfield = field.split('_')

        #field_value = doc.fields_properties.get(field, None)
        try:
            field_value = doc["fields_properties"][field]
        except KeyError:
            field_value = ""

        if field_value and len(field_value['list']):
            field_value = field_value['list'][0]
            if subfield:
                field_value = field_value['subfields'].get(subfield, "")

            if field_value and 'exec_value' in field_value and field_value['exec_value']:
                exec_val = field_value['exec_value'][0]
                if not isinstance(exec_val, basestring):
                    if exec_val == None:
                        exec_val = ""
                    exec_val = str(exec_val)
                return exec_val
        return ""

    for doc in db.view('_all_docs', keys=keys, include_docs=True):
        #doc = WFItem.wrap(doc['doc'])
        doc = doc["doc"]

        show_item_config = show_config.get(doc['item_type'], None)
        if not show_item_config:
            print 'Unknown', doc['item_type']
            continue

        field = _get_field('700_a', doc)
        result.append({'label': field})
        #data = ''
        #for field, (name, more) in show_item_config.iteritems():
        #    row_value = '%s: %s' % (name, _get_field(field, doc))

        #    row_value = row_value.replace('/', '').replace(',', '')
        #    data += '<div>%s</div>' %  row_value

        #doc_urn = get_urn(doc)
        #if not doc_urn:
        #    print "Invalid Item, need a urn", doc["_id"]
        #    continue

        #result.append(data)

    return HttpResponse(simplejson.dumps(result),\
                    mimetype='application/javascript')
예제 #23
0
def reference_complete(request):
    """
    Returns data for reference complete
    """

    query = request.GET.get("term")
    qfilter = sanitize_lucene(query)
    search_config = Config.get_or_create("search")
    # autoridades
    query = make_query(search_config, qfilter, True,
                       "05a721a33096563ec44d8da885fa1a30")

    show_config = {}

    result = []

    # Result Display Configuration
    for item in search_config.values.values():
        item_type = item['type']

        fields = OrderedDict()
        for field in item['fields']:
            if field['show']:
                more = field.get('more', False)
                fields[field['field']] = (field['name'], more)

        show_config[item_type] = fields

    try:
        docs = search('search/by_field',
                      q=query,
                      include_fields="022_a,020_a,urn,_id",
                      limit=133742)
        docs = list(docs)
    except RequestFailed:
        print "Fail!"
        print "QQ", query

    # group uniq docs by urn
    uniq_docs = {}

    for doc in docs:
        try:
            urn = doc['fields']['urn']
        except KeyError:
            print "Item should have urn"
            continue

        # TODO: check if should be a list
        if type(urn) is list:
            urn = urn[0]

        uniq_docs.setdefault(urn, {'count': 0, 'id': None})
        uniq_docs[urn]['id'] = doc['id']
        uniq_docs[urn]['count'] += 1

    db = get_db('couchflow')
    keys = [doc['id'] for doc in uniq_docs.values()]

    def _get_field(field, doc):
        subfield = ""
        if '_' in field:
            field, subfield = field.split('_')

        #field_value = doc.fields_properties.get(field, None)
        try:
            field_value = doc["fields_properties"][field]
        except KeyError:
            field_value = ""

        if field_value and len(field_value['list']):
            field_value = field_value['list'][0]
            if subfield:
                field_value = field_value['subfields'].get(subfield, "")

            if field_value and 'exec_value' in field_value and field_value[
                    'exec_value']:
                exec_val = field_value['exec_value'][0]
                if not isinstance(exec_val, basestring):
                    if exec_val == None:
                        exec_val = ""
                    exec_val = str(exec_val)
                return exec_val
        return ""

    for doc in db.view('_all_docs', keys=keys, include_docs=True):
        #doc = WFItem.wrap(doc['doc'])
        doc = doc["doc"]

        show_item_config = show_config.get(doc['item_type'], None)
        if not show_item_config:
            print 'Unknown', doc['item_type']
            continue

        field = _get_field('700_a', doc)
        result.append({'label': field})
        #data = ''
        #for field, (name, more) in show_item_config.iteritems():
        #    row_value = '%s: %s' % (name, _get_field(field, doc))

        #    row_value = row_value.replace('/', '').replace(',', '')
        #    data += '<div>%s</div>' %  row_value

        #doc_urn = get_urn(doc)
        #if not doc_urn:
        #    print "Invalid Item, need a urn", doc["_id"]
        #    continue

        #result.append(data)

    return HttpResponse(simplejson.dumps(result),\
                    mimetype='application/javascript')
예제 #24
0
def edit_or_create_user(request, user_id=None, form=None, user=None):

    if (((user_id and user_id != request.user.username) or not user_id)
            and not request.user.is_superuser):
        context = {'error': 'No autorizado'}
        return render_to_response('error.html',
                                  context,
                                  context_instance=RequestContext(request))

    if user is None:
        if user_id:
            user = User.view("couchauth/username", key=user_id).one()
            if not user:
                return HttpResponseRedirect('/webconf/couchauth/show_users/')
        else:
            user = User()

    user.password = ''
    if form is None:
        form = UserForm(instance=user)

    if not request.user.is_superuser:
        del form.fields['is_staff']
        del form.fields['is_active']
        del form.fields['is_superuser']

    # Moved out of the main form layout on the template
    del form.fields['photo']

    tematres_conf = Config.get_or_create("tematres")
    hosts = tematres_conf["values"].get("hosts", [])
    form.fields['tematres_host'].widget.choices = map(None, hosts, hosts)

    form_url = "/webconf/couchauth/save_user/%s" % (user_id or '')

    if user_id:
        delete_url = "/webconf/couchauth/delete_user/%s" % (user._id)
        form_title = "Editando usuario: " + user.username
    else:
        delete_url = None
        form_title = "Creando usuario"

    groups = Group.view("couchauth/all_groups")

    if user._attachments and 'photo' in user._attachments:
        photo = "/couchflow/get_attach/couchauth/%s/photo" % (user._id)
    else:
        photo = None

    context = {
        'form': form,
        'userdoc': user,
        'form_title': form_title,
        'form_url': form_url,
        'delete_url': delete_url,
        'groups': groups,
        'photo': photo,
    }
    return render_to_response('webconf/couchauth/form_user.html',
                              context,
                              context_instance=RequestContext(request))